如何以编程方式打开Android棉花糖上的特定应用程序的权限屏幕?

我有一个关于新的Android棉花糖版本的问题:

通过意图或类似的方式显示特定应用程序的权限屏幕是否可行?

Android M权限屏幕

可以使用下面的代码显示应用程序设置 – 是否有直接打开权限屏幕的模拟解决方案?

startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", getPackageName(), null))); 

我已经做了一些这方面的研究,但是我找不到一个合适的解决方案 – 我会很感激每一个帮助!

根据棉花糖官方授权video( 4米43的标志 ),你必须打开应用程序设置页面(从那里只需点击一下权限页面)。

要打开设置页面,你会这样做

 Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

这不可能。 我也试图这样做。 我可以找出包的名称和将要开始的活动。 但最后你会得到一个安全的例外,因为你不能声明的权限缺失。

更新:

关于其他答案,我也建议打开应用程序设置屏幕。 我用下面的代码来做到这一点:

  public static void startInstalledAppDetailsActivity(final Activity context) { if (context == null) { return; } final Intent i = new Intent(); i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); i.addCategory(Intent.CATEGORY_DEFAULT); i.setData(Uri.parse("package:" + context.getPackageName())); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); context.startActivity(i); } 

因为我不想在我的历史堆栈中有这个,所以我使用intent标志去除它。

相反,您可以用一行打开特定应用程序的常规设置

  startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID))); 
 Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); 

描述

Settings.ACTION_APPLICATION_DETAILS_SETTINGS
打开应用程序的详细信息设置页面。 从这里用户必须手动分配所需的权限。

Intent.FLAG_ACTIVITY_NEW_TASK
可选 。 如果设置,然后打开设置屏幕(活动)作为新的活动。 否则,它将在当前正在运行的活动中打开。

Uri.fromParts("package", getPackageName(), null)
准备或创建URI,而getPackageName() – 返回应用程序包的名称。

intent.setData(uri)
不要忘记设置这个 。 否则,你会得到android.content.ActivityNotFoundException因为您的意图 Settings.ACTION_APPLICATION_DETAILS_SETTINGS Settings.ACTION_APPLICATION_DETAILS_SETTINGS 并且android需要搜索某个名称。

如果我们只是谈论FLYME操作系统 (魅族) 只有它自己的安全应用程序的权限。

打开它使用以下意图:

 public static void openFlymeSecurityApp(Activity context) { Intent intent = new Intent("com.meizu.safe.security.SHOW_APPSEC"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("packageName", BuildConfig.APPLICATION_ID); try { context.startActivity(intent); } catch (Exception e) { e.printStackTrace(); } } 

原因BuildConfig是你的应用程序的BuildConfig

如果你想在Kotlin编写更少的代码,你可以这样做:

 fun Context.openAppSystemSettings() { startActivity(Intent().apply { action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS data = Uri.fromParts("package", packageName, null) }) } 

根据马丁Konecny答案

这是不可能的务实获得许可…但不适当的建议你把这行代码try {} catch {},这使得你的应用程序不幸停止…并在catch身体做一个对话框,将导航用户到小教程,使其他应用程序的权限绘制…然后在是按钮点击把这个代码…

  Intent callSettingIntent= new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(callSettingIntent); 

这个意图是直接打开其他应用程序的绘制列表来管理权限,然后从这里它是一个点击画在其他应用程序权限…我知道这不是你正在寻找的答案…但我在我的应用程序中做这个…

使用requestPermissions方法是可能的

虽然不能直接看到设置页面,但可以更改访问权限。
一个很好的例子:
https://www.learn2crack.com/2015/10/android-marshmallow-permissions.html

这样你可以检查和呼叫

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 0); }