意図のためのアクティビティの解決の問題-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();
エミュレータと私が持っている3つのAndroidデバイスでうまく機能します。
最近、ユーザーからエラーレポートの取得を開始し、Error Logが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)
解決 2
Androidソースを使用していくつかの調査を行いましたが、コードが正しいというCommonswareに同意する傾向があります。私は実際に3週間前にそれを再設計して、意図の代わりにpackagemanager.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 info = pm.Resolveactivity(this、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);
}
}
だからこの時点で、私はこれについて何もできないという結論に達しました:(
他のヒント
テスラコイルソフトウェアのケビンはこちら。戻ってくるのが遅れてすみません。これは、アプリでホームコンポーネントを取得するために使用しているものです。
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;
}
デフォルトのセットがない場合はリゾルバーアクティビティを返すように見えるため、解像度は通常NULLを返しません。しかし、一部の電話などでは、物事を面白く保つためだけにヌルを返すかもしれません。おそらくResolveactivityInfoは解像度を呼び出しますが、nullケースを適切に処理しません。