23

对于某些特定要求,我需要使用我自定义的 Home 应用程序更改 Android Default Home 应用程序(我的应用程序内的设置将切换默认主页 = 我的应用程序或以前的主页)

我不希望用户使用非常复杂的安卓设置。

任何人都可以帮我看看它在哪里注册launcher.apk作为默认家庭应用程序或如何改变它

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

但根本没有答案。

我在市场上看到过 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

因此,解析器似乎删除了默认条目。我做错了什么,还是这是一种安全措施?这背后的想法是什么?

4

4 回答 4

9

我对此进行了广泛的研究,从 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)

于 2010-11-05T18:06:07.457 回答
7

“结果集已更改”意味着与该意图匹配的软件包集已从您创建默认值时指定的集更改 - 因此默认值不再有效。您的组件列表(您当前设置为 null)需要包含设备上存在的所有主屏幕应用程序,而不仅仅是您的。

这是我测试过的示例代码(使用 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 - 如果您将此回复标记为下,您能否告诉我原因。我上面发布的代码已经过测试并且可以正常工作......

于 2011-01-10T16:57:16.327 回答
2
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
于 2015-10-19T09:19:07.687 回答
0

此代码适用于我的 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;
于 2012-09-27T09:46:28.933 回答