Android: изменить стандартное домашнее приложение

для некоторых конкретных требований мне необходимо изменить приложение Android Default Home с моим настроенным домашним приложением (настройка внутри моего приложения, которая будет включать по умолчанию home = мое приложение или предыдущий дом)

Я не хочу, чтобы пользователь путешествовал по настройкам Android, которые очень сложны.

Может ли кто-нибудь помочь мне, например, где он регистрирует launcher.apk для домашнего приложения по умолчанию или как его изменить?

Единственное, что я мог найти, это старый вопрос: как изменить настольное приложение Android по умолчанию?

но ответов нет.

Я видел HomeSwitcher на рынке, который делает трюк, но нет ответа для разработчика, который, возможно, был бы занят.

РЕДАКТИРОВАТЬ

Я нашел это в Интернете http://www.mail-archive.com/[email protected]/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). Однако, когда я перехожу к нажатию на кнопку «домой», список все еще отображается, и в журналах говорится:

 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 

Таким образом, похоже, что resolver удаляет запись по умолчанию. Я что-то делаю неправильно, или это мера безопасности? Каковы идеи этого?

Я провел обширные исследования по этому вопросу, и начиная с 2.2, нет никакого способа сделать это. Единственный способ – использовать хакерство, которое делает приложение для блокировки малыша, но это приложение недавно установило телефоны samsung в бесконечном цикле, поэтому это рискованный подход.

если вы посмотрите на исходный код froyo здесь classа packagemanager, вы увидите это небольшое условие в методе addPreferredActivity:

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

HomeSwitcher не работает должным образом на 2.2, поскольку он использует этот самый метод, и разработчик сделал комментарий на странице приложения « Froyo (2.2) не поддерживается из-за изменения API »

«Измененный результат» означает, что набор пакетов, соответствующих этому намерению, изменился с набора, указанного вами при создании значения по умолчанию, – поэтому значение по умолчанию больше недействительно. В вашем списке компонентов (которые вы в настоящее время устанавливаете на нуль) должны быть указаны все домашние приложения, присутствующие на устройстве, а не только ваши.

Вот пример кода, который я тестировал (используя adb shell am start http://www.google.co.uk/ ) и используется для установки браузера по умолчанию. XXX представляет имя клиента, которое мне нужно было отключить.

Обратите внимание, что для вызова addPreferredActivity вы должны скомпилировать с минимальной версией sdk 8 (2.2), и вы должны были указать разрешение 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 – если вы отметили этот ответ, не могли бы вы сообщить мне, почему. Код, который я опубликовал выше, проверен и работает …

Этот код работает на моем устройстве ICS: я использую услугу, которая разумна для какого-либо вызова, один из них называется SET_PREFERRED_LAUNCHER, помещает в комплект ваш новый пакет 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(); } } } } } } 

Не забудьте добавить в файл манифеста это разрешение:

   

Применение:

  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)); 
Interesting Posts

Что такое интерфейс IUserSecurityStampStore ASP.NET Identity?

У меня есть Tessellated Sphere OpenGL, и я хочу вырезать в ней цилиндрическое отверстие

Запланировать задачу с правами администратора без приглашения пользователя в Windows 7

Как я могу начать создавать C # RSS Reader?

Почему я не должен обертывать каждый блок в «try» – «catch»?

Исключение: OutOfMemoryError

Как получить URL из хранилища Firebase getDownloadURL

Навигационный ящик полупрозрачный поверх строки состояния не работает

Почему нет назначения-назначения / move-constructor по умолчанию?

Каковы лучшие отраслевые стандарты для реализации пользовательских исключений в C #?

Должен ли я заставлять MacBook Pro спать или каждый день закрывать его?

Как восстановить поврежденную базу данных SQLite3?

Как сортировать результаты Spotlight по размеру в Finder?

Есть ли способ программно преобразовать строки форматирования VB6 в строки форматирования .NET?

Spark Не удалось найти драйвер JDBC

Давайте будем гением компьютера.