【问题标题】:How to get Usage Access Permission programmatically如何以编程方式获取使用访问权限
【发布时间】:2016-07-31 17:28:37
【问题描述】:

我的应用需要使用访问权限才能获取用户手机上当前正在运行的应用的信息。在以下链接的帮助下,我能够使用以下代码成功实现它。

Usage Access apps

这是我的工作代码

public void showDialog()
 {
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {

         @SuppressWarnings("WrongConstant")
         UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats");
         long time = System.currentTimeMillis();
         List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
                 time - 1000 * 1000, time);
         if (appList.size()==0)
         {
             AlertDialog alertDialog = new AlertDialog.Builder(this)
                     .setTitle("Usage Access")
                     .setMessage("App will not run without usage access permissions.")
                     .setPositiveButton("Settings", new DialogInterface.OnClickListener() {
                         @TargetApi(Build.VERSION_CODES.LOLLIPOP)
                         public void onClick(DialogInterface dialog, int which) {
                             // continue with delete
                             Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                            // intent.setComponent(new ComponentName("com.android.settings","com.android.settings.Settings$SecuritySettingsActivity"));
                             intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                             startActivityForResult(intent,0);
                         }
                     })
                     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                         public void onClick(DialogInterface dialog, int which) {
                             // do nothing
                             dialog.dismiss();
                         }
                     })
                     .setIcon(android.R.drawable.ic_dialog_alert)
                     .create();

             alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
             alertDialog.show();
         }                      else {
             Intent intent = new Intent(this, PackageService.class);
             startService(intent);
             finish();
         }
     }else
     {
         Intent intent = new Intent(this, PackageService.class);
         startService(intent);
         finish();
     }
 }

此代码将向用户显示需要使用访问权限的警报对话框,并将用户带到可以启用它的设置屏幕。

一切都与此完美配合。我唯一想要的是如何在不向用户显示任何对话框的情况下默认授予我的应用使用访问权限,直到他/她没有手动关闭它?

【问题讨论】:

  • 请问您找到解决方案了吗?
  • @vivek,一旦打开,你是如何检测到用户手机中正在打开的当前应用程序..?我的意思是 PackageService 详细信息
  • @Anukoolsrivastav 你能描述更多你想问的问题吗?
  • @VivekMishra 我想编写一个服务,该服务将检测手机中任何其他应用程序何时打开/前台。
  • PackageService.class 是什么?

标签: android android-security usagestatsmanager


【解决方案1】:

您可以简单地在清单上提供此权限,而忽略此权限错误:

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

比使用以下代码获得许可

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (!isAccessGranted()) {
        Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
        startActivity(intent);
    }
}


private boolean isAccessGranted() {
        try {
            PackageManager packageManager = getPackageManager();
            ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
            AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
            int mode = 0;
            if (android.os.Build.VERSION.SDK_INT > android.os.Build.VERSION_CODES.KITKAT) {
                mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
                        applicationInfo.uid, applicationInfo.packageName);
            }
            return (mode == AppOpsManager.MODE_ALLOWED);

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

【讨论】:

  • @samchaudhari 使用给定的方法,用户仍然需要打开使用访问页面并手动打开它。它会自动为您打开吗?没有任何用户输入?
  • @kash 没有任何方法可以自动打开它。用户必须手动开启。
  • 我们如何在使用设置屏幕中添加教程屏幕
猜你喜欢
  • 2023-04-09
  • 2013-09-28
  • 2011-01-29
  • 2023-03-30
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多