2010-12-12 21 views

Respuesta

8

En Android 2.3, puede utilizar startActivity() en una ACTION_APPLICATION_DETAILS_SETTINGSIntent, con una adecuada Uri, para que aparezca la pantalla "gestionar" de su aplicación. Sin embargo, esto es nuevo en Android 2.3. No conozco una manera de hacerlo en versiones anteriores de Android.

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

lo llevará a la configuración/lista de aplicaciones. Si desea abrir una aplicación específica, creo que en 2.2 y por debajo no hay manera, por lo que había necesidad de ir a una (no necesariamente sugerido, porque no oficial) forma:

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

Pero tenga en cuenta que esto es no recomendado porque no es una API/intento oficial (filtro) y, por lo tanto, podría cambiar en el futuro.

+0

No recomendaré este último. ¿Qué sucede si una aplicación maliciosa usa el paquete: com.android.settings? –

+0

@PaoloRovelli Escribí "no necesariamente recomendado", pero por una razón diferente. No creo que puedas evitar el peligro que mencionas; si dos aplicaciones usan el mismo intento (cadena), el usuario siempre obtendrá un diálogo para elegir la aplicación que usará (lo que reduce el riesgo un poco). Pero también, tenga en cuenta que el parámetro en el primer enfoque no es otra cosa que una cadena: http://developer.android.com/reference/android/provider/Settings.html#ACTION_APPLICATION_SETTINGS - por lo que no hay protección contra una aplicación maliciosa si usa el nombre del paquete com.android.settings. –

76

En 2.2 y siguientes, no hay API públicas a las que pueda acceder. Pero aún puede iniciar la actividad de InstalledAppDetails del mismo modo que la ManageApplications. ver 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); 
} 

Conclusión: se puede iniciar la pantalla "Información de aplicación" como esto que he escrito:

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

muchas gracias! esto me ahorró mucho tiempo. ¿Debería cambiarse el comentario "arriba 2.3" a "2.3 y arriba"? – kristianlm

+0

esto funciona perfectamente para cualquier aplicación instalada. Sin embargo, si intento abrir la configuración de cualquier aplicación del sistema, aparece una pantalla en blanco. –

+1

También necesitamos agregar intent.setFlags (Intención.FLAG_ACTIVITY_NEW_TASK); en ambas declaraciones. es decir, si() {... aquí ...} else {... aquí ...} –

52

De API de nivel 9 (Android 2.3) se puede iniciar una intención con android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS. Por lo tanto:

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

vieja pregunta, la mejora de la respuesta:

/** 
* <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

que utiliza solución de Paolo con el fin de abrir la aplicación Detalles Ajustes en SDK 23+ cuando el usuario rechazó la solicitud de autorización en el pasado y elija la opción "No preguntar de nuevo" en el diálogo del sistema de solicitud de permiso.

Pero en este caso utilicé el método getPackageName() directamente.

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