2011-08-30 40 views
26

Tôi mới ở đây và tôi đã tìm kiếm các câu hỏi để giúp tôi nhưng tôi không có câu trả lời rõ ràng.Ứng dụng khóa Android

Tôi cần tạo ứng dụng để chặn các ứng dụng khác trên điện thoại. Tôi đã nhìn thấy một số trên thị trường nhưng tôi muốn thực hiện một. có cách nào để biết khi nào người dùng cố gắng mở một ứng dụng và đưa ra một hoạt động? (để đặt mật khẩu).

Tôi đã thử với FileObserver, nhưng chỉ hoạt động với các tệp và thư mục (hiển nhiên). Tôi có thể tạo một người nghe để ghi lại ý định của các ứng dụng khác trước khi bắt đầu không?

Tôi xin lỗi vì tiếng Anh của tôi và tôi đánh giá cao sự trợ giúp của bạn!

+0

Dịch vụ kiểm tra mỗi giây sẽ tiêu hao pin của bạn sau vài giờ. Nó sẽ không được tốt hơn để làm cho một ứng dụng launcher/home? – Erdal

+0

bạn đã đúng! Nhưng đó không phải là điều tôi muốn. Cảm ơn câu trả lời của bạn! – ngbl

Trả lời

38

Không, bạn không thể biết khi nào một ứng dụng khác được khởi chạy mà không có loại hack nào. Điều này là do khởi chạy ứng dụng không được phát sóng.

Điều bạn có thể làm là tạo một dịch vụ chạy theo khoảng thời gian cố định, giả sử 1000 mili giây để kiểm tra xem ứng dụng không thuộc hệ thống nào ở phía trước. Giết ứng dụng đó và từ dịch vụ bật hộp nhập mật khẩu. Nếu mật khẩu mà là đúng relaunch rằng ứng dụng

Dưới đây là một số mẫu mã

timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      List<RunningAppProcessInfo> appProcesses= activityManager.getRunningAppProcesses(); 
     for (RunningAppProcessInfo appProcess : appProcesses) { 
      try { 
      if (appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { 
      if (!lastFrontAppPkg.equals((String) appProcess.pkgList[0])) { 
      apkInfo = ApkInfo.getInfoFromPackageName(appProcess.pkgList[0], mContext); 
       if (apkInfo == null || (apkInfo.getP().applicationInfo.flags && ApplicationInfo.FLAG_SYSTEM) == 1) { 
        // System app            continue; 
         } else if (((apkInfo.getP().versionName == null)) || (apkInfo.getP().requestedPermissions == null)) { 
        //Application that comes preloaded with the device 
         continue; 
        } else { 
        lastFrontAppPkg = (String) appProcess.pkgList[0]; 
        } 
    //kill the app 
    //Here do the pupop with password to launch the lastFrontAppPkg if the pass is correct 
         } 
         } 
        } 
       } catch (Exception e) { 
        //e.printStackTrace(); 
       } 
       }       
      } 
      }, 0, 1000); 

Và đây là ApkInfo.getInfoFromPackageName()

/** 
* Get the ApkInfo class of the packageName requested 
* 
* @param pkgName 
*   packageName 
* @return ApkInfo class of the apk requested or null if package name 
*   doesn't exist 
* @see ApkInfo 
*/ 
public static ApkInfo getInfoFromPackageName(String pkgName, 
     Context mContext) { 
    ApkInfo newInfo = new ApkInfo(); 
    try { 
     PackageInfo p = mContext.getPackageManager().getPackageInfo(
       pkgName, PackageManager.GET_PERMISSIONS); 

     newInfo.appname = p.applicationInfo.loadLabel(
       mContext.getPackageManager()).toString(); 
     newInfo.pname = p.packageName; 
     newInfo.versionName = p.versionName; 
     newInfo.versionCode = p.versionCode; 
     newInfo.icon = p.applicationInfo.loadIcon(mContext 
       .getPackageManager()); 
     newInfo.setP(p); 
    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
     return null; 
    } 
    return newInfo; 
} 
+0

cảm ơn, tôi sẽ thử điều này và tôi sẽ cho bạn biết .. – ngbl

+0

Cảm ơn Weakwire! điều này thực sự hữu ích! Tôi cần một số công việc để làm những gì tôi muốn, nhưng là ý tưởng chung! Cảm ơn bạn! – ngbl

+0

bạn được chào đón. – weakwire

9

có một cách để làm như vậy. bạn có thể biết khi nào một ứng dụng được khởi chạy. bạn có thể sử dụng lớp packagemanager để nhận tất cả thông tin về bất kỳ ứng dụng được cài đặt và inbuld nào. và sử dụng mã bên dưới để biết whwn ứng dụng đó được khởi chạy

  @Override 
    public void run() { Log.i("test","detector run"); 
     try { 
      Process process; 
      process = Runtime.getRuntime().exec(ClearLogCatCommand); 
      process = Runtime.getRuntime().exec(LogCatCommand); 
      br = new BufferedReader(new InputStreamReader(process.getInputStream())); 
      String line; 
      // Check if it matches the pattern 
      while(((line=br.readLine()) != null) && !this.isInterrupted()){ 

       Log.d("Detector", "RUN"+line); 

       // Ignore launchers 
       if (line.contains("cat=[" + Intent.CATEGORY_HOME + "]")) continue; 

       Matcher m = ActivityNamePattern.matcher(line); 
       if (!m.find()) continue; 
       if (m.groupCount()<2){ 
        // Log.d("Detector", "Unknown problem while matching logcat output. Might be SDK version?"); 
        continue; 
       } 

       if (mListener!=null) mListener.onActivityStarting(m.group(1), m.group(2)); 

       Log.i("Detector", "Found activity launching: " + m.group(1) + "/ " + m.group(2)); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

là nó hoạt động .... phát hiện tất cả các ứng dụng khác ???? – Vikky

+3

có ...... là cách duy nhất để phát hiện các ứng dụng khác trên thiết bị –

+0

Tôi đang cố gắng sử dụng mã này nhưng có điều gì đó tôi đang làm sai. Xin vui lòng bạn có thể cung cấp thêm mã để sử dụng nó. cảm ơn. ảnh chụp màn hình: http://oi57.tinypic.com/28b8gmd.jpg –

4

Bây giờ bạn có thể sử dụng AccessibilityService cho phép bạn tìm hiểu Hoạt động nào ở trên cùng.

Trong lớp AccessibilityService:

@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
    if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { 
     ComponentName componentName = new ComponentName(
       event.getPackageName().toString(), 
       event.getClassName().toString() 
     ); 

     ActivityInfo activityInfo = tryGetActivity(componentName); 
     boolean isActivity = activityInfo != null; 
     if (isActivity) { 
      Log.i("CurrentActivity", componentName.flattenToShortString()); 
     } 
    } 
} 

Bạn sẽ phải bật Accessibility trong cài đặt của điện thoại, có thể được thực hiện bằng cách vào Settings> Accessibility> Dịch vụ> App của bạn. Ngoài ra còn có một vài quyền bạn sẽ phải thêm vào Tệp kê khai của mình. Bạn có thể tìm thấy rất nhiều thông tin trong trang web dành cho Nhà phát triển Android: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

Hy vọng điều này sẽ hữu ích!

+0

cảm ơn ý tưởng tốt của bạn. bạn có thể giải thích thêm về phương thức 'tryGetActivity (componentName)' không? –

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