我有一个奇怪的android权限拒绝,这是它:
java.lang.SecurityException: Permission Denial: isUserRunning() from pid=1078, uid=10284 requires android.permission.INTERACT_ACROSS_USERS我没有找到任何关于android.permission.INTERACT_ACROSS_USERS的东西,只找到了android.permission.INTERACT_ACROSS_USERS_FULL
下面是完整的logcat:
java.lang.SecurityException: Permission Denial: isUserRunning() from pid=25403, uid=10310 requires android.permission.INTERACT_ACROSS_USERS
at android.os.Parcel.readException(Parcel.java:1693)
at android.os.Parcel.readException(Parcel.java:1646)
at android.app.ActivityManagerProxy.isUserRunning(ActivityManagerNative.java:7000)
at android.os.UserManager.isUserUnlocked(UserManager.java:1069)
at android.os.UserManager.isUserUnlocked(UserManager.java:1063)
at com.android.launcher3.compat.UserManagerCompatVN.isUserUnlocked(UserManagerCompatVN.java:39)
at com.android.launcher3.LauncherModel$LoaderTask.loadWorkspace(LauncherModel.java:1759)
at com.android.launcher3.LauncherModel$LoaderTask.loadAndBindWorkspace(LauncherModel.java:1387)
at com.android.launcher3.LauncherModel$LoaderTask.run(LauncherModel.java:1486)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.os.HandlerThread.run(HandlerThread.java:61)我已经将这个添加到我的清单中:
<permission android:name="android.permission.INTERACT_ACROSS_USERS" android:protectionLevel="signature"/>
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>发布于 2019-12-18 00:41:13
TL;DR;此堆栈跟踪不属于您的应用程序,或者您需要一个您没有的权限。要了解这些权限,请阅读其余内容。
虽然米歇尔可能已经找到了答案,但我还是决定回答这个问题,因为它可能对其他人有用。这里提到的权限是signature|系统级权限。要了解有关不同类型权限的更多信息,请阅读以下内容:Permissions overview
基本上,使用多用户API需要这些权限,例如:
Context.startActivityAsUser(Intent, UserHandle)
Context.bindServiceAsUser(Intent, …, UserHandle)
Context.sendBroadcastAsUser(Intent, … , UserHandle)
Context.startServiceAsUser(Intent, …, UserHandle)要了解更多信息,请阅读以下内容:Supporting Multiple Users和Building Multiuser-Aware Apps
由于这个错误,米歇尔得出了这样的结论:他必须将这些权限添加到清单中(我们将看到应用程序如何可能授予这些权限),但他已经定义了这些权限(要了解有关定义权限的更多信息,请阅读以下内容:Define a Custom App Permission):
<permission android:name="android.permission.INTERACT_ACROSS_USERS" android:protectionLevel="signature"/>
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" android:protectionLevel="signature"/>我认为你最终会看到一个运行时错误,因为你不能定义这些权限,因为它们与已经定义的两个系统权限同名。想要确定吗?看一看真实系统清单的一部分:
<!-- @SystemApi @hide Allows an application to call APIs that allow it to do interactions
across the users on the device, using singleton services and
user-targeted broadcasts. This permission is not available to
third party applications. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS"
android:protectionLevel="signature|system|privileged" />
<!-- @hide Fuller form of {@link android.Manifest.permission#INTERACT_ACROSS_USERS}
that removes restrictions on where broadcasts can be sent and allows other
types of interactions. -->
<permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL"
android:protectionLevel="signature" />您可以在android系统的清单文件中看到,这些权限已经定义,要使用它们,我们应该使用标签。
因此,现在让我们讨论如何将这些权限授予您的应用程序。根据我的经验,OEM以一种可以授予这些权限的方式定义系统清单
与系统具有相同签名的
下的应用程序开发的应用程序
在我上面提到的系统清单中,第二个权限仅被定义为签名,因此只有与系统具有相同签名的应用程序才能获得这些权限。
如果你在设备上有写权限(可能它应该是根目录,我对此了解不多),你可以通过以下命令将apk复制到priv-app文件夹中:
adb push path-to-your-app/your-app.apk /system/priv-app就这些吗?还没!
从Android8.0开始,在priv-app下授予应用程序的权限有一些复杂之处,您可以在此处阅读:Privileged Permission Whitelisting
发布于 2017-05-19 17:54:59
您应该在Android运行时实现权限请求,特别是针对Marshmallow或更高版本。如果您没有实现运行时权限,那么您的应用程序将会崩溃,或者无法在具有Marshmallow的设备上正常工作。
我希望你现在已经很清楚棉花糖中的运行时权限概念了。让我们来理解一下这段代码:
int currentAPIVersion = Build.VERSION.SDK_INT;
if(currentAPIVersion>=android.os.Build.VERSION_CODES.M)
{
if (ContextCompat.checkSelfPermission(context, Manifest.permission.INTERACT_ACROSS_USERS) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) context, Manifest.permission.INTERACT_ACROSS_USERS)) {
AlertDialog.Builder alertBuilder = new AlertDialog.Builder(context);
alertBuilder.setCancelable(true);
alertBuilder.setTitle("Permission necessary");
alertBuilder.setMessage("Interact across users permission is necessary to this app");
alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.INTERACT_ACROSS_USERS}, MY_PERMISSIONS_REQUEST_INTERACT_ACROSS_USERS);
}
});
AlertDialog alert = alertBuilder.create();
alert.show();
} else {
ActivityCompat.requestPermissions((Activity)context, new String[]{Manifest.permission.INTERACT_ACROSS_USERS}, MY_PERMISSIONS_REQUEST_INTERACT_ACROSS_USERS);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
switch (requestCode) {
case MY_PERMISSIONS_REQUEST_INTERACT_ACROSS_USERS:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// do something here...
Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();
} else {
//code for deny
Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
}
break;
}
}https://stackoverflow.com/questions/43556869
复制相似问题