通过库中的intent启动应用程序主活动时出错

时间:2014-07-03 12:50:50

标签: android android-permissions

在我的应用程序中,我需要按照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
删除与问题无关的堆栈。

3 个答案:

答案 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)

检查以确保您没有忘记在清单中添加活动。