web-dev-qa-db-ja.com

Android、他のアプリが起動されたことを検出

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

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

私はそれの残りをやって大丈夫です、ちょうどパート2は私を困惑させ、ブロードキャストインテントなどを読んで、私の試用プロジェクトで「Android.intent.action.MAIN」などを聴こうとすると、私はできません私以外のアプリが起動されたことを検出するようです。

誰でも助けることができますか?開始する意図をブロードキャストする新しいアプリを探す際に正しい方法で行っていますか、または新しい意図のシステムログを読んでいるか、ネイティブコードで何かをしている必要がありますか?

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

89
Ian

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();
    }

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

33
M.Movaffagh

それを行う仕掛けの方法は、チェックするタイミングループのあるサービスを使用することです

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

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

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

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

19
Aimeric

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

できることは ランチャーの交換 です。ユーザーが同意した場合。

12
Pontus Gagge
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 start(またはデバイスのブート)でThreadApplicationを実行します。

new CheckRunningActivity().start();

更新:このクラスにはAndroid.permission.GET_TASKS許可、マニフェストに次の行を追加します。

<uses-permission Android:name="Android.permission.GET_TASKS" />
12

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

暗黙的な意図は、「誰かがこのビデオを再生します」と言いたいときにAndroidはその意図を処理できるアプリを選びます。

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

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

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

できることの1つは、特定のアプリ開発者と協力してセキュリティシステムに意図を転送することですが、それはおそらく対処したくないことです。

10

getRunningTasks()は、Android L.

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

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

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

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

7
Plo_Koon

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

3
Jacob Malliet