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

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



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

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


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

评论

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

检查此“打开应用程序设置”屏幕Android

#1 楼

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

要打开设置页面,你会做

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


评论


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

–密林达(Milind Mevada)
17-4-3在6:17



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

– Martin Konecny
17年4月3日在15:28

您可以使用意图将数据从设置活动发送到您的活动吗?从设置发送数据后,我面临的问题是如何在您的活动中处理该数据。

–雷电接线
17年8月29日在6:34

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

– JCutting8
19年1月29日在12:03

#2 楼

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

更新:

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

    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
15年9月30日在17:01

不,不幸的是,这不可能通过设计实现。有关更多信息,请在Google+上查看以下讨论:goo.gl/Wqjjff

– Frederik Schweiger
2015年10月15日10:10



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

– vman
16年8月24日在23:47

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

–旋转
16-11-15在11:49



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

–vgergo
18年5月7日在9:15

#3 楼

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,而getPackageName()-返回应用程序包的名称。

Uri.fromParts("package", getPackageName(), null)
别忘了设置它。否则,您将得到intent.setData(uri)。因为您已将您的意图设置为android.content.ActivityNotFoundException,并且android期望可以搜索一些名称。

评论


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

–托马斯·凯勒(Thomas Keller)
19年5月5日在9:47

感谢您的深入解释。

– David Refoua
19-10-20在23:33

#4 楼

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

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


评论


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

–科里·罗伊(Cory Roy)
17年8月17日在22:22

#5 楼

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

代码

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


样品输出



评论


他正在请求权限页面

–Maveňツ
18/12/28在10:43

#6 楼

如果要在Kotlin中编写较少的代码,可以执行以下操作:

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


基于Martin Konecny的答案

评论


很好地使用Kotin扩展

–大卫·贾维斯(David Jarvis)
18/12/20在13:49

#7 楼

科特林风格。

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


#8 楼

可能对您有帮助

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


#9 楼

如果我们只在谈论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。

#10 楼

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


#11 楼

务实地获取许可是不可能的。制作一个对话框,将用户导航到小教程,以启用覆盖其他应用程序的权限...
,然后单击“是”按钮,单击此代码...

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


此意图是直接打开其他应用程序上的绘画列表以管理权限,然后从此处单击即可绘制其他应用程序上的权限...
我知道这不是答案您正在寻找...但是我正在我的应用程序中执行此操作...

#12 楼

从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用户无法授予后台位置权限?

#13 楼

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