Проблема с разрешением активности для намерения - ResolveActivityInfo ()
-
28-10-2019 - |
Вопрос
Я использую 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;
}
Релеустейность обычно не возвращает нуль, так как, похоже, возвращает активность резолюра, если нет набора по умолчанию. Но на некоторых телефонах или что -то в этом роде это может вернуть ноль, чтобы все было интересно. Возможно, разрешаемость, вызывает резолютивность, но не обрабатывает нулевой корпус должным образом.