Проблема с разрешением активности для намерения - ResolveActivityInfo ()

StackOverflow https://stackoverflow.com/questions/4867106

Вопрос

Я использую 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();

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

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

ИЛИ ЖЕ

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

Сделали некоторые исследования с Android Source, и я склонен сейчас согласиться с Commonsware, что мой код правильный. Я на самом деле перепроектировал его 3 недели назад, чтобы использовать packagemanager.resolevactivity вместо намерения. 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:

ResulieNfo info = 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);
        }
    }

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

Другие советы

Кевин из программного обеспечения Teslacoil здесь. Извините за задержку возвращения к вам. Это то, что я использую, чтобы получить домашний компонент в моих приложениях:

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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top