9

アプリケーションがバックグラウンドで実行され、ユーザーが別のアプリケーションを起動したことを検出して、そこからフローを制御できるアプリケーションを構築しようとしています。私のクエリを説明するために、例を挙げたいと思います。私のアプリケーションはバックグラウンドで (たとえばサービスとして) 実行されており、ユーザーはアプリケーション 'XYZ' をクリックしたところです。私のアプリは、アプリ「XYZ」が起動されたことを検出できますか? 'XYZ's Activity がフォアグラウンドに来たかどうかを検出するだけでなく、'XYZ' が起動されたかどうかを検出したいと考えています。誰かが「Whatsapp Messenger」を起動したとします。「Whatsapp Messenger」が起動されたことを自分のアプリが認識できるかどうかを知りたいです。

編集 : 多くの人が私がマルウェアを作成しようとしていると考えていますが、そうではありません。高校のプロジェクト用のアプリを作成しようとしています。サイケ プロジェクトの一環として、自分のカメラをどのくらいの頻度で使用するかを統計で確認したいと考えています。:/

前もってありがとう、スミット。

4

4 に答える 4

3

はい、Logcatを追跡することで、起動されたアプリケーションを見つけることができます。info -I logを使用してActivityManager タグを追跡するだけです。

adb shell コマンドからは、

adb logcat ActivityManager:I *:S

アプリケーションコードから、

logcat ActivityManager:I *:S

Logcat では、次のような行を見つけることができます。

I/ActivityManager(  585): Starting activity: Intent { action=android.intent.action...}

アプリケーションがいつ起動されるか。

メッセージが優先度レベル「I」とタグ「ActivityManager」に関連していることを示す logcat 出力です。

アップデート:

アプリケーションのマニフェスト ファイルにアクセス許可を追加するだけで、

android.permission.READ_LOGS
于 2012-07-05T14:46:42.167 に答える
1

Google Play で「アプリ プロテクター」アプリケーションを確認する必要があると思います。ユーザーが別のアプリケーションを起動したことを検出します。これは、システム ログを読み取ることによって行われます。デバイスでアプリケーションを起動した後、LogCat を開いてログを読み取ってみてください。あなたは驚かれることでしょう。

そして、そこからどこへ行くべきですか?LogCatアプリを試す必要があると思います 。フリーンでオープンソースです。これにより、実際にログを読み取ることができます。

ただし、一部の開発者は、これらすべてを Android のセキュリティ違反と見なしています。

于 2012-07-05T14:46:28.900 に答える
1

他のアプリケーションが起動したかどうかを検出できるサービスを作成しました。ダイアラー用に作りました。同様に、これは任意のパッケージ名に置き換えることができます。

@Override
public int onStartCommand(Intent intent, int flags, int startId){
    Toast.makeText(this,"Service Started", Toast.LENGTH_LONG).show();

    final String str = "";
    Timer timer  =  new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {
        int phonelaunched = 0,phoneclosed =0;
        int phonelaunches = 1;
        @Override
        public void run() {
            ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am.getRunningAppProcesses();

            for ( ActivityManager.RunningAppProcessInfo appProcess: runningAppProcessInfo ) {
                Log.d(appProcess.processName.toString(),"is running");
                if (appProcess.processName.equals("com.android.dialer")) {
                    if ( appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND  /*isForeground(getApplicationContext(),runningAppProcessInfo.get(i).processName)*/){
                        if (phonelaunched == 0 ){
                            phonelaunched = 1;
                            Log.d(str,"dude phone has been launched");
                        }
                        else if (phoneclosed == 1){
                            phonelaunches++;
                            phoneclosed = 0;
                            Log.d(String.valueOf(phonelaunches),"dude that was counter");
                        }
                    }
                    else {
                        phoneclosed = 1;
                        Log.d(str,"dude phone has been closed");

                    }
                }
            }
        }
    },2000,3000);

    return START_STICKY;
}

ここでは、実行中のすべてのタスクを調べて、それが目的のアプリケーションであるかどうかを確認します。その場合、アプリケーションがフォアグラウンドであり、「phonelaunched」変数を使用してアプリケーションが起動されないかどうかを確認します。phoneclosed は、目的のアプリケーションがバックグラウンドにあり、それに応じて変数が設定されている場合に使用されます。

これはすべてServiceクラスに実装されています

于 2015-07-13T10:28:21.797 に答える
-1

私の本では、あなたが質問を提起した方法で、それはあなたのサービスが制御する特定の方法でアプリをハイジャックし、マルウェアのジンクスに接しているように聞こえます. ただし、Android では機能しません。各アプリケーションの権限が異なるため、単純明快です。これにより、各アプリは互いに分離されます。あなたの質問に率直に答えると、No.

他の回答が示唆したように、logcat を監視できますが、もう一度...なぜですか?

于 2012-07-05T14:46:54.377 に答える