Android:更改默认的家庭应用程序

对于一些特定的要求,我需要更改Android默认家庭应用程序与我的自定义家庭应用程序(我的应用程序中的一个设置,将切换默认家庭=我的应用程序或以前的家)

我不希望用户移动非常复杂的android设置。

任何人都可以帮助我,例如它为默认的家庭应用程序注册launcher.apk,或者如何改变它

我唯一能find的就是那个老问题: 如何更改默认的Android桌面应用程序?

但根本没有答案。

我已经看到了市场上的HomeSwitcher能够做到这一点,但是对于那些可能一定会很忙的开发者来说,没有任何答案。

编辑

我在网上find这个http://www.mail-archive.com/android-developers@googlegroups.com/msg74167.html

但是我得到了同样的问题:

这是我的代码:

private void makePreferred() { PackageManager pm = getPackageManager(); IntentFilter f = new IntentFilter("android.intent.action.MAIN"); f.addCategory("android.intent.category.HOME"); f.addCategory("android.intent.category.DEFAULT"); ComponentName cn = new ComponentName("com.example.android.home", "com.example.android.home.Home"); pm.addPreferredActivity(f, IntentFilter.MATCH_CATEGORY_EMPTY, null, cn); 

我在清单中设置了android.permission.SET_PREFERRED_APPLICATIONS 。 执行上面的代码后,日志宣称已经添加了像预期一样的日志(与我从IntentResolver列表中勾选“Make default”时相同的日志)。 然而,当我通过点击回家,列表仍然显示,日志说:

 INFO/PackageManager(52): Result set changed, dropping preferred activity for Intent { act=android.intent.action.MAIN cat= [android.intent.category.HOME] flg=0x10200000 } type null 

所以似乎parsing器删除了默认的条目。 我做错了什么,或者这是一个安全措施? 这背后有什么想法?

Solutions Collecting From Web of "Android:更改默认的家庭应用程序"

我做了一个广泛的研究,从2.2开始,没有办法做到这一点。 唯一的办法是使用一些蹒跚学步的锁应用程序的黑客行为,但这个程序最近把三星手机放在无限循环,所以这是一个冒险的方法。

如果你看看packagemanager类的froyo源代码,你会在addPreferredActivity方法中看到这个小的情况:

 if (getUidTargetSdkVersionLockedLP(Binder.getCallingUid()) < Build.VERSION_CODES.FROYO) { Slog.w(TAG, "Ignoring addPreferredActivity() from uid" + Binder.getCallingUid()); return; } 

HomeSwitcher在2.2上无法正常工作,因为它使用这种方法,开发人员对应用程序页面发表了评论“ 由于API更改,不支持Froyo(2.2)

“结果集已更改”表示匹配该意图的包集已经从您在创build默认设置时指定的集中更改 – 因此缺省值不再有效。 您的组件列表(您当前设置为空)需要包含设备上的所有主屏幕应用程序,而不仅仅是您的设备。

以下是我testing过的示例代码(使用adb shell,开始http://www.google.co.uk/ ),并用于设置默认浏览器。 XXX代表客户名称,我必须熄灭。

请注意,为了调用addPreferredActivity,您必须编译为8(2.2)的最小sdk版本,并且您必须指定了SET_PREFERRED_APPLICATIONS权限。 该权限是保护级别2,因此您需要使用与PackageManager相同的证书进行签名。

 IntentFilter filter = new IntentFilter(); filter.addAction("android.intent.action.VIEW"); filter.addCategory("android.intent.category.DEFAULT"); filter.addDataScheme("http"); Context context = getApplicationContext(); ComponentName component = new ComponentName("com.opera.mini.XXX", "com.opera.mini.XXX.CustomerBrowser"); ComponentName[] components = new ComponentName[] {new ComponentName("com.android.browser", "com.android.browser.BrowserActivity"), component}; pm.addPreferredActivity(filter, IntentFilter.MATCH_CATEGORY_SCHEME, components, component); 

ETA – 如果你标记了这个回应,你能让我知道为什么。 我上面张贴的代码是testing和工作…

这个代码适用于我的ICS设备:我使用的服务对于某个调用来说是合理的,其中一个名为SET_PREFERRED_LAUNCHER,将一个新的默认启动程序包(PREFERRED_PACKAGE_KEY)和一个活动(PREFERRED_ACTIVITY_KEY)

 Method installPackageMethod = null; Method deletePackageMethod = null; Method setPreferredActivityMethod = null; Method replacePreferredActivityMethod = null; Object pm = null; @Override public void onCreate() { super.onCreate(); if (pm == null) pm = getPackageManager(); try { if (setPreferredActivityMethod == null) setPreferredActivityMethod = pm.getClass().getMethod( "addPreferredActivity", IntentFilter.class, int.class, ComponentName[].class, ComponentName.class); } catch (NoSuchMethodException e) { e.printStackTrace(); } } private final class ServiceHandler extends Handler { private Context context; public ServiceHandler(Looper looper, Context ctx) { super(looper); context = ctx; } @Override public void handleMessage(Message msg) { Intent intent = (Intent) msg.getData().getParcelable( UPDATER_SERVICE_ACTION); int request = intent.getIntExtra( REQUEST_KEY, REQUEST_UNKNOWN); Bundle bundle = intent.getExtras(); switch (request) { case INSTALL_APPLICATION: { if (bundle != null) { String appPath = bundle .getString(APP_PATH_KEY); if (appPath != null) { LogUtil.e(TAG, "try to install " + appPath); try { am.installPackage(appPath); } catch (Exception e) { e.printStackTrace(); } LogUtil.e(TAG, "install of " + appPath + " done"); } } break; } case UNISTALL_PACKAGE: { if (bundle != null) { String packagename = bundle .getString(PACKAGE_NAME_KEY); if (packagename != null) { LogUtil.e(TAG, "unistall " + packagename); try { deletePackageMethod .invoke(pm, packagename, null, 0); } catch (Exception e) { e.printStackTrace(); } } } break; } case SET_PREFERRED_LAUNCHER: { if (bundle != null) { String package_name = bundle .getString(PREFERRED_PACKAGE_KEY); if (package_name == null) { LogUtil.e(TAG, "WARNING: setDefaultActivity cannot continue, package is NULL"); return; } String activity_name = bundle .getString(PREFERRED_ACTIVITY_KEY); if (activity_name == null) { LogUtil.e(TAG, "WARNING: setDefaultActivity cannot continue, activity is NULL"); return; } LogUtil.e(TAG, "setDefaultActivity activity=" + activity_name + " package=" + package_name); 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", "com.android.launcher2.Launcher"), new ComponentName(package_name, activity_name) }; ComponentName activity = new ComponentName(package_name, activity_name); try { setPreferredActivityMethod.invoke(pm, filter, IntentFilter.MATCH_CATEGORY_EMPTY, components, activity); } catch (Exception e) { e.printStackTrace(); } } } } } } 

请记住在清单文件中添加此权限:

  <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/> 

用法:

  public void setPreferredLauncher(String activity_name,String package_name) { Intent intent = new Intent(UPDATER_SERVICE_ACTION); intent.putExtra(REQUEST_KEY, SET_PREFERRED_LAUNCHER); intent.putExtra(PREFERRED_ACTIVITY_KEY, activity_name); intent.putExtra(PREFERRED_PACKAGE_KEY, package_name); context.startService(intent); } 

哪里:

  public static final String _UPDATER_SERVICE_ACTION = "com.android.updaterservice.ACTION"; public static final String REQUEST_KEY = "com.android.updaterservice.REQUEST_KEY"; public static final String PACKAGE_NAME_KEY = "com.android.updaterservice.PACKAGE_NAME_KEY"; public static final String APP_PATH_KEY = "com.android.updaterservice.APP_PATH_KEY"; public static final String PREFERRED_ACTIVITY_KEY = "com.android.updaterservice.PREFERRED_ACTIVITY_KEY"; public static final String PREFERRED_PACKAGE_KEY = "com.android.updaterservice.PREFERRED_PACKAGE_KEY"; public static final String INSTALL_PACKAGE_RESULT = "com.android.updaterservice.INSTALL_PACKAGE_RESULT"; public static final String PACKAGE_NAME = "PACKAGE_NAME"; public static final String INSTALL_SUCCEEDED = "INSTALL_SUCCEEDED"; public static final int REQUEST_UNKNOWN = -1; public static final int INSTALL_APPLICATION = 1; public static final int UNISTALL_PACKAGE = 2; public static final int SET_PREFERRED_LAUNCHER = 3; 
 startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));