我对新的Android Marshmallow版本有疑问:
通过Intent或类似方式显示特定应用的权限屏幕是否可行?
可以使用以下代码显示应用程序设置 - 是否有直接打开权限屏幕的模拟解决方案?
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null)));
我已经对此进行了一些研究,但我无法找到合适的解决方案 - 我将非常感谢您的帮助!
答案 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);
示例输出
答案 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)
可能
虽然您无法直接看到设置页面,但您可以更改访问权限。
一个很好的例子:
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);
}