web-dev-qa-db-ja.com

PackageManager.addPreferredActivity()を使用するにはどうすればよいですか?

SDK 1.5では、PackageManagerクラスを使用して、PackageManager.addPackageToPreferred()を使用して優先ホーム画面をアプリに設定していました。新しいSDK(2.1を使用)では、これは非推奨になっているため、同じ結果に対してaddPreferredActivity()を使用しようとしていますが、期待どおりに機能していません。

いくつかの必要な背景。ロック画面の置換アプリを作成しているので、ホームキーでアプリを起動します(アプリは既に実行されているため、キーを無効にする効果があります)。ユーザーが画面の「ロックを解除」すると、すべてが正常に機能するようにマッピングを復元する予定です。

私のAndroidManifest.xmlには次のものがあります。

<intent-filter>
    <action Android:name="Android.intent.action.MAIN" />
    <category Android:name="Android.intent.category.LAUNCHER" />
    <category Android:name="Android.intent.category.HOME"/>
    <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
<uses-permission Android:name="Android.permission.SET_PREFERRED_APPLICATIONS">
</uses-permission>

私のコードには、次のスニペットがあります。

// Set as home activity
// This is done so we can appear to disable the Home key.
PackageManager pm = getPackageManager();
//pm.addPackageToPreferred(getPackageName());

IntentFilter filter = new IntentFilter("Android.intent.action.MAIN");
filter.addCategory("Android.intent.category.HOME");
filter.addCategory("Android.intent.category.DEFAULT");

ComponentName[] components = new ComponentName[] 
{
    new ComponentName("com.Android.launcher", ".Launcher")
};

Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(),
MyApp.class.getName());

pm.clearPackagePreferredActivities("com.Android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY,
components, component);

結果として、ホームキーを押すとアプリチューザーが表示されます。これは、clearPackagePreferredActivities()呼び出しは機能しましたが、アプリが優先として追加されなかったことを示しています。また、以下のログの最初の行は、「インテントの優先アクティビティを削除する」ことについて何かを示しています。

04-06 02:34:42.379:INFO/PackageManager(1017):結果セットが変更され、インテントの優先アクティビティが削除されました{act = Android.intent.action.MAIN cat = [Android.intent.category.HOME] flg = 0x10200000} nullと入力します

04-06 02:34:42.379:INFO/ActivityManager(1017):アクティビティを開始しています:Intent {act = Android.intent.action.MAIN cat = [Android.intent.category.HOME] flg = 0x10200000 cmp = Android/com。 Android.internal.app.ResolverActivity}

この最初のログメッセージの意味を知っている人はいますか?たぶん私はAPIを正しく使用していません、何かアイデアはありますか?どんな助けでも大歓迎です。

19
afonseca

@afonseca:私は同じ問題を扱っていました。コードをありがとう、私は最初にそれを使用しました。シモンにも感謝します。私は彼の答えを私のものに統合しました。コードが機能しています(1.6および2.1アップデート1)。少し調整されていますが、2つの主な変更点はShimonsの提案のようで、「。Launcher」は「com.Android.launcher.Launcher」に変更されました。作業コードは以下に掲載されています。

チャオ、a2ronus

PackageManager pm = getPackageManager();

IntentFilter filter = new IntentFilter();
filter.addAction("Android.intent.action.MAIN");
filter.addCategory("Android.intent.category.HOME");
filter.addCategory("Android.intent.category.DEFAULT");

Context context = getApplicationContext();
ComponentName component = new ComponentName(context.getPackageName(), TestReplaceHomeAppActivity.class.getName());

ComponentName[] components = new ComponentName[] {new ComponentName("com.Android.launcher", "com.Android.launcher.Launcher"), component};

pm.clearPackagePreferredActivities("com.Android.launcher");
pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, component);
11
a2ronus

この答えは少し遅れるかもしれませんが、APIドキュメントはclearPackagePreferredActivitiesについて述べています。

アプリケーションは、それ自体のパッケージのみをクリアできます。

したがって、「マッピングの復元」でできることは、次のようなものだけだと思います。

getPackageManager().clearPackagePreferredActivities(getPackageName());

そのため、ホーム画面のデフォルト設定をクリアします。

4
Paco Barter

デバイスでcomponents配列をALL HOMEアプリに初期化すると、これはうまくいくようです。

ComponentName[] components = new ComponentName[]
{
   new ComponentName("com.intuitiveui.Android", "com.intuitiveui.Android.Friday"),
   new ComponentName("com.Android.launcher2","com.Android.launcher2.Launcher")
};

私の問題は、これを動的に埋める方法です。

2
Shimon Shnitzer

addPreferredActivityは2.2では機能しなくなり、clearPackagePreferredActivitiesは引き続き機能しますが、これを実行するパッケージの設定のみをクリアできます。

Android googleグループには、この問題とgoogleの公式の立場(今のところ)について、ユーザーの好みを上書きする方法を提供しないというスレッドがたくさんあります。

1
mishkin