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

时间:2015-09-28 11:40:08

标签: android android-permissions android-6.0-marshmallow

我对新的Android Marshmallow版本有疑问:

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

Android M Permission Screen

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

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

我已经对此进行了一些研究,但我无法找到合适的解决方案 - 我将非常感谢您的帮助!

13 个答案:

答案 0 :(得分:392)

根据官方Marshmallow权限视频(4m 43s mark),您必须打开应用程序“设置”页面(从那里只需单击一次“权限”页面)。

要打开设置页面,您可以

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

答案 1 :(得分:171)

这是不可能的。 我也试过这样做。我可以找出包名称和将要启动的活动。但最终你会得到一个安全例外,因为你无法申报失去许可。

更新:

关于其他答案,我还建议打开应用程序设置屏幕。我使用以下代码执行此操作:

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

由于我不希望在我的历史堆栈中有这个,我使用意图标记删除它。

答案 2 :(得分:59)

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
打开App的详细信息设置页面。用户必须手动分配所需的权限。

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

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

<强> intent.setData(uri)
不要忘记设置此 。否则,您将获得 android.content.ActivityNotFoundException因为您已将您的意图设置为 Settings.ACTION_APPLICATION_DETAILS_SETTINGS 并且Android希望搜索某个名称。

答案 3 :(得分:31)

相反,您可以使用一行

打开特定应用的常规设置
 startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + BuildConfig.APPLICATION_ID)));

答案 4 :(得分:5)

无法以实用方式打开权限屏幕。相反,我们可以打开应用设置屏幕。

<强>代码

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

示例输出

enter image description here

答案 5 :(得分:3)

如果我们谈论的是 FLYME OS (魅族),那么它就有自己的具有权限的安全应用。

要打开它,请使用以下意图:

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

答案 6 :(得分:3)

如果您想在Kotlin中编写更少的代码,可以执行此操作:

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

基于Martin Konecny回答

答案 7 :(得分:3)

也许这会对您有帮助

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

答案 8 :(得分:2)

Xamarin表示Android:

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

答案 9 :(得分:1)

无法以实用方式获取权限...... 但是生病建议你把这行代码放在try {} catch {}中,这会让你的app不幸停止... 并在catch body中创建一个对话框,该对话框将用户导航到小教程以启用绘制其他应用程序权限... 然后点击是按钮点击这个代码...

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

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

答案 10 :(得分:0)

从Android 11开始,您可以使用以下代码直接打开仅针对位置权限的应用特定设置页面:requestPermissions(arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION), PERMISSION_REQUEST_BACKGROUND_LOCATION)

但是,上述方法只能使用一次。如果用户拒绝该许可,甚至不小心关闭了屏幕,该应用程序将永远不会触发它再次出现。

除了上述内容外,答案仍然与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 users can’t grant background location permission?

答案 11 :(得分:-1)

尝试一下

TypeError: undefined is not an object (evaluating 'route.params.openModal')

答案 12 :(得分:-14)

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

}