2010-07-20 63 views
77

我試圖開發一個應用程序,可以防止用戶無需密碼即可獲取指定的應用程序。該方案是...Android,當其他應用程序啓動時檢測到

  1. 用戶點擊「電子郵件」應用程序(例如)
  2. 我的應用程序檢測到啓動應用
  3. 我的應用程序確認這是「電子郵件」應用
  4. 我應用打開過頂視圖,要求
  5. 用戶輸入密碼,如果正確的話,我的應用程序消失了密碼,留下了「電子郵件」應用程序之上

我很好做它的休息,絕對第2部分讓我感到困惑,並且經過多天閱讀廣播內容等並嘗試在我的試驗項目中聽「android.intent.action.MAIN」等,我似乎無法檢測到除我以外的應用程序時開始。

任何人都可以幫忙嗎?我是否以正確的方式去尋找新的應用程序來廣播開始的意圖,或者我應該閱讀系統日誌中的新意圖,還是使用本地代碼進行操作?

任何指針都會有所幫助,即使你無法完全回答它,我仍然可以做更多的研究。非常感謝。 Ian

+0

@lan如何ü解決您的問題u能請分享你的知識 – nida 2015-01-16 05:11:34

+0

喜有,你得到了解決? – ask4solutions 2016-02-24 06:26:09

+0

我不知道他們是怎麼做到的,但像[應用程序保護](http://www.androlib.com/android.application.com-carrotapp-protectdemo12-nFzA.aspx)的應用程序究竟是幹什麼的你」重新徵求意見,所以這確實在技術上是可行的。 – hanspeide 2010-07-20 19:23:22

回答

30

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

而且不要忘了加上它在清單文件的權限。

+0

,我們必須把這個代碼放在哪裏?在服務?在onStartCommand()? – 2012-05-30 01:22:58

+0

@haythemsouissi你可以在一個線程中運行它。 – 2012-06-03 05:46:35

+0

您好任何一個可以回答這個問題:http://stackoverflow.com/questions/10874904/detect-when-user-lunch-a-new-application-in-android-device/10875633#10875633 它關係到這個主題 – 2012-06-06 11:22:42

9

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

隱含的意圖是當你想說「有人播放這個視頻」,Android挑選一個可以處理該意圖的應用程序。

當您單擊主屏幕上的「電子郵件」圖標時,會出現一個明確的意圖。它特別告訴Android以完全限定的名稱(即com.android.mail或其他)打開該特定應用程序。

AFAIK攔截這種明確的意圖是沒有辦法的。這是Android內置的安全措施,任何兩個活動都不能具有相同的完全限定的軟件包名稱。這可以防止第三方克隆應用程序並僞裝成該應用程序。如果你想做什麼是可能的,你理論上可以安裝一個應用程序,可以阻止你的競爭對手的所有應用程序運行。

你試圖做的事違背Android安全模型。

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

2

也許你需要一個服務,它會不斷在後臺運行。比你的服務做你所說的話。聽android.intent.action.MAIN也與類別android.intent.category.LAUNCHER。然後讓廣播接收機重寫onReceive方法,並檢查應用程序的名稱等。

+2

這聽起來像只是我正在考慮的方法,但我正在努力接收MAIN(貓。LAUNCHER)廣播與一個基本的BroadcastReceiver。 有沒有人設法做到這一點? 在這個階段,我只是想檢測應用程序已啓動或恢復。然後,我可以將包名稱與一個包含我正在查找的名稱的字符串進行比較。 – Ian 2010-07-21 13:47:47

10

我想並希望這是不可能的。考慮這些功能如何輕易被惡意軟件濫用。您可以收聽針對您的意圖以及廣播的意圖,但應用程序啓動不應該是廣播事件。您可以做的是replace the launcher。如果用戶同意。

+2

+ +1解決真正的問題。 – Nate 2010-07-20 14:46:34

+1

爲什麼它不可能?這是我的設備,我決定在它上面運行。與我們經常授予的其他權限相比,這是多大的問題?替換啓動器不會啓動所有應用程序,只有那些由其直接啓動的應用程序。對這個和類似的線索有很多評論,聲稱只能看到意圖會是一個巨大的問題,但沒有人解釋問題是什麼,爲什麼它應該被視爲如此討厭以至於現有的權限系統不能用於向用戶說明發生了什麼。 – 2014-12-01 19:42:20

+0

作爲未來的權限去,這是一個乏味。擁有安全模型的關鍵是啓用大多數合法用例,同時防止大多數(理想情況下所有)攻擊。不僅僅是你(需要知識淵博的用戶)需要受到保護,還需要天真的用戶安裝應用程序,以及應用程序編寫人員不必再考慮另一個攻擊媒介。所有的安全性都是權衡的:在這種情況下,公用事業和權力與大規模的可利用性之間。 你可以自由地克隆Android軟件開發包,如果你真的想要的自由度爲自己的編寫自己的系統。 – 2015-01-04 19:44:30

15

噱頭的方式來做到這一點是有一個定時循環,檢查

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

您可以通過該列表運行來看看什麼是在手機上運行的服務。 現在你可以找出他們的ID和processName,因此對於標準活動,這是爲方便自定義的好,除非你阻止他們所有的努力歧視......

注:這個心不是什麼的其實是一個列表在屏幕上,只是一個什麼是運行...有點也許抵消你的目標,但至少你會知道什麼時候開始運行......它將保持在該列表中,即使在後臺雖然。

對於密碼的事情,你可以開始你的活動,當你發現一個應用程序 多數民衆贊成在受保護或任何。

+0

是否可以獲取應用程序啓動/恢復的時間? – 0LLiena 2014-07-17 20:44:39

+3

不會在android L上運行,雖然很好的答案。 – JacksOnF1re 2014-12-09 11:17:52

+2

在Android L中使用'android.app.usage'包代替。請https://developer.android.com/reference/android/app/usage/package-summary.html – 2015-09-06 13:37:32

10
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應用。

運行CheckRunningActivityThreadApplication啓動(或在設備啓動時)。

new CheckRunningActivity().start(); 

更新: 這個類需要android.permission.GET_TASKS權限,這樣在下一行添加到清單:

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

我使用這種方法,但這會打開你的「//在PACKAGE_NAME頂部顯示你的活動。ACTIVITY_NAME「一次又一次,因爲循環。任何解決方法嗎? – 2014-07-18 09:08:06

+0

停止CheckRunningActivity線程,當你得到所需的結果 – 2014-07-18 09:14:00

+0

感謝您的答覆,然後如何/當這個線程重新啓動?我正在使用一個粘滯服務 – 2014-07-18 09:17:27

5

getRunningTasks()在Android的L.已經過時

爲了獲得應用使用情況統計你可以使用UsageStats類從android.app.usage包。

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

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

Here是展示如何使用應用程序的使用統計API,讓用戶收集有關應用程序的使用統計數據的基本應用的例子。

+0

使用統計信息如何幫助您瞭解哪個應用處於前臺? – Ajay 2015-10-16 11:01:41

+0

@Ajay是這樣的:https://gist.github.com/plateaukao/011fa857d1919f2bbfdc – Boy 2016-03-16 13:20:09

相關問題