2010-12-12 14 views

Antwort

8

In Android 2.3 können Sie startActivity() auf einem ACTION_APPLICATION_DETAILS_SETTINGSIntent, mit einem richtigen Uri, nutzen Sie Ihre App "verwalten" Bildschirm aufzurufen. Dies ist jedoch neu bei Android 2.3 - mir ist nicht bekannt, wie man das in früheren Android-Versionen tun kann.

6
startActivity(new Intent(android.provider.Settings.ACTION_APPLICATION_SETTINGS)); 

bringt Sie zu den Einstellungen/Anwendungsliste. Wenn Sie eine bestimmte Anwendung geöffnet werden soll, denke ich in 2.2 und unten gibt es keine Möglichkeit, so dass Sie eine (nicht unbedingt vorgeschlagen, weil inoffizielle) Weg zu gehen, bräuchten:

final Intent i = new Intent("android.intent.action.VIEW");     
i.setComponent(new ComponentName("com.android.settings","com.android.settings.InstalledAppDetails")); 
i.putExtra(...); // need to figure out the correct extra, probably app package name 
startActivity(i); 

Aber beachten Sie, dass dies nicht empfohlen, da es kein offizieller API/Intent (Filter) ist und sich daher in der Zukunft ändern könnte.

+0

Ich werde letzteres nicht empfehlen. Was passiert, wenn eine schädliche App das Paket com.android.settings verwendet? –

+0

@PaoloRovelli Ich schrieb "nicht unbedingt empfohlen", aber aus einem anderen Grund. Ich glaube nicht, dass Sie die Gefahr vermeiden können, die Sie erwähnen; Wenn zwei Apps dieselbe Absicht (Zeichenfolge) verwenden, erhält der Benutzer immer einen Dialog zur Auswahl der zu verwendenden App (wodurch das Risiko ein wenig sinkt). Beachten Sie aber, dass der Parameter im ersten Ansatz auch nichts anderes als eine Zeichenkette ist: http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_SETTINGS - also auch kein Schutz vor einer schädlichen App wenn es den Paketnamen com.android.settings verwendet. –

76

In 2.2 und darunter gibt es keine öffentlichen APIs, auf die Sie zugreifen können. Aber Sie können die InstalledAppDetails Aktivität immer noch starten, wie die ManageApplications tut. siehe here

// utility method used to start sub activity 
private void startApplicationDetailsActivity() { 
    // Create intent to start new activity 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setClass(this, InstalledAppDetails.class); 
    intent.putExtra(APP_PKG_NAME, mCurrentPkgName); 
    // start new activity to display extended information 
    startActivityForResult(intent, INSTALLED_APP_DETAILS); 
} 

Fazit: Sie können die "Anwendung Info" Bildschirm wie folgt beginnen schrieb ich:

private static final String SCHEME = "package"; 

private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName"; 

private static final String APP_PKG_NAME_22 = "pkg"; 

private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings"; 

private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails"; 

public static void showInstalledAppDetails(Context context, String packageName) { 
    Intent intent = new Intent(); 
    final int apiLevel = Build.VERSION.SDK_INT; 
    if (apiLevel >= 9) { // above 2.3 
     intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     Uri uri = Uri.fromParts(SCHEME, packageName, null); 
     intent.setData(uri); 
    } else { // below 2.3 
     final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22 
       : APP_PKG_NAME_21); 
     intent.setAction(Intent.ACTION_VIEW); 
     intent.setClassName(APP_DETAILS_PACKAGE_NAME, 
       APP_DETAILS_CLASS_NAME); 
     intent.putExtra(appPkgName, packageName); 
    } 
    context.startActivity(intent); 
} 
+0

vielen dank! Das hat mir viel Zeit gespart. Soll der Kommentar "über 2.3" in "2.3 und höher" geändert werden? – kristianlm

+0

das funktioniert perfekt für jede installierte Anwendung. Wenn ich jedoch versuche, die Einstellungen einer Systemanwendung zu öffnen, wird ein leerer Bildschirm angezeigt. –

+1

Wir müssen auch intent.setFlags hinzufügen (Intent.FLAG_ACTIVITY_NEW_TASK); in beiden Aussagen. if() {... hier ...} else {... hier ...} –

52

Von API Ebene 9 (Android 2.3) können Sie eine Intent beginnen mit android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Also:

packageName = "your.package.name.here" 

try { 
    //Open the specific App Info page: 
    Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
    intent.setData(Uri.parse("package:" + packageName)); 
    startActivity(intent); 

} catch (ActivityNotFoundException e) { 
    //e.printStackTrace(); 

    //Open the generic Apps page: 
    Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_APPLICATIONS_SETTINGS); 
    startActivity(intent); 

} 
14

Alte Frage, verbesserte Antwort:

/** 
* <p>Intent to show an applications details page in (Settings) com.android.settings</p> 
* 
* @param context  The context associated to the application 
* @param packageName The package name of the application 
* @return the intent to open the application info screen. 
*/ 
public static Intent newAppDetailsIntent(Context context, String packageName) { 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { 
     Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.setData(Uri.parse("package:" + packageName)); 
     return intent; 
    } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.FROYO) { 
     Intent intent = new Intent(Intent.ACTION_VIEW); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.setClassName("com.android.settings", 
       "com.android.settings.InstalledAppDetails"); 
     intent.putExtra("pkg", packageName); 
     return intent; 
    } 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    intent.setClassName("com.android.settings", 
      "com.android.settings.InstalledAppDetails"); 
    intent.putExtra("com.android.settings.ApplicationPkgName", packageName); 
    return intent; 
} 
9

I verwendet Paolo Lösung, um die Anwendung Details Einstellungen in SDK 23+ zu öffnen, wenn der Benutzer die Berechtigungsanfrage in der Vergangenheit abgelehnt und Wählen Sie im Berechtigungsanfrage-Systemdialog die Option "Nicht erneut fragen". In diesem Fall habe ich die getPackageName() Methode direkt verwendet.

Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS); 
intent.setData(Uri.parse("package:" + getPackageName())); 
startActivity(intent); 
Verwandte Themen