проблема с разрешением действия для намерения - resolActivityInfo () - PullRequest
5 голосов
/ 01 февраля 2011

Я использую resolActivityInfo, чтобы определить, было ли мое приложение установлено в качестве домашней программы запуска:

    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();

отлично работает на эмуляторе и трех устройствах Android, которые у меня есть на руках.

Недавно я начал получать отчеты об ошибках от моих пользователей, и журнал ошибок показывает, что метод executeActivityInfo не работает. Это происходит только на нескольких телефонах, работающих на Android 2.1 обновление 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)

OR

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)

Ответы [ 2 ]

4 голосов
/ 19 февраля 2011

Кевин из TeslaCoil Software здесь.Извините за задержку с вами.Это то, что я использую, чтобы получить компонент 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;
}

resolActivity обычно не возвращает ноль, так как кажется, что оно возвращает активность распознавателя, если не установлено значение по умолчанию.Но на некоторых телефонах или чем-то еще он может возвращать ноль только для того, чтобы все было интересно.Возможно, resolActivityInfo вызывает resolActivity, но неправильно обрабатывает нулевой регистр.

1 голос
/ 20 февраля 2011

провел некоторые исследования с источником Android, и теперь я склонен согласиться с Commonsware, что мой код верен. Я фактически перепроектировал это 3 недели назад, чтобы использовать packagemanager.resolveActivity вместо intent.resolveactivity:

this.pm = context.getPackageManager();

    try {
        Intent homeintent = new Intent(Intent.ACTION_MAIN);
        homeintent.addCategory(Intent.CATEGORY_HOME);
        homeintent.addCategory(Intent.CATEGORY_DEFAULT);// seems not needed here since This is a synonym for
                                // including
        // the CATEGORY_DEFAULT in your supplied Intent per doc

        this.resolveInfo = pm.resolveActivity(homeintent, PackageManager.MATCH_DEFAULT_ONLY);

        ActivityInfo activityInfo = resolveInfo.activityInfo;

        userHomeLauncherPackage = activityInfo.packageName;
        userHomeLauncherClass = activityInfo.name;

        userHomeLauncherName = activityInfo.loadLabel(pm).toString();

        if (userHomeLauncherClass.contains("ResolverActivity"))
        userHomeLauncherName = "";

    } catch (Exception e) {
        throw new Exception(e);
    }

Это не помогло, так что иногда я получаю эти ошибки ...

На основании исходного кода,

ComponentName Intent.resolveActivity (PackageManager pm)

или

ActivityInfo Intent.resolveActivityInfo (PackageManager pm, int flags)

вызовите тот же метод, который определен в классе android.app.ContextImpl:

ResolveInfo информация = pm.resolveActivity (это, PackageManager.MATCH_DEFAULT_ONLY)

и определяется как:

        @Override
    public ResolveInfo resolveActivity(Intent intent, int flags) {
        try {
            return mPM.resolveIntent(
                intent,
                intent.resolveTypeIfNeeded(mContext.getContentResolver()),
                flags);
        } catch (RemoteException e) {
            throw new RuntimeException("Package manager has died", e);
        }
    }

поэтому в этот момент я пришел к выводу, что ничего не могу с этим поделать: (

...