para - manual de programacion android pdf
Comprueba si la aplicación está instalada: Android (5)
La respuesta de Robin Kanters es correcta, pero verifica las aplicaciones instaladas independientemente de su estado habilitado o deshabilitado.
Todos sabemos que una aplicación puede ser instalada pero deshabilitada por el usuario, por lo tanto inutilizable.
Esto busca aplicaciones instaladas Y habilitadas:
public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
try {
return packageManager.getApplicationInfo(packageName, 0).enabled;
}
catch (PackageManager.NameNotFoundException e) {
return false;
}
}
Puede poner este método en una clase como Utils
y llamarlo a todas partes usando:
boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
Estoy tratando de instalar aplicaciones de Google Play. Puedo entender que al abrir la URL de la tienda de Google Play, se abre Google Play y cuando presiono el botón Atrás, la actividad se reanuda.
Intent marketIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(appURL));
marketIntent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
startActivity(marketIntent);
Cuando volví a la actividad, intenté llamar a esto en onResume()
para comprobar si la aplicación está instalada, pero recibí un error:
@Override
protected void onResume() {
super.onResume();
boolean installed = false;
while (!installed) {
installed = appInstalledOrNot(APPPACKAGE);
if (installed) {
Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show();
}
}
}
private boolean appInstalledOrNot(String uri) {
PackageManager pm = getPackageManager();
boolean app_installed = false;
try {
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
app_installed = true;
}
catch (PackageManager.NameNotFoundException e) {
app_installed = false;
}
return app_installed ;
}
El error es el siguiente:
E / AndroidRuntime (796): java.lang.RuntimeException: no se puede iniciar la actividad ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: no se encontró actividad para manejar el intento {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}
Supongo que la actividad es onPause()
. ¿Hay una mejor manera de implementarlo? Estoy tratando de verificar si la aplicación se terminó de instalar.
Prueba esto:
private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
try {
packageManager.getPackageInfo(packagename, 0);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
Intenta obtener información sobre el paquete cuyo nombre ha pasado. De lo NameNotFoundException
, si se ha lanzado una NameNotFoundException
, significa que no hay ningún paquete con ese nombre instalado, por lo que devolveremos el valor false
.
Tenga en cuenta que pasamos un PackageManager
lugar de un Context
, por lo que el método es un poco más flexible de usar y no viola la ley de Demeter . Puede usar el método sin acceso a una instancia de Context
, siempre que tenga una instancia de PackageManager
.
Úselo así:
public void someMethod() {
// ...
PackageManager pm = context.getPackageManager();
boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);
// ...
}
Prueba esto:
public static boolean isAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list = mgr.queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
Una solución más rápida:
private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
try {
packageManager.getPackageGids(packagename);
return true;
} catch (NameNotFoundException e) {
return false;
}
}
getPackageGids
es menos costoso de getPackageInfo
, por lo que funciona más rápido.
Run 10000 on API 15
Exists pkg:
getPackageInfo: nanoTime = 930000000
getPackageGids: nanoTime = 350000000
Not exists pkg:
getPackageInfo: nanoTime = 420000000
getPackageGids: nanoTime = 380000000
Run 10000 on API 17
Exists pkg:
getPackageInfo: nanoTime = 2942745517
getPackageGids: nanoTime = 2443716170
Not exists pkg:
getPackageInfo: nanoTime = 2467565849
getPackageGids: nanoTime = 2479833890
Run 10000 on API 22
Exists pkg:
getPackageInfo: nanoTime = 4596551615
getPackageGids: nanoTime = 1864970154
Not exists pkg:
getPackageInfo: nanoTime = 3830033616
getPackageGids: nanoTime = 3789230769
Run 10000 on API 25
Exists pkg:
getPackageInfo: nanoTime = 3436647394
getPackageGids: nanoTime = 2876970397
Not exists pkg:
getPackageInfo: nanoTime = 3252946114
getPackageGids: nanoTime = 3117544269
Nota: Esto no funcionará en algunos espacios virtuales. Pueden violar la API de Android y devolver siempre una matriz, incluso si no hay una aplicación con ese nombre de paquete.
En este caso, use getPackageInfo
.
@Override
protected void onResume() {
super.onResume();
boolean installed = false;
while (!installed) {
installed = appInstalledOrNot (APPPACKAGE);
if (installed) {
Toast.makeText(this, "App installed", Toast.LENGTH_SHORT).show ();
}
}
}
private boolean appInstalledOrNot (String uri) {
PackageManager pm = getPackageManager();
boolean app_installed = false;
try {
pm.getPackageInfo(uri, PackageManager.GET_ACTIVITIES);
app_installed = true;
} catch (PackageManager.NameNotFoundException e) {
app_installed = false;
}
return app_installed;
}