簡體   English   中英

Android,檢測何時啟動其他應用

[英]Android, Detect when other apps are launched

我正在嘗試開發一個阻止用戶在沒有密碼的情況下進入指定應用程序的應用程序。 情況是...

  1. 用戶點擊“電子郵件”應用程序(例如)
  2. 我的應用檢測到應用啟動
  3. 我的應用程序確認它是“電子郵件”應用程序
  4. 我的應用在頂部打開一個視圖,要求輸入密碼
  5. 用戶輸入密碼,如果正確,我的應用程序消失,將“電子郵件”應用程序放在頂部

我可以做其余的事情,只是第2部分讓我感到困惑,並且經過許多天閱讀了《廣播意圖》等並嘗試在我的試用項目中收聽“ android.intent.action.MAIN”等之后,似乎可以檢測到我的應用以外的其他應用何時啟動。

有人可以幫忙嗎? 我是否正在尋找正確的方式,尋找新的應用程序來廣播啟動意圖,還是應該在系統日志中讀取新的意圖,還是應該使用本機代碼執行某些操作?

任何指點都會有所幫助,即使您無法完全回答,我也可以做更多研究。 非常感謝。 伊恩

我認為我們可以使用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();
    }

並且不要忘記在清單文件中添加它的權限。

一個花哨的方法是通過定時循環檢查服務

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

您遍歷該列表以查看電話上正在運行的內容。 現在您可以使用id和processName來標識它們,因此對於標准活動而言,這對於自定義對象很容易實現,除非您停止將它們全部加以區分...

注意:這並不是屏幕上實際存在的內容的列表,只是正在運行的內容的列表...可能會使目標無效,但至少您會知道什么時候開始運行...它將一直存在即使在后台也列出。

對於密碼,您可以在發現一個受保護的應用或其他應用后立即開始活動。

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並檢查該Activity對應於Email應用程序。

Application啟動時(或在設備啟動時)運行CheckRunningActivity Thread

new CheckRunningActivity().start();

更新:此類需要android.permission.GET_TASKS權限,因此將下一行添加到清單中:

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

我認為並希望這不可能。 考慮一下惡意軟件濫用此類功能的難易程度。 您可以聽取針對您的意圖以及廣播的意圖,但是啟動應用程序不應是廣播事件。

您可能能夠做的就是更換發射器 如果用戶同意。

主要問題是,當啟動器(主屏幕)通常使用顯式意圖時,您正在嘗試偵聽隱式意圖。

隱式意圖是當您想說“有人播放此視頻”並且Android選擇可以處理該意圖的應用時。

當您單擊主屏幕上的“電子郵件”圖標時,將發生明確的意圖。 它專門告訴Android使用完全限定的名稱(即com.android.mail或其他名稱)打開該特定應用。

AFAIK無法攔截此類明確的意圖。 這是Android內置的一種安全措施,任何兩個Activity都不能具有相同的完全合格的程序包名稱。 這樣可以防止第三方克隆該應用程序並偽裝成該應用程序。 如果您想做的事情可行,那么從理論上講,您可以安裝一個應用程序,該應用程序可能會阻止競爭對手的所有應用程序正常工作。

您嘗試執行的操作違反了Android安全模型。

您可以做的一件事是與特定的應用程序開發人員合作,將意圖轉發到您的安全系統,但這可能不是您要處理的事情。

在Android L中不建議使用getRunningTasks()

要獲取應用使用情況統計信息,您可以使用android.app.usage包中的UsageStats類。

新的App使用情況統計信息API允許應用程序開發人員收集與應用程序使用情況有關的統計信息。 與不推薦使用的getRecentTasks()方法相比,此API提供了更詳細的用法信息。

要使用此API,您必須首先在清單中聲明android.permission.PACKAGE_USAGE_STATS權限。 用戶還必須通過Settings > Security > Apps with usage access應用程序”來啟用對此應用程序的Settings > Security > Apps with usage access

是一個基本的應用示例,顯示了如何使用應用使用情況統計信息API來讓用戶收集與應用程序使用情況有關的統計信息。

也許您需要一項服務,而這些服務將在后台不斷運行。 比起您所說的服務。 還使用類別android.intent.category.LAUNCHER監聽android.intent.action.MAIN。 然后讓該廣播接收器覆蓋onReceive方法,並進行檢查以查看應用程序的名稱等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM