100

ユーザーがパスワードなしで指定されたアプリにアクセスできないようにするアプリを開発しようとしています。シナリオは...

  1. ユーザーが「メール」アプリをクリックする(例)
  2. 私のアプリはアプリの起動を検出します
  3. 私のアプリはそれが「メール」アプリであることを確認します
  4. 私のアプリは上部にビューを開き、パスワードを要求します
  5. ユーザーがパスワードを入力します。正しい場合、私のアプリは消え、「メール」アプリが一番上に残ります

残りの作業は大丈夫です。パート2だけで困惑します。何日も放送インテントなどを読んで、トライアルプロジェクトで「android.intent.action.MAIN」などを聴こうとするとできません。私以外のアプリが起動したことを検出しているようです。

誰か助けてもらえますか?開始するインテントをブロードキャストする新しいアプリを探すのに正しい方法で進んでいますか、それとも新しいインテントのシステムログを読み取るか、ネイティブコードで何かを行う必要がありますか?

あなたがそれに完全に答えることができなくても、どんなポインタも助けになるでしょう、私はもう少し研究をすることができるでしょう。どうもありがとう。イアン

4

7 に答える 7

34

logcat その出力を使用して分析できると思います。

すべての同様のプログラムで、私はこの許可を見つけました:

android.permission.READ_LOGS

それは彼ら全員がそれを使用していることを意味しますが、プログラムが開始し、その後、私たちのプログラム(アプリプロテクター)が開始して前面に出てくるようです。

以下のコードを使用してください:

try
    {
        Process mLogcatProc = null;
        BufferedReader reader = null;
        mLogcatProc = Runtime.getRuntime().exec(new String[]{"logcat", "-d"});

        reader = new BufferedReader(new InputStreamReader(mLogcatProc.getInputStream()));

        String line;
        final StringBuilder log = new StringBuilder();
        String separator = System.getProperty("line.separator"); 

        while ((line = reader.readLine()) != null)
        {
            log.append(line);
            log.append(separator);
        }
        String w = log.toString();
        Toast.makeText(getApplicationContext(),w, Toast.LENGTH_LONG).show();
    }
    catch (Exception e) 
    {
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }

そして、マニフェストファイルにその許可を追加することを忘れないでください。

于 2011-08-30T07:18:07.507 に答える
21

それを行うためのぎこちない方法は、チェックする時限ループを備えたサービスを持つことです

ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

そのリストを調べて、電話で何が実行されているかを確認します。これで、idとprocessNameを使用してそれらを識別できるようになりました。したがって、標準的なアクティビティの場合、区別が難しいものをすべて停止しない限り、カスタムアクティビティではこれは簡単です...

注:これは実際に画面に表示されているもののリストではなく、実行されているもののリストです...ちょっとあなたの目標を無効にするかもしれませんが、少なくとも何かが実行され始めたときはわかります...それはその中にあり続けますただし、バックグラウンドでもリストします。

パスワードについては、保護されているアプリなどを見つけたときにアクティビティを開始できます。

于 2010-11-10T20:25:37.430 に答える
13
class CheckRunningActivity extends Thread{
    ActivityManager am = null;
    Context context = null;

    public CheckRunningActivity(Context con){
        context = con;
        am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    }

    public void run(){
        Looper.prepare();

        while(true){
            // Return a list of the tasks that are currently running,
            // with the most recent being first and older ones after in order.
            // Taken 1 inside getRunningTasks method means want to take only
            // top activity from stack and forgot the olders.
            List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);

            String currentRunningActivityName = taskInfo.get(0).topActivity.getClassName();

            if (currentRunningActivityName.equals("PACKAGE_NAME.ACTIVITY_NAME")) {
                // show your activity here on top of PACKAGE_NAME.ACTIVITY_NAME
            }
        }
        Looper.loop();
    }
}

現在実行中のファイルを取得して、これがアプリケーションに対応しているActivityかどうかを確認でき ます。ActivityEmail

起動時(またはデバイスの起動時)に実行CheckRunningActivity Threadします。Application

new CheckRunningActivity().start();

更新: このクラスにはandroid.permission.GET_TASKS権限が必要なので、マニフェストに次の行を追加します。

<uses-permission android:name="android.permission.GET_TASKS" />
于 2014-03-10T14:48:59.340 に答える
12

私はこれが不可能だと思い、願っています。そのような機能が悪意のあるソフトウェアによっていかに簡単に悪用される可能性があるかを検討してください。自分に向けられたインテントとブロードキャストされたインテントを聞くことができますが、アプリケーションの起動はブロードキャストイベントであってはなりません。

あなたができるかもしれないことはランチャーを交換することです。ユーザーがそれに同意した場合。

于 2010-07-20T14:33:21.227 に答える
11

主な問題は、ランチャー(ホーム画面)が通常明示的なインテントを使用しているときに、暗黙的なインテントをリッスンしようとしていることです。

暗黙の意図とは、「誰かがこの動画を再生する」と言いたいときに、Androidがその意図を処理できるアプリを選択することです。

明示的な意図は、ホーム画面の「Eメール」アイコンをクリックしたときに何が起こるかです。具体的には、完全修飾名(com.android.mailなど)でその特定のアプリを開くようにAndroidに指示しています。

AFAIKがそのような明示的な意図を傍受する方法はありません。これはAndroidに組み込まれているセキュリティ対策であり、2つのアクティビティが同じ完全修飾パッケージ名を持つことはできません。これにより、サードパーティがアプリのクローンを作成してそのアプリになりすますことを防ぎます。やりたいことが可能であれば、理論的には、競合他社のすべてのアプリの動作をブロックする可能性のあるアプリをインストールできます。

あなたがやろうとしていることは、Androidのセキュリティモデルに反します。

あなたができることの1つは、特定のアプリ開発者と提携してインテントをセキュリティシステムに転送することですが、それはおそらくあなたが扱いたいことではありません。

于 2010-07-20T14:33:00.710 に答える
8

getRunningTasks()AndroidLでは非推奨です。

アプリの使用統計を取得するには、 android.app.usageパッケージのUsageStatsクラスを使用できます。

新しいアプリ使用統計APIを使用すると、アプリ開発者はアプリケーションの使用に関連する統計を収集できます。このAPIは、非推奨のgetRecentTasks()メソッドよりも詳細な使用法情報を提供します。

このAPIを使用するには、最初android.permission.PACKAGE_USAGE_STATSにマニフェストで権限を宣言する必要があります。ユーザーは、を介してこのアプリへのアクセスも有効にする必要がありますSettings > Security > Apps with usage access

これは、アプリ使用統計APIを使用して、ユーザーがアプリケーションの使用に関連する統計を収集できるようにする方法を示す基本的なアプリの例です

于 2015-09-06T14:00:54.853 に答える
4

おそらく、バックグラウンドで常に実行されるサービスが必要です。あなたのサービスにあなたが言ったことをさせるよりも。カテゴリandroid.intent.category.LAUNCHERでもandroid.intent.action.MAINをリッスンします。次に、そのブロードキャストレシーバーにonReceiveメソッドをオーバーライドさせ、アプリケーションの名前などを確認します。

于 2010-07-20T14:33:07.323 に答える