2016-09-23 3 views
10

Ich verwende Intent ACTION_USAGE_ACCESS_SETTINGS in Einstellung (Settings->Security->Apps with usage access), um UsageStatsManager in der Lollipop-Version zu verwenden.Wie wird ACTION_USAGE_ACCESS_SETTINGS Intent geschlossen, wenn der Benutzer auf die richtige Zielanwendung klickt?

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

Zuerst überprüft onCreate() die Berechtigung für die App. und auf der Absicht wenden, wenn die App keine Berechtigung hat (nicht überprüft)

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

Meine Frage ist, dass ich das Einstellungsfenster schließen möchten, wenn der Benutzer wählt (Scheck) in Ziel-App, andernfalls wird es Zeige eine Nachricht über den Anwendungsnamen, um den ausgewählten Benutzer zu führen. Wie kann ich es tun? Vielen Dank. Ich denke, es ist in onActivityResult Funktion tun

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

ich den Link verweisen Check if my application has usage access enabled, aber es nur Kontrollen ermöglichen der App.

Antwort

8

AppOpsManager hat eine weitere interessante Methode:

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

von Dokumentation:

Monitor für Änderungen in den Betriebsmodus für die gegebene op in dem angegebenen App-Paket.

Im Grunde ist dies das, was Sie erwarten -> reagieren auf die Erlaubnis, Paket-Nutzung zu lesen stats switch change.

Was Sie tun müssen, ist die Zulage Zustand zu überprüfen und wenn es nicht gewährt wird, die Einstellungen öffnen und einen Listener erstellen:

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

vorsichtig sein und den Hörer entfernen Sie die Methode aufrufen:

void stopWatchingMode (AppOpsManager.OnOpChangedListener callback)

Das obige Beispiel öffnet nur Hauptanwendungsaktivität. Jedoch Sie jedes Verhalten könnten hinzufügen:

  • Pass zusätzlicher Absicht Parameter nur geöffnete Aktivität zu informieren Dialog
  • startet Hintergrunddienst an Benutzer zu zeigen, Toast zu zeigen, muss dieser Benutzer die Berechtigung erteilen.
  • etc ...

Check out this repository, wie es diesen Fall und die allgemeine Nutzung von NetworkStats demonstriert.

+0

Schön, aber ich denke nicht, dass dies auf Lollipop 5.0 (AL 21) funktioniert. Nicht wahr? – IlToro

Verwandte Themen