问题:改变的默认主页应用程序
-
26-09-2019 - |
题
对于一些特定的要求 我需要改变安卓默认主页应用程序 我定制的家庭应用程序(一个设置在我的应用程序,将拨的默认主=我的应用程序或先前的家庭)
我不想用户的旅行安卓设置,是非常复杂。
任何一个可以帮助我喜欢在那里注册的发射器。句子中的默认 家庭应用,或如何改变这
我唯一能找到的是,老的问题: 如何改变默认的桌面应用程序?
但是没有答案。
我已经看到HomeSwitcher在市场上这样做的诀窍,但是没有答案为开发这一可能肯定是忙碌。
编辑
我发现这个上网的 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的列表)。然而,当我进行点击的家庭,
该表还显示和记录说:
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
看起来是这样的冲突解决程序删除的默认输入。我在做 东西是错误的,或者是这一安全措施?有什么想法 这背后?
解决方案
我做了一个广泛的研究,并开始从2.2是没有办法做到这一点。唯一的办法是使用一些黑客孩子锁的应用程序不但这个程序,把三星手机最近在无限的循环,所以这是一个危险的方法。
如果你看看源代码。 在这里, 的packagemanager类,你会看到这个小小的条件在addPreferredActivity方法:
if (getUidTargetSdkVersionLockedLP(Binder.getCallingUid())
< Build.VERSION_CODES.FROYO) {
Slog.w(TAG, "Ignoring addPreferredActivity() from uid"
+ Binder.getCallingUid());
return;
}
HomeSwitcher不上正常工作2.2因为它使用这一非常的方法和开发人员作出的评论程序的一页"可(2.2)不支持 由于API改变"
其他提示
“结果设置改变”指的是一组匹配的意图已经从当你创建的默认指定的集合改变的软件包的 - - 所以默认不再有效。您的组件(即当前设置为null)的列表需要包含所有的主屏幕应用程序可提供的设备,不只是你的。
下面的示例代码,我已经测试(使用ADB壳上午启动 http://www.google.co。英国/ ),并用来设置默认浏览器。 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 - 如果你打上这种反应了,你能不能让我知道这是为什么。我上面发布的代码进行测试和工作...
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
此代码工作我的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;