web-dev-qa-db-ja.com

Android:デフォルトのホームアプリケーションを変更する

特定の要件については、変更する必要がありますAndroidカスタマイズされたホームアプリケーションでのデフォルトホームアプリケーション(デフォルトホームを切り替えるアプリ内の設定=アプリケーションまたは以前のホーム))

ユーザーに旅行を望まない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

したがって、リゾルバはデフォルトのエントリを削除するようです。私は何か間違ったことをしていますか、またはこれはセキュリティ対策ですか?この背後にあるアイデアは何ですか?

23
Waza_Be

私はそれについて広範囲の調査を行いました、そして2.2から始めて、それをする方法はありません。唯一の方法は、幼児ロックアプリが行うハッキングを使用することですが、このアプリは最近、サムスンの電話を無限ループに置くため、危険なアプローチです。

froyoのソースコードを見ると、packagemanagerクラスの here ですが、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の変更によりサポートされていません

8
mishkin

「結果セットが変更された」とは、そのインテントに一致するパッケージのセットが、デフォルトを作成したときに指定したセットから変更されたことを意味するため、デフォルトは無効になります。コンポーネントのリスト(現在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-この応答をマークダウンした場合、その理由を教えてください。上記で投稿したコードはテストされ、機能しています...

7
Airsource Ltd
startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));
1
Oded Breiner

このコードは私のICSデバイスで機能します:私はいくつかの呼び出しに敏感なサービスを使用します、それらの1つは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;
0