2013-11-08 3 views
28

Я попытался разработать такое приложение, в том смысле, что хочу заблокировать все приложения на своем устройстве с помощью пароля, который я хочу. Но я не нашел какой-либо части кода для решения. Поэтому я разработал один сам и, к сожалению, этого не удалось. Я нашел много решений для блокировки устройств Android, но не нашел их для блокировки приложения. Будем рады, если вы предложите решение.Программные приложения для блокировки приложений Android

+1

ли Вы хотите заблокировать приложение в момент доступа , Если да, то я помогу вам bcz. Я разработал приложение, в котором пользователь сможет заблокировать (любое или все) установленное приложение в устройстве. –

+0

@AmitGupta Я также сталкиваюсь с той же проблемой. Я хочу заблокировать приложение во время доступа .. Помогите мне :) –

+0

Привет Amit .. Я хочу того же. Хотите заблокировать во время доступа к приложению. :) –

ответ

52

Я использовал фоновое обслуживание, чтобы проверить, какое приложение находится на переднем плане (это означает, что приложение используется пользователем). Затем я проверяю, нужно ли мне блокировать приложение или нет.

Чтобы найти список всех установленных приложений (за исключением системных приложений):

PackageManager packageManager = getPackageManager(); 
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); 

List<ResolveInfo> appList = packageManager.queryIntentActivities(mainIntent, 0); 
Collections.sort(appList, new ResolveInfo.DisplayNameComparator(packageManager)); 
List<PackageInfo> packs = packageManager.getInstalledPackages(0); 
for (int i = 0; i < packs.size(); i++) { 
    PackageInfo p = packs.get(i); 
    ApplicationInfo a = p.applicationInfo; 
    // skip system apps if they shall not be included 
    if ((a.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { 
     continue; 
    } 
    appList.add(p.packageName); 
} 

Чтобы найти текущий переднего плана приложения:

ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1); 
ActivityManager.RunningTaskInfo ar = RunningTask.get(0); 
activityOnTop=ar.topActivity.getClassName(); 

Здесь имя-класс предоставляет имя пакета заявление. Я предлагаю вам использовать имя пакета для идентификации любого приложения, чтобы мы знали, что имя пакета всегда уникально.

Теперь функциональность для блокировки приложения:

Чтобы найти какое приложение работает на переднем плане и хотите, чтобы заблокировать его, мы просто должны начать другую деятельность, которая имеет EditText пароля и OK и Отмена.

Intent lockIntent = new Intent(mContext, LockScreen.class); 
lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
mContext.startActivity(lockIntent); 

На щелчку OK, если пароль правильный, то просто отделка LockScreen активность. Если пароль введен неверно, то просто используйте следующий код, который закрывает приложение и показывает домашний экран устройства:

Intent startHomescreen = new Intent(Intent.ACTION_MAIN); 
startHomescreen.addCategory(Intent.CATEGORY_HOME); 
startHomescreen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
startActivity(startHomescreen); 

тот же код используется также на кнопку отмены.

+0

** @ Shakeeb Shaheen ** и ** thampi joseph ** если у вас есть какие-либо вопросы, связанные с этой записью, не стесняйтесь спрашивать ... –

+0

ThankYou Amit .. :) Перейдем к этому :) –

+0

Эй, подождите .. Я хочу заблокировать системное приложение, а также приложение, работающее в фоновом режиме также. Можете ли вы мне помочь в этом тоже? :) –

4

Похоже, что это все еще загадка, как было предложено вышеупомянутыми комментариями. Поэтому я помещаю код, который помог мне решить эту проблему.

getForegroundApp

public String getForegroundApp() { 
    String currentApp = "NULL"; 
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
     UsageStatsManager usm = (UsageStatsManager) this.mContext.getSystemService(Context.USAGE_STATS_SERVICE); 
     long time = System.currentTimeMillis(); 
     List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); 
     if (appList != null && appList.size() > 0) { 
      Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); 
      for (UsageStats usageStats : appList) { 
       mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); 
      } 
      if (mySortedMap != null && !mySortedMap.isEmpty()) { 
       currentApp = mySortedMap.get(mySortedMap.lastKey()).getPackageName(); 
      } 
     } 
    } else { 
     ActivityManager am = (ActivityManager) this.mContext.getSystemService(Context.ACTIVITY_SERVICE); 
     List<ActivityManager.RunningAppProcessInfo> tasks = am.getRunningAppProcesses(); 
     currentApp = tasks.get(0).processName; 
    } 

    return currentApp; 
} 

Вызов getForegroundApp() и возвращает строку, содержащую имя currentForegroundApp, включая имя пакета, например com.example.app

Теперь, чтобы использовать этот код, нам нужна эта строка кода в Manifest файле

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

и принять пользователю Usage Data access Settings:

usageAccessSettingsPage

public void usageAccessSettingsPage(){ 
    Intent intent = new Intent(); 
    intent.setAction(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    Uri uri = Uri.fromParts("package", mContext.getPackageName(), null); 
    intent.setData(uri); 
    startActivity(intent); 
} 

или вручную путем нахождения в LockScreen and Security>Other security settings>Usage access data.

Теперь наступает часть блокировки приложения, эта часть очень хорошо освещена в ответе Амита. Однако, если кто-то ищет способ ограничить пользователя от использования приложения, то трюк заключается в том, чтобы открыть главный экран при запуске определенного приложения.

Это может быть сделано путем вызова следующего метода, когда currentApp равно заблокированного приложение

if(<NameOfBlockedApp>.equals currentApp){ 
    showHomeScreen(); 
    } 

ShowHomeScreen

public boolean showHomeScreen(){ 
    Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    mContext.startActivity(startMain); 
    return true; 
} 
+0

Привет, я успешно открываю активность блокировки, когда другое приложение открывается, которое мне нужно задать пароль, но когда пользователь вводит правильный пароль, его покажет мое приложение вместо приложения, для которого я открыл действие. Как открыть экран блокировки и закрыть его, не открывая мое приложение в фоновом режиме. Пожалуйста, помогите, я застрял здесь. –

+0

@RahulVats Задайте новый вопрос и ссылку – 7geeky

+0

@RahulVats вы нашли решение, как запустить такое же приложение после успешного пароля. потому что он открыл мое приложение для блокировки. –

Смежные вопросы