Frage

für einige spezifische Anforderung Ich bin verpflichtet, Android Standard-Startseite Anwendung zu ändern mit meiner maßgeschneiderten Heim Anwendung

(eine Einstellung in meiner Anwendung, die meine Anwendung oder vorheriges Haus Standard-Homepage = Umschalten wird)

Ich möchte nicht den Benutzer Android-Einstellungen reisen, die sehr kompliziert sind.

Kann jemand helfen, mich aus wie, wo es launcher.apk für Standard-Register Hauptanwendung oder wie die

ändern

Das einzige, was ich finden konnte, war die alte Frage: Wie Standardeinstellung ändern Android Desktop-Anwendung?

aber keine Antworten auf alle.

Ich habe HomeSwitcher auf dem Markt gesehen, das den Trick tun, aber keine Antwort für den Entwickler, die sicherlich damit beschäftigt sein könnten.

Bearbeiten

Ich fand diese im Web http: // www .mail-archive.com / android-Entwickler @ googlegroups.com / msg74167.html

Aber ich habe das gleiche Problem:

Das ist mein Code:

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

Ich habe den android.permission.SET_PREFERRED_APPLICATIONS Satz in der Manifest. Nach dem obigen Code ausgeführt wird, behaupten die Protokolle Dinge wurde wie erwartet (gleiche Protokolle wie hinzugefügt, wenn ich abhaken „Als Standard festlegen“ von IntentResolver Liste). Allerdings, wenn ich gehe durch Klick auf Home, noch die Liste auftaucht und die Protokolle sagen:

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

So scheint es der Resolver den Standardeintrag löscht. Ich mache etwas falsch, oder ist dies eine Sicherheitsmaßnahme? Was sind die Ideen dahinter?

War es hilfreich?

Lösung

Ich habe eine umfangreiche Forschung auf diesem und ab 2.2 gibt es keine Möglichkeit, das zu tun. Der einzige Weg ist, mit einigen, dass Kleinkind Lock App Hacking tut, aber dieser App Samsung Handys in der Endlosschleife vor kurzem setzen, so dass es ein riskanter Ansatz ist.

Wenn Sie den Froyo-Quellcode sehen hier von Paketmanager-Klasse, werden Sie diese kleine Bedingung in der addPreferredActivity Methode finden Sie unter:

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

HomeSwitcher funktioniert nicht richtig auf 2.2, da sie diese sehr Methode verwendet und Entwickler einen Kommentar zu App-Seite „made Froyo (2.2) wird nicht unterstützt aufgrund der API ändern "

Andere Tipps

„gesetzt Ergebnis geändert“ bedeutet, dass der Satz von Paketen passend, dass Absicht aus der Menge geändert hat den Du bei dem Standard erstellt - - so der Standard ist nicht mehr gültig. Ihre Liste der Komponenten (die Sie zur Zeit auf Null setzen) muss enthalten alle Homescreen auf Gerät vorhanden apps, nicht nur bei Ihnen.

Hier ist Beispielcode, dass ich getestet habe (ADB Shell am mit starten http://www.google.co. uk / ) und verwendet, um den Standard-Browser eingestellt werden. XXX steht für einen Kundennamen, dass ich zu verdunkeln hatte.

Beachten Sie, dass, um addPreferredActivity rufen Sie gegen ein Minimum-sdk-Version 8 (2.2) zusammengestellt haben müssen und Sie müssen die SET_PREFERRED_APPLICATIONS Erlaubnis angegeben haben. Das Recht ist Schutzstufe 2, so dass Sie mit demselben Zertifikat als Packagemanager unterzeichnet werden müssen.

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 - wenn Sie diese Antwort nach unten markiert, könnten Sie uns wissen lassen, warum. Der Code, den ich oben geschrieben ist getestet und läuft ...

startActivity(new Intent(Settings.ACTION_HOME_SETTINGS));

funktioniert Dieser Code auf meinem ICS-Gerät: Ich verwende einen Dienst, der bis zu einem gewissen Ruf sinnvoll ist, eine von ihnen ist SET_PREFERRED_LAUNCHER genannt, die Put in einem Bündel Ihr neuen Standard-Launcher-Pakets (PREFERRED_PACKAGE_KEY) und die Aktivität (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();
                }
            }
        }
        }

    }

}

Denken Sie daran, in der Manifest-Datei, diese Erlaubnis hinzufügen:

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

Verbrauch:

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

Dabei gilt:

    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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top