Intereting Posts

Приложения Android Lock

Я здесь новый, и я искал вопросы, чтобы помочь мне, но у меня нет четких ответов.

Мне нужно сделать приложение для блокировки других приложений на телефоне. Я видел несколько на рынке, но я хочу это сделать. Есть ли какой-либо способ узнать, когда пользователь пытается открыть приложение и начать работу? (Для ввода пароля).

Я пытался с FileObserver, но работает только с файлами и каталогами (очевидно). Могу ли я сделать прослушиватель, который захватывает намерение других приложений перед запуском?

Прошу прощения за мой английский, и я ценю вашу помощь!

Solutions Collecting From Web of "Приложения Android Lock"

Нет, вы не можете знать, когда запускается другое приложение без какого-либо взлома. Это связано с тем, что запуск приложений не транслируется.

Что вы можете сделать, так это создание службы с фиксированными интервалами, скажем, 1000 миллисекунд, которая проверяет, что не системное приложение находится на передней панели. Убейте это приложение и из службы введите поле ввода пароля. Если этот пароль правильно, перезапустите это приложение

Вот пример кода

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

И вот 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; } 

Есть способ сделать это. Вы можете узнать, когда приложение запущено. Вы можете использовать класс packagemanager для получения всей информации о любом установленном и inbuld-приложении. И используйте приведенный ниже код, чтобы узнать, что это приложение запускается

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

Теперь вы можете использовать AccessibilityService, который позволяет узнать, какая из них находится наверху.

В классе 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()); } } } 

Вам придется включить функцию «Доступность» в настройках вашего телефона, что можно сделать, выбрав «Настройки»> «Доступность»> «Службы»> «Ваше приложение». Также есть несколько разрешений, которые вы должны добавить в свой манифест. Много информации можно найти на сайте разработчиков Android: http://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

Надеюсь это поможет!