【问题标题】:Error launching the app main activity via an intent in a library通过库中的意图启动应用程序主活动时出错
【发布时间】:2014-08-24 14:33:07
【问题描述】:

在我的应用程序中,我需要按照 SO 上的其他几个线程中记录的以下方式启动主要活动:

final String packageName = getApplicationContext().getPackageName();
final Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
startActivity(launchIntent);

上面的代码行在我的 Android 库项目中,因为在这个地方我不知道我的 Main 活动的类。

在测试设备上通过 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 setting for user asks to run as user -2 but is call from user 0;这需要 android.permission.INTERACT_ACROSS_USERS_FULL 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 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): 在 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):在 com.android.server.SystemServer.init1(本机方法) 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 com.android.server.SystemServer.main(SystemServer.java:2012) 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 java.lang.reflect.Method.invoke(Method.java:525) 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 07-03 13:54:19.843: E/DatabaseUtils(2344): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 07-03 13:54:19.843:E/DatabaseUtils(2344):在 dalvik.system.NativeStart.main(本机方法)

有人遇到过同样的问题吗?

编辑:
我没有提到 SO 中的几个线程提到“android.permission.INTERACT_ACROSS_USERS_FULL 是签名级别的权限。除非它与系统具有相同的签名,否则您的应用将无法使用它。 em>"

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:
删除与问题无关的堆栈。

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    引用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
    }
    

    【讨论】:

    • 是的,我已经读过这个并且应该在我的问题中提到它。但正如我看到其他程序员使用上述代码,这应该是可能的......除非在一个 Android API 级别出现限制。
    • 这可能是一个很好的提示,上面的一行代码我访问外部存储但我的应用程序具有 WRITE_EXTERNAL_STORAGE 权限。我会改进我的错误处理和搜索方式,谢谢。
    【解决方案2】:

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

    【讨论】:

    • 这不是问题,当您忘记在清单中添加活动时,您会得到一个明确的异常 ActivityNotFoundException。
    【解决方案3】:

    不幸的是系统没有:

    • 抛出任何异常
    • 记录错误原因

    我的问题中的异常与问题无关,也没有在其他设备上登录。

    我们现在使用以下适用于所有设备的解决方法来解决问题并从 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);
        }
    }
    

    【讨论】:

    • 你好!我得到了和你以前一样的错误,这真是令人沮丧!虽然,当我尝试建立 UDP 连接并向服务器发送消息时出现错误......你有没有机会给我一些关于如何解决它的提示?
    • 如上所述,SecurityException 与我启动主要活动的问题无关。上述解决方法通过使用主活动类名称重新创建意图,解决了使用包管理器获取空启动意图的问题。
    猜你喜欢
    • 2016-10-10
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2023-03-06
    • 1970-01-01
    • 2018-05-26
    相关资源
    最近更新 更多