Domanda

per qualche requisito specifico Sono tenuto a cambiare applicazione Home Android di default con la mia domanda iniziale personalizzata (un ambiente all'interno del mio app che si alternerà iniziale predefinita = mia domanda o casa precedente)

Non voglio che l'utente di viaggiare impostazioni Android che sono molto complicati.

Può uno aiutarmi come dove si registra launcher.apk per impostazione predefinita applicazione di casa o come cambiare che

L'unica cosa che ho trovato è stato che vecchia domanda: Come cambiare impostazione predefinita applicazione desktop di Android?

ma nessuno risponde a tutti.

Ho visto HomeSwitcher nel mercato che fare il trucco, ma nessuna risposta per lo sviluppatore che potrebbe certamente essere occupato.

Modifica

Ho trovato questo sul web http: // www .mail-archive.com / android-sviluppatori @ googlegroups.com / msg74167.html

Ma ho avuto lo stesso problema:

Questo è il mio codice:

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

Ho il set android.permission.SET_PREFERRED_APPLICATIONS nel manifesto. Dopo l'esecuzione del codice di cui sopra, i registri di rivendicare cose hanno stato aggiunto come attesi (stessi registri come quando mi spuntare "Imposta come predefinito" dalla lista di IntentResolver). Tuttavia, quando procedo da casa, facendo clic, l'elenco mostra ancora alto ei registri di dire:

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

Così sembra il resolver elimina la voce predefinita. Sto facendo qualcosa che non va, o si tratta di una misura di sicurezza? Quali sono le idee dietro questo?

È stato utile?

Soluzione

Ho fatto una vasta ricerca su questo e partendo da 2.2 non c'è modo di farlo. L'unico modo sta usando qualche violazione al sistema che app bambino blocco lo fa, ma questa applicazione mettere i telefoni Samsung ha recentemente nel ciclo infinito, quindi è un approccio rischioso.

Se si guarda il codice sorgente di froyo qui di classe packagemanager, si vedrà questo piccolo stato nel metodo addPreferredActivity:

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

HomeSwitcher non funziona correttamente su 2,2 dal momento che utilizza questo metodo molto e sviluppatore ha fatto un commento sulla pagina di app " Froyo (2.2) non è supportata a causa del cambiamento API "

Altri suggerimenti

"set di risultati modificati" significa che l'insieme di pacchetti che corrispondono che l'intento è cambiato dal set specificato al momento della creazione del default - - in modo che il difetto non è più valida. L'elenco dei componenti (che si sta configurando a null) deve contenere tutte homescreen applicazioni presenti sul dispositivo, non solo la tua.

È qui il codice di esempio che ho provato (utilizzando adb shell pm iniziare http://www.google.co. uk / ) e utilizzato per impostare il browser predefinito. XXX rappresenta un nome del cliente che ho dovuto black out.

Si noti che, al fine di chiamare addPreferredActivity è necessario aver compilato contro una versione minima-sdk di 8 (2.2) ed è necessario aver specificato l'autorizzazione SET_PREFERRED_APPLICATIONS. Questo permesso è il livello di protezione 2, quindi è necessario essere firmato con lo stesso certificato di 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 - se hai inserito questo la risposta verso il basso, potrebbe farmi sapere perché. Il codice che ho postato sopra è testato e funzionante ...

startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));

Questo codice funziona sul mio dispositivo ICS: Io uso un servizio che è sensibile ad una chiamata, uno di loro si chiama SET_PREFERRED_LAUNCHER, put in un fascio pacchetto nuova impostazione predefinita Launcher (PREFERRED_PACKAGE_KEY) e di attività (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();
                }
            }
        }
        }

    }

}

Ricordati di aggiungere nel file manifest questa autorizzazione:

    <uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"/>

Utilizzo:

    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);
}

dove:

    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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top