我正在创建一个启动器应用程序,我想手动显示默认的启动器选择器。
我已经找到并尝试了this,但这并不完美,因为我不能立即选择ALWAYS。选择启动器后,我需要按下主页按钮才能选择ALWAYS。
这是我的代码:
public static void resetPreferredLauncherAndOpenChooser(Context context) {
PackageManager packageManager = context.getPackageManager();
ComponentName componentName = new ComponentName(context, DefaultLauncherHelperActivity.class);
packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
Intent selector = new Intent(Intent.ACTION_MAIN);
selector.addCategory(Intent.CATEGORY_HOME);
selector.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(selector);
packageManager.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_DEFAULT, PackageManager.DONT_KILL_APP);
}下面是清单:
<activity
android:name=".activities.MainActivity"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<activity
android:name=".activities.DefaultLauncherHelperActivity"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>这是我得到的(左)与我试图实现的(右)

由于微软的启动器和poco启动器能够做到这一点,所以必须有一种方法,但我找不到解决方案,不幸的是,没有具有相同功能的开源启动器。有人能帮我吗?
发布于 2021-05-26 23:16:09
对于这一点,没有直接可用的API。但是,在重置首选启动器之前调用下面的代码将导致选择器对话框按照右侧图像显示。
谨慎使用它,,因为调用它实际上会重置用户的家庭应用程序偏好,并且在你的家庭应用程序之外也可以看到效果。
try {
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MAIN);
intentFilter.addCategory(CATEGORY_HOME);
intentFilter.addCategory(CATEGORY_DEFAULT);
Intent intent1 = new Intent(Intent.ACTION_MAIN);
intent1.addCategory(CATEGORY_HOME);
intent1.setComponent(null);
Class<?> clazz = Class.forName("android.app.AppGlobals");
Class.forName("android.content.pm.IPackageManager")
.getMethod("setLastChosenActivity", new Class[] { Intent.class, String.class, int.class, IntentFilter.class, int.class, ComponentName.class })
.invoke(clazz.getMethod("getPackageManager", new Class[0]).invoke(clazz, null),
new Object[] { intent1, intent1.resolveTypeIfNeeded(context.getContentResolver()), Integer.valueOf(65536), intentFilter, Integer.valueOf(1081344), intent1.getComponent() });
} catch (Exception ignore) {
}https://stackoverflow.com/questions/54673590
复制相似问题