他アプリにおける「デフォルトでの起動」(homeアプリ)解除について

1,324 views
Skip to first unread message

片倉詩生

unread,
Oct 27, 2014, 10:32:47 PM10/27/14
to android-g...@googlegroups.com
参考になる文献が見つけられず質問させていただきます。

当方、homeアプリを作成しております。
ボタン押下の度に暗黙的intentから、homeアプリを抽出、選択でデフォルトに設定したい。

やりたい事
 ボタン押下時に、現在のhomeアプリの「デフォルトでの起動設定」を解除したい

できない事
 他アプリがhomeアプリに設定されている時、そのアプリの「デフォルトでの起動設定」が解除出来ない


onClick内ソース
-------------------------------------------------------------------------------------------------------------------------------start

Intent intent= new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);

PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);

for (ResolveInfo info : list) {
List<IntentFilter> filters = new ArrayList<IntentFilter>();
List<ComponentName> activities = new ArrayList<ComponentName>();
pm.getPreferredActivities(filters, activities, info.activityInfo.packageName);

                                        if (activities.size() > 0) {
                                        pm.clearPackagePreferredActivities(activities.get(0).getPackageName());
                                        break;
                                        }
}

startActivity(intent);


-------------------------------------------------------------------------------------------------------------------------------end

上記だと、自身のアプリがhomeアプリとして「デフォルトでの起動」に設定されていれば、
設定解除→再選択、という動きになりますが、他アプリ(デフォルトホームアプリ等)が設定されていると、
 java.lang.SecurityException: Neither user 10199 nor current process has android.permission.SET_PREFERRED_APPLICATIONS.
で落ちます。
自アプリでは「SET_PREFERRED_APPLICATIONS」のpermissionは宣言してありますが、他アプリに対して適用されない為だと思います。

調べていくうちにcontext.grantUriPermission()メソッドというものも見つけましたが、有用な参考文献が見つけられず使用できていません。


どなたか、実現方法をご存じの方がおりましたらご教授お願い致します。




Shigeo Mutoh

unread,
Oct 27, 2014, 10:46:26 PM10/27/14
to android-g...@googlegroups.com
武藤です。

以前にStackOverflowで見た方法です。というか裏ワザですね。
カラクリは、新しいHomeアプリを突っ込まれたとPackageManagerに
思わせて、Intent.CATEGORY_HOMEを投げるとうまいことHome chooser
が出てくるよ、というもの。お試しください。

AndroidManifest.xml
1 <!-- homeアプリ選択のために使う。実体はない。 -->
2 <activity
3 android:name=".activity.Settings.SettingsActivity$FakeHome"
4 android:enabled="false">
5 <intent-filter>
6 <action android:name="android.intent.action.MAIN" />
7 <category android:name="android.intent.category.HOME" />
8 <category android:name="android.intent.category.DEFAULT" />
9 </intent-filter>
10 </activity>



.activity.Settings.SettingsActivity.java
1 /**
2 * homeアプリ選択のために使う。実体はない.
3 * @author mutoh
4 *
5 */
6 public static class FakeHome extends Activity {
7 }
8
9
10 /**
11 * ニセのhomeアプリをenableすることで、homeアプリ選択画面を表示させる。
12 * @param c
13 */
14 public static void openHomeChooser(Context c) {
15 PackageManager p = c.getPackageManager();
16 ComponentName cN = new ComponentName(c, FakeHome.class);
17 p.setComponentEnabledSetting(cN,
18 PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
19 PackageManager.DONT_KILL_APP);
20
21 Intent selector = new Intent(Intent.ACTION_MAIN);
22 selector.addCategory(Intent.CATEGORY_HOME);
23 c.startActivity(selector);
24
25 p.setComponentEnabledSetting(cN,
26 PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
27 PackageManager.DONT_KILL_APP);
28 }

片倉詩生

unread,
Oct 27, 2014, 10:53:09 PM10/27/14
to android-g...@googlegroups.com
武藤 様

 ご返信ありがとうございます。

 早速試してみます。

 取り急ぎお礼まで。

2014年10月28日火曜日 11時46分26秒 UTC+9 TM:

片倉詩生

unread,
Oct 28, 2014, 1:52:03 AM10/28/14
to android-g...@googlegroups.com
武藤 様

 ご回答いただいた質問を投稿致しました片倉です。

 求めていた動作が実装出来ました。

 ありがとうございます。

 上記をキーワードに検索したところ、StackOverflowにもありました。


 

※上記を今後参考される方の為の補足
上記に
selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
をプラスするだけでhomeアプリのデフォルト設定が解除出来ました。
Reply all
Reply to author
Forward
0 new messages