2014-04-16 17 views
5

Ich möchte einen Dialog, der den Benutzer wählen einen Launcher starten mit gesetzt als Standard-Option Pop. Ich probierteandroid: Wählen Standard-Launcher programmatisch

 Intent home = new Intent(Intent.ACTION_DEFAULT); 
    home.addCategory(Intent.CATEGORY_LAUNCHER); 
    Intent chooser = Intent.createChooser(home, "Launcher"); 
    context.startActivity(chooser); 

Aber der Dialog, der dadurch geknallt wird, hat nicht die Wahl, Standard einzustellen. Während der folgende Code den Dialog nicht öffnet, wenn ein Standard-Launcher bereits eingestellt ist.

 Intent startMain = new Intent(Intent.ACTION_MAIN); 
    startMain.addCategory(Intent.CATEGORY_HOME); 
    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    startActivity(startMain); 

Wie kann dies getan werden? Vielen Dank für die Hilfe im Voraus.

Antwort

10

Versuchen Sie es mit der folgenden:

Intent startMain = new Intent(Intent.ACTION_MAIN); 
startMain.addCategory(Intent.CATEGORY_HOME); 
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(startMain); 

Wenn eine Standardaktion bereits gesetzt ist (Ihr), können Sie rufen zuerst:

getPackageManager().clearPackagePreferredActivities(getPackageName()); 

Wenn die Standardaktion nicht verkaufen, Sie kann es nicht programmgesteuert löschen, was Sie tun können, ist zu überprüfen, ob andere App als Standard eingestellt ist und eine Nachricht anzeigen.

private boolean isMyLauncherDefault() { 
    PackageManager localPackageManager = getPackageManager(); 
    Intent intent = new Intent("android.intent.action.MAIN"); 
    intent.addCategory("android.intent.category.HOME"); 
    String str = localPackageManager.resolveActivity(intent, 
      PackageManager.MATCH_DEFAULT_ONLY).activityInfo.packageName; 
    return str.equals(getPackageName()); 
} 

Als Abhilfe bei anderen App als Standard festgelegt ist, können Sie erstellt ein fake Hause, installieren Sie es (dies wird Forse das System die Standard-App löschen) und dann deinstallieren ...

Manifest .xml

<activity 
     android:name="FakeHome" android:enabled="false"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.HOME"/> 
      <category android:name="android.intent.category.DEFAULT" /> 
     </intent-filter> 
    </activity> 

FakeHome.java

public class FakeHome extends Activity { 

} 

Irgendwo

if(!isMyLauncherDefault()) {    
PackageManager p = getPackageManager(); 
ComponentName cN = new ComponentName(Activity.this, FakeHome.class); 
p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP); 

Intent selector = new Intent(Intent.ACTION_MAIN); 
selector.addCategory(Intent.CATEGORY_HOME);    
startActivity(selector); 

p.setComponentEnabledSetting(cN, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);    
    } 
+2

Dieser Code wird nicht den Dialog öffnet sich, wenn ein Standard-Launcher ist bereits festgelegt. –

+0

Haben Sie das jemals zur Arbeit gebracht? – portfoliobuilder

+0

Der Parameter 'filters' von' getPreferredActivities() 'ist ein Ausgabeparameter. Das Hinzufügen eines Filterelements zur Liste vor dem Anruf hat keine Auswirkungen. –