android - 解决 Intent Activity 的问题 - resolveActivityInfo()

标签 android android-activity android-intent resolve

我正在使用 resolveActivityInfo 来确定我的应用程序是否被设置为家庭启动器:

    PackageManager pm = getPackageManager();

    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_HOME);   

    userHomePackage = intent.resolveActivityInfo(pm, 0).packageName;
    userHomeActivityClass = intent.resolveActivityInfo(pm, 0).name;     
currentHomeLauncherName = intent.resolveActivityInfo(pm, 0).loadLabel(pm).toString();

它在模拟器和我手头上的三个安卓设备上运行良好。

最近我开始收到来自用户的错误报告,错误日志显示 resolveActivityInfo 失败。正如我所见,这仅发生在运行 android 2.1 update 1 的少数手机上。由于这个问题,我已经收到很多关于我的应用程序的正面评论和一些负面评论。

任何建议可能是错的?

java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.setAsHomeApplicationBeforeFroyo(Launcher.java:336)

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.myapp.myappname/com.myapp.myappname.Launcher}: java.lang.NullPointerException
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2497)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2513)
    at android.app.ActivityThread.access$2200(ActivityThread.java:119)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1864)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:4370)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:521)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
    at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141)
    at com.myapp.myappname.Launcher.showNextActivity(Launcher.java:122)
    at com.myapp.myappname.Launcher.onCreate(Launcher.java:59)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2460)
    ... 11 more
java.lang.NullPointerException
    at android.os.Parcel.readException(Parcel.java:1224)
    at android.os.Parcel.readException(Parcel.java:1206)
    at android.content.pm.IPackageManager$Stub$Proxy.resolveIntent(IPackageManager.java:1418)
    at android.app.ApplicationContext$ApplicationPackageManager.resolveActivity(ApplicationContext.java:2046)
    at android.content.Intent.resolveActivityInfo(Intent.java:3790)
    at com.myapp.myappname.Launcher.showHomeChooserDialog(Launcher.java:141)

最佳答案

来自 TeslaCoil Software 的 Kevin。很抱歉延迟回复您。这就是我用来在我的应用程序中获取 Home 组件的方法:

public static ComponentName getHomeComponent(PackageManager PM) {
    Intent home_intent = new Intent("android.intent.action.MAIN");
    home_intent.addCategory("android.intent.category.HOME");
    home_intent.addCategory("android.intent.category.DEFAULT");

    ComponentName cn = home_intent.resolveActivity(PM);
    if (cn == null)
        Log.v(TAG, "[Default] package:null");
    else
        Log.v(TAG, "[Default] package:" + cn.getPackageName() + " class:" + cn.getClassName());

    return cn;
}

resolveActivity 通常不会返回 null,因为如果没有默认设置,它似乎会返回解析器 Activity 。但在某些手机或其他东西上,它可能会返回 null 只是为了让事情变得有趣。也许 resolveActivityInfo 调用 resolveActivity 但没有正确处理 null 情况。

关于android - 解决 Intent Activity 的问题 - resolveActivityInfo(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4867106/

相关文章:

android - 新工具栏的 AppCompatActivity 没有正确显示主页按钮?

android - 无法在 Android 水平 ListView 中随图像滚动

Android 使用 if 语句打开 Intent

android - 带或不带 ConvertView 的 Listview == null

android - view.setOnTouchListener(listener) 是多播吗?它是如何工作的?

java - 如何判断app是否被 "Share-Via"调用?

android - 在 Android Activity 之间运行自定义动画

java - 需要有关 android 中的 listitem click 的帮助

android - 使用 Zxing 条码扫描器导致 SecurityException

android - 如果我只做 android 开发,使用 flutter 是个好主意吗?