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


330

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

是否可以通过Intent或类似方法显示特定应用程序的权限屏幕?

Android M权限屏幕

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

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

我已经对此进行了一些研究,但无法找到合适的解决方案-我将不胜感激!


试试这个可能是可行的stackoverflow.com/a/41221852/5488468
Bipin Bharti

Answers:


443

根据官方的棉花糖权限视频(在4m 43s标记处),您必须改为打开应用程序的“设置”页面(从那里一键单击到“权限”页面)。

要打开设置页面,您需要

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

12
它将重定向到“应用程序”屏幕的常规详细信息。如何才能转到专门的“应用程序权限”屏幕。我也不想剩下一击,
Milind Mevada

5
@MilindMevada-您目前无法这样做。
Martin Konecny

您可以使用意图将数据从设置活动实时发送到您的活动吗?发行面向IM正在处理您的活动这些数据一旦它得到了从设置发送。
ThunderWiring '17

这在调试应用程序时有效,但在对APK签名后没有任何真正的原因而崩溃。在logcat中也没有什么明显的。
JCutting8 '19

181

这不可能。我也尝试这样做。我可以弄清楚软件包名称和将要开始的活动。但是最后,由于缺少您无法声明的权限,您将获得一个安全异常。

更新:

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

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

因为我不想在我的历史记录堆栈中使用它,所以我使用意图标志将其删除。


我经历过同样的事情,并认为可能有解决方法/另一种解决方案...:-/
Frederik Schweiger 2015年

不,不幸的是,这是无法通过设计实现的。有关更多信息,请查看Google+上的讨论:goo.gl/Wqjjff
Frederik Schweiger

1
@Mulgard Whatsapp必须使用targetSdk =“ 23”。这允许应用程序提示用户启用权限。如果目标SDK <23,则可以向用户显示应用程序权限屏幕很有用,但是似乎我们只能显示常规的应用程序设置屏幕。
vman

4
当在设置屏幕中显示弹出窗口时,Intent.FLAG_ACTIVITY_NO_HISTORY有时可能会在平板电脑上引起问题,它将关闭设置屏幕。只需删除该标志即可解决此问题。
威灵

2
您可以同时显示Toast,指示用户进入“权限”(即使您的应用程序的其余部分无法用用户的语言显示,也可以将消息本地化)
vgergo,

81
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 并且android期望搜索到某个名称。


从字面上看,这是最受好评的答案。为什么要重复此操作而不扩展原始答案?!
Thomas Keller

1
感谢您的深入解释。
David Refoua

34

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

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

您可能要使用getActivity()。getPackageName()来获取程序包名称,具体取决于构建的配置方式。
科里·罗伊

15

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

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

样本输出

在此处输入图片说明


1
他请求允许页面
行家ツ

10

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

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

根据Martin Konecny的回答


很好地使用Kotin扩展程序
David Jarvis

7

科特林风格。

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

5

也许这会帮助你

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

3

如果我们谈论的是FLYME OS(魅族)ONLY有它自己的安全应用程序的权限。

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

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


3

Xamarin Forms Android:

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

0

务实地获得许可是不可能的...但是生病的建议您将这行代码放入try {} catch {}中,不幸的是,这会使您的应用停止运行...然后在catch主体中创建一个对话框,该对话框将导航到用户进入小型教程以启用其他应用程序的绘制权限...然后在是按钮上单击以将此代码放置...

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

目的是直接打开其他应用程序的绘制列表以管理权限,然后从此处单击以绘制其他应用程序的权限...我知道这不是您要查找的答案...但是我在我的应用程序中这样做...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.