2016-09-23 4 views
10

Я использую Intent ACTION_USAGE_ACCESS_SETTINGS в настройке (Settings->Security->Apps with usage access), чтобы использовать UsageStatsManager в версии Lollipop.Как закрыть ACTION_USAGE_ACCESS_SETTINGS, когда пользователь нажимает правильное целевое приложение?

public static final int MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS = 1; 

if(!hasPermission()){ 
       startActivityForResult(
         new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS), 
         MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS); 
      } 

Во-первых, onCreate() проверит разрешение для приложения. и включите Intent, если приложение не имеет разрешения (не проверять)

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
private boolean hasPermission() { 
    try { 
     PackageManager packageManager = getApplicationContext().getPackageManager(); 
     ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getApplicationContext().getPackageName(), 0); 
     AppOpsManager appOpsManager = (AppOpsManager) getApplicationContext().getSystemService(Context.APP_OPS_SERVICE); 
     int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName); 
     return (mode == AppOpsManager.MODE_ALLOWED); 

    } catch (PackageManager.NameNotFoundException e) { 
     return false; 
    } 
} 

Мой вопрос заключается в том, что я хочу, чтобы закрыть окно настроек, если пользователь выбирает (чек) в целевом приложении, в противном случае, он будет покажите сообщение о названии приложения для указания выбранного пользователя. Как мне это сделать? Спасибо. Я думаю, что он будет делать в onActivityResult функции

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == MY_PERMISSIONS_REQUEST_PACKAGE_USAGE_STATS){ 
     ... 
    } 
} 

Я имею в виду ссылку Check if my application has usage access enabled, но он просто проверяет, включите приложения.

ответ

8

AppOpsManager имеет еще один интересный метод:

void startWatchingMode (String op, String packageName, AppOpsManager.OnOpChangedListener callback)

из документации:

Монитор для изменения в режим работы для данного цит в данном пакете приложений.

В основном это то, что вы ожидаете -> реагировать на разрешение на чтение статистики использования коммутатора.

Что вам нужно сделать, это проверить состояние резерва, и если оно не предоставлено, откройте настройки и создать слушатель:

private boolean hasPermissionToReadNetworkHistory() { 
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { 
     return true; 
    } 
    final AppOpsManager appOps = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE); 
    int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, 
      android.os.Process.myUid(), getPackageName()); 
    if (mode == AppOpsManager.MODE_ALLOWED) { 
     return true; 
    } 
    appOps.startWatchingMode(AppOpsManager.OPSTR_GET_USAGE_STATS, 
      getApplicationContext().getPackageName(), 
      new AppOpsManager.OnOpChangedListener() { 
       @Override 
       @TargetApi(Build.VERSION_CODES.KITKAT) 
       public void onOpChanged(String op, String packageName) { 
        int mode = appOps.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, 
          android.os.Process.myUid(), getPackageName()); 
        if (mode != AppOpsManager.MODE_ALLOWED) { 
         return; 
        } 
        appOps.stopWatchingMode(this); 
        Intent intent = new Intent(MainActivity.this, MainActivity.class); 
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK|Intent.FLAG_ACTIVITY_NEW_TASK); 
        getApplicationContext().startActivity(intent); 
       } 
      }); 
    requestReadNetworkHistoryAccess(); 
    return false; 
} 

private void requestReadNetworkHistoryAccess() { 
    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS); 
    startActivity(intent); 
} 

Будь осторожен и удалить слушатель вызов метода:

void stopWatchingMode (AppOpsManager.OnOpChangedListener callback)

Приведенный выше пример - только открытие основной деятельности приложения. Однако вы можете добавить любое поведение:

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

Заканчивать this repository, как показывает этот случай, и общее использование NetworkStats.

+0

Ничего, но я не думаю, что это работает на Lollipop 5.0 (AL 21). Не так ли? – IlToro

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