在我的应用程序中,我需要按照SO上的其他几个线程中记录的方式启动主要活动:
final String packageName = getApplicationContext().getPackageName();
final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(launchIntent);
以上代码行在我的Android库项目中,因为我不知道在这个地方我的主要活动类。
当在测试设备上通过USB接口部署应用程序时,这就像一个魅力,但在4.3设备上从Google Play安装应用程序时会出现此错误。
<击> 07-03 13:54:19.843:E / DatabaseUtils(2344):向包裹写入例外 07-03 13:54:19.843:E / DatabaseUtils(2344):java.lang.SecurityException:Permission Denial:用户的get / set设置要求以用户-2运行,但是从用户0调用;这需要android.permission.INTERACT_ACROSS_USERS_FULL 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:13140) 07-03 13:54:19.843:E / DatabaseUtils(2344):在android.app.ActivityManager.handleIncomingUser(ActivityManager.java:2038) 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.providers.settings.SettingsProvider.callFromPackage(SettingsProvider.java:607) 07-03 13:54:19.843:E / DatabaseUtils(2344):在android.content.ContentProvider $ Transport.call(ContentProvider.java:279) 07-03 13:54:19.843:E / DatabaseUtils(2344):在android.content.ContentProviderNative.onTransact(ContentProviderNative.java:273) 07-03 13:54:19.843:E / DatabaseUtils(2344):在android.os.Binder.execTransact(Binder.java:388) 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.server.SystemServer.init1(Native Method) 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.server.SystemServer.main(SystemServer.java:2012) 07-03 13:54:19.843:E / DatabaseUtils(2344):at java.lang.reflect.Method.invokeNative(Native Method) 07-03 13:54:19.843:E / DatabaseUtils(2344):at java.lang.reflect.Method.invoke(Method.java:525) 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1046) 07-03 13:54:19.843:E / DatabaseUtils(2344):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 07-03 13:54:19.843:E / DatabaseUtils(2344):at dalvik.system.NativeStart.main(Native Method) 击>
有人遇到过同样的问题吗?
修改:
<击>
我没有提到SO中的几个线程提到&#34; android.permission.INTERACT_ACROSS_USERS_FULL是签名级别权限。您的应用程序将无法使用它,除非它与系统具有相同的签名。&#34;
Permission Denial: startActivity asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
Permission Denial: this requires android.permission.INTERACT_ACROSS_USERS_FULL
What do I do about: this requires android.permission.INTERACT_ACROSS_USERS_FULL
但由于上述代码似乎被其他开发人员使用,我仍然希望找到解决方案。
击>
编辑2 :
删除与问题无关的堆栈。
答案 0 :(得分:0)
引自what-do-i-do-about-this-requires-android-permission-interact-across-users-full,
android.permission.INTERACT_ACROSS_USERS_FULL
是签名级别权限。除非它与系统具有相同的签名,否则您的应用将无法使用它。
<强>更新强>
你有android.permission.WRITE_EXTERNAL_STORAGE
吗?
此链接可以为您提供帮助 - How permission can be checked at runtime without throwing SecurityException?
您的顾虑 -
PackageManager pm = context.getPackageManager();
int hasPerm = pm.checkPermission(
android.Manifest.permission.WRITE_EXTERNAL_STORAGE,
context.getPackageName());
if (hasPerm != PackageManager.PERMISSION_GRANTED) {
// do stuff
}
答案 1 :(得分:0)
不幸的是系统没有:
我的问题中的例外与问题无关,并且未在其他设备上记录。
我们使用以下适用于所有设备的解决方法来解决问题并从Android库启动主要活动:
protected void startMainActivityWithWorkaround() throws NameNotFoundException, ActivityNotFoundException {
final String packageName = getPackageName();
final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
if (launchIntent == null) {
Log.e(LOG_TAG, "Launch intent is null");
} else {
final String mainActivity = launchIntent.getComponent().getClassName();
Log.d(LOG_TAG, String.format("Open activity with package name %s / class name %s", packageName, mainActivity));
final Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setComponent(new ComponentName(packageName, mainActivity));
// optional: intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}
答案 2 :(得分:0)
检查以确保您没有忘记在清单中添加活动。