2012-07-05 38 views
8

Tôi đang cố gắng xây dựng một ứng dụng mà ứng dụng của tôi chạy trong nền và phát hiện khi người dùng khởi chạy một ứng dụng khác để tôi có thể kiểm soát luồng từ đó. Để minh họa cho truy vấn của tôi, tôi muốn chỉ định một ví dụ. Ứng dụng của tôi đang chạy ẩn (nói dưới dạng Dịch vụ) và người dùng vừa mới nhấp vào ứng dụng 'XYZ'. Có thể ứng dụng của tôi phát hiện ứng dụng 'XYZ' đã được khởi chạy không? Nhiều hơn là chỉ phát hiện liệu 'Hoạt động của XYZ có đến nền trước hay không, tôi muốn phát hiện whz' XYZ 'đã được khởi chạy hay không. Nói ai đó khởi chạy 'Whatsapp Messenger', tôi muốn biết liệu ứng dụng của tôi có thể biết rằng 'Whatsapp Messenger' đã được khởi chạy hay không.Cách phát hiện khi người dùng khởi chạy một ứng dụng khác? (Android)

EDIT: Rất nhiều người nghĩ rằng tôi đang cố gắng xây dựng phần mềm độc hại, nhưng tôi thì không. Tôi đang cố gắng xây dựng một ứng dụng cho một dự án trường trung học. Tôi muốn một chỉ số để xem tần suất tôi sử dụng máy ảnh của mình như một phần của dự án tâm lý. :/

Xin cảm ơn trước, Sumit.

+0

Tại sao bạn sẽ muốn làm điều đó? để báo giá "** để tôi có thể kiểm soát luồng từ đó **" Điều đó nghe có vẻ bực bội. – t0mm13b

+0

Tôi đang cố gắng xây dựng một ứng dụng cho một dự án trường trung học. Không có phần mềm độc hại. :( –

+0

có thể trùng lặp của http://stackoverflow.com/questions/3290936/android-detect-when-other-apps-are-launched – SMR

Trả lời

1

Tôi đoán bạn nên xem ứng dụng "bảo vệ ứng dụng" trong Google Play. Họ phát hiện người dùng đó đã khởi chạy một ứng dụng khác. Điều đó được thực hiện bằng cách đọc nhật ký hệ thống. Hãy thử mở LogCat và đọc nhật ký sau khi bạn khởi chạy bất kỳ ứng dụng nào trên thiết bị. Bạn sẽ bất ngờ.

Và bạn nên đi đâu từ đó? Tôi đoán bạn nên thử ứng dụng aLogCat. Đó là freen và mã nguồn mở. Điều đó sẽ giúp bạn thực sự đọc nhật ký.

Mặc dù vậy, tất cả điều này được coi là vi phạm bảo mật trong Android của một số nhà phát triển.

+0

Có đúng là Google sẽ chặn ghi nhật ký ở cấp API 16 trở lên không? – gonzobrains

+1

@gonzobrains Đã, tôi đoán.Bạn có thể đọc các bản ghi chỉ được phát hành bởi pid của riêng bạn –

+0

@gonzobrains vâng tôi chặn trên api 16. m cũng tìm mã sorce cho bữa ăn trưa ứng dụng thậm chí bạn có thể giúp tôi cho cùng một –

3

Có, bạn có thể tìm ứng dụng nào được khởi chạy, bằng cách theo dõi Logcat. Chỉ cần theo dõi trên ActivityManager thẻ với thông tin -I nhật ký.

Từ adb shell lệnh là,

adb logcat ActivityManager:I *:S 

Từ mã ứng dụng của bạn,

logcat ActivityManager:I *:S 

Và trong Logcat bạn có thể tìm thấy một dòng cái gì đó như,

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

Khi bất kỳ ứng dụng sẽ khởi chạy.

Đó là sản lượng logcat cho thấy rằng thông điệp liên quan đến mức độ ưu tiên "I" và thẻ "ActivityManager":

Cập nhật:

Chỉ cần thêm sự cho phép trong file manifest của ứng dụng của bạn,

android.permission.READ_LOGS 
+2

Công bằng Cảnh báo: phương pháp này Một số điện thoại mới hơn (tôi đã chứng kiến ​​trên GS3) không còn đặt gói/hoạt động vào câu lệnh log này nữa. Nếu bạn không quan tâm đến preformance, bạn có thể tiếp tục bỏ phiếu ActivityManager.getRecentTasts() để biết khi nào và – FoamyGuy

+0

sẽ không hoạt động từ Jellybean + Quyền READ_LOGS hiện chỉ dành cho các ứng dụng hệ thống.? –

-2

Trong cuốn sách của tôi, theo cách bạn đặt ra câu hỏi, nghe có vẻ như đang hack một ứng dụng theo một cách nhất định để dịch vụ của bạn kiểm soát, giáp với phần mềm độc hại. Nhưng nó sẽ không hoạt động trong Android - đơn giản và đơn giản do các quyền của mỗi ứng dụng khác nhau. Qua đó, mỗi ứng dụng được phân lập với nhau. Vì vậy, để trả lời câu hỏi của bạn một cách thẳng thừng, số

của nó như một câu trả lời khác được đề xuất - bạn có thể theo dõi logcat nhưng ..sau đó một lần nữa ... tại sao?

+0

Vì đây là một phần API công khai, tôi không thấy lý do nào để không làm điều đó. –

+0

@Mighter Hỏi OP tại sao anh ta muốn kiểm soát một ứng dụng từ một dịch vụ? Chắc chắn là một phần của API công khai và "bạn thấy không có lý do gì để không làm điều đó", đúng, nếu tôi từng phát hiện ra rằng ứng dụng đang làm điều đó - một từ - * gỡ cài đặt *. – t0mm13b

+0

Chắc chắn anh ấy muốn xây dựng phần mềm độc hại. –

8

không chắc chắn nếu điều này là cách tốt nhất để làm điều này nhưng nó hoạt động, bạn có thể sử dụng logcat và nhìn vào sản lượng của nó, bạn có thể sử dụng quyền này

android.permission.READ_LOGS 

và sử dụng mã dưới đây:

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

và đừng quên sự cho phép của nó trên manifest android, bạn có thể thêm mã này to a thread cho nó hoạt động

+0

Cảm ơn bạn rất nhiều vì sự giúp đỡ của bạn. Tôi không hoàn toàn hiểu mã nhưng tôi sẽ tìm ra, nhưng ý bạn là gì trong phần cuối: "thêm mã này vào một chuỗi"? Bạn có nghĩa là một ASyncTask hoặc một cái gì đó dọc theo cùng một dòng? Tôi muốn ứng dụng của tôi hoạt động như một Dịch vụ, do đó, ứng dụng này có thể phát hiện tại bất kỳ thời điểm nào nếu ứng dụng được khởi chạy. –

+0

Bạn có thể sử dụng chỉ một chuỗi bình thường để thực hiện điều này và nếu bạn muốn ứng dụng của mình chạy dưới dạng dịch vụ, chỉ cần đặt chuỗi trong dịch vụ rồi đặt mã ở trên trong chuỗi ... ví dụ về thêm chuỗi vào dịch vụ có thể xem tại đây: http://stackoverflow.com/questions/4178682/how-to-start-a-new-thread-in-a-service –

+0

Cảm ơn một tấn. Tôi sẽ cố gắng thực hiện nó và cho bạn biết kết quả. –

1

tôi đã thực hiện một dịch vụ có thể phát hiện nếu các ứng dụng khác khởi chạy. Tôi đã làm cho nó cho dialer. tương tự có thể được thay thế bằng bất kỳ tên gói nào.

@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; 
} 

Ở đây tôi thực hiện tất cả các tác vụ đang chạy và kiểm tra xem đó có phải là ứng dụng dự định của chúng tôi hay không. Nếu vậy tôi kiểm tra xem ứng dụng có tiền cảnh và ứng dụng không bao giờ được khởi chạy bằng biến 'phonelaunched' hay không. phoneclosed được sử dụng khi ứng dụng dự định là trong nền và biến được thiết lập cho phù hợp.

Tất cả điều này được thực hiện trong Dịch vụ lớp

+1

Mã này sẽ không chạy ở android L nữa. Sử dụng gói 'android.app.usage' để thay thế. https://developer.android.com/reference/android/app/usage/package-summary.html –

+0

Nhưng tôi phải viết nó cho các thiết bị chạy dưới kẹo. Chúng ta có thể trực tiếp sử dụng android.app.usage trong các thiết bị lollipop dưới đây không ?? –

Các vấn đề liên quan