我有一个关于新的Android 6.0 (Marshmallow)发布的问题。

是否有可能通过Intent或类似的东西来显示特定应用程序的“应用程序权限”屏幕?

使用以下代码可以在设置中显示应用程序的“应用程序信息”屏幕:

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

是否有类似的解决方案直接打开应用程序的“应用程序权限”屏幕?

我已经对此做了一些研究,但我无法找到解决方案。


当前回答

根据官方的棉花糖权限视频(在4米43秒的标记),你必须打开应用程序设置页面(从那里它是一个点击到权限页面)。

打开设置页面,你要做的就是

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

其他回答

在Kotlin

    /*
*
* To open app notification permission screen instead of setting
* */
fun Context.openAppNotificationSettings() {
    val intent = Intent().apply {
        when {
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.O -> {
                action = Settings.ACTION_APP_NOTIFICATION_SETTINGS
                putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
            }
            else -> {
                action = Settings.ACTION_APPLICATION_DETAILS_SETTINGS
                addCategory(Intent.CATEGORY_DEFAULT)
                data = Uri.parse("package:" + packageName)
            }
        }
    }
    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);
}

因为我不想在我的历史堆栈中有这个,我使用意图标志删除它。

芬兰湾的科特林版:

val intent = Intent(ACTION_APPLICATION_DETAILS_SETTINGS)
    with(intent) {
       data = Uri.fromParts("package", requireContext().packageName, null)
       addCategory(CATEGORY_DEFAULT)
       addFlags(FLAG_ACTIVITY_NEW_TASK)
       addFlags(FLAG_ACTIVITY_NO_HISTORY)
       addFlags(FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS)
    }

startActivity(intent)

根据官方的棉花糖权限视频(在4米43秒的标记),你必须打开应用程序设置页面(从那里它是一个点击到权限页面)。

打开设置页面,你要做的就是

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

Kotlin风格。

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

打开特定应用程序的权限界面

            if (ContextCompat.checkSelfPermission(
                    context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED
            ) {
                //Permission is not granted yet. Ask for permission.
                val alertDialog = AlertDialog.Builder(context)
                alertDialog.setMessage(context.getString(R.string.file_permission))
                alertDialog.setPositiveButton("सेटिंग") { _, _ ->
                    val intent = Intent(
                        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
                        Uri.fromParts("package", BuildConfig.APPLICATION_ID, null)
                    )
                    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                    context.startActivity(intent)
                }
                alertDialog.setNegativeButton("हाँ") { _, _ ->
                    ActivityCompat.requestPermissions(
                        context as Activity, arrayOf(
                            Manifest.permission.WRITE_EXTERNAL_STORAGE
                        ), 1
                    )
                }
                alertDialog.show()
            } else {}