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

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

是否可以显示“应用程序权限”;通过Intent或类似的东西来筛选特定的应用程序?

Android M Permission Screen

可以显示应用程序的“应用程序信息”;在“设置”界面中输入以下代码:

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

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

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

227361 次浏览

我也试着这么做。我可以找出包名和将要启动的活动。但最终您将得到一个安全异常,因为您无法声明缺少的权限。

更新:

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

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

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

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

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

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

这不可能 to pragmatic get permission… 但我建议你把这行代码放在try{} catch{}中,这会让你的应用不幸地停止…

在catch主体中,创建一个对话框,将用户导航到一个小教程,以启用其他应用程序的权限。 然后在是的按钮上单击添加此代码…

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

这一意图是直接打开其他应用程序的列表来管理权限,然后从这里,它是一个点击绘制其他应用程序的权限。

我知道这是你正在寻找的答案…但我在我的应用程序中这样做…

相反,你可以用一行来打开特定应用程序的一般设置:

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

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

< p > Intent.FLAG_ACTIVITY_NEW_TASK < br >,, 可选> < /强。如果设置,则打开设置屏幕(活动)作为新活动。否则,它将在当前运行的活动中打开。

< p > Uri.fromParts("package", getPackageName(), null) < br >,, 准备或创建URI,而getPackageName() -返回应用程序包的名称

< p > intent.setData(uri) < br >,, 不要忘记设置。否则,你会得到 android.content.ActivityNotFoundException。__abc3 __abc1 __abc4

如果我们谈论的是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的答案

Xamarin form Android:

//---------------------------------------------------------
public void OpenSettings()
//---------------------------------------------------------
{
var intent = new Intent(Android.Provider.Settings.ActionApplicationDetailsSettings,
Android.Net.Uri.Parse("package:" + Forms.Context.PackageName));
Forms.Context.StartActivity(intent);
}

不可能以编程方式打开权限屏幕。相反,我们可以打开应用程序设置屏幕。

代码

Intent i = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID));
startActivity(i);

样例输出

enter image description here

也许这对你有帮助

private void openSettings() {
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
Uri uri = Uri.fromParts("package", getPackageName(), null);
intent.setData(uri);
startActivityForResult(intent, 101);
}

芬兰湾的科特林的风格。

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

根据Android 文档

试试这个

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.setComponent(new ComponentName(appDetails.packageName,"com.android.packageinstaller.permission.ui.ManagePermissionsActivity"));
startActivity(intent);

从Android 11开始,你可以使用如下代码直接为只有位置权限打开特定于应用程序的设置页面

然而,上述方法只会有效一次。如果用户拒绝许可,甚至不小心关闭了屏幕,应用程序永远不会触发它再次出现。

除此之外,答案与Android 11之前一样——你能做的最好的事情就是打开应用程序特定的设置页面,让用户手动下钻两层以启用适当的权限。

val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
val uri: Uri = Uri.fromParts("package", packageName, null)
intent.data = uri
// This will take the user to a page where they have to click twice to drill down to grant the permission
startActivity(intent)


在这里查看我的相关问题:Android 11用户不能授予后台位置权限?

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

            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 {}

在芬兰湾的科特林

    /*
*
* 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)
}

以上是测试和工作代码,希望对大家有所帮助。