gpt4 book ai didi

android - 如何在用户单击正确的目标应用程序时关闭 ACTION_USAGE_ACCESS_SETTINGS Intent ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:02:26 25 4
gpt4 key购买 nike

我在设置中使用 Intent ACTION_USAGE_ACCESS_SETTINGS (Settings->Security->Apps with usage access) 在 Lollipop 版本中使用 UsageStatsManager .

 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 ,但它只是检查应用程序的启用。

最佳答案

AppOpsManager还有一个有趣的方法:

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

来自文档:

Monitor for changes to the operating mode for the given op in the given app package.

基本上这就是您所期望的 -> 对读取包使用统计开关更改的权限使用react。

你需要做的是检查允许状态,如果没有,打开设置并创建一个监听器:

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)

上面的例子只是打开主应用程序 Activity 。但是,您可以添加任何行为:

  • 传递额外的 Intent 参数以通知刚刚打开的 Activity 向用户显示对话框
  • 启动后台服务以显示 toast ,该用户必须授予权限。
  • 等...

查看 this repository ,因为它演示了这种情况以及 NetworkStats 的整体用法。

关于android - 如何在用户单击正确的目标应用程序时关闭 ACTION_USAGE_ACCESS_SETTINGS Intent ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39651734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com