Compruebe si la aplicación está instalada - Android

104

Estoy intentando instalar aplicaciones de Google Play. Puedo entender que al abrir la URL de la tienda 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 onResume()para verificar si la aplicación está instalada, pero recibo 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 Intent {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Supongo que la actividad lo es onPause(). ¿Existe una mejor manera de implementarlo? Estoy intentando comprobar si la aplicación ha terminado de instalarse.

Siddharthan Asokan
fuente
posible duplicado de Detectar una aplicación instalada o no?
Philipp Jahoda
@SiddharthanAsokan Si lo entiendo correctamente, lo que está tratando de lograr aquí es iniciar su aplicación -> ir a Play Store-> hacer clic en instalar -> volver a su propia actividad -> iniciar la aplicación recién instalada ... ¿es así?
Varun
No, vuelva a la aplicación que abrí inicialmente. Necesito obtener información sobre la aplicación instalada usando PackageManager. Esta recuperación de información comienza después de que instale la aplicación desde la inicial que abrió la URL web.
Siddharthan Asokan

Respuestas:

299

Prueba esto:

private boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        packageManager.getPackageInfo(packageName, 0);
        return true;
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Intenta obtener información sobre el paquete cuyo nombre ingresó. De lo contrario, si NameNotFoundExceptionse lanzó un, significa que no se instaló ningún paquete con ese nombre, por lo que regresamos false.

Tenga en cuenta que pasamos a en PackageManagerlugar de a Context, por lo que el método es un poco más flexible y no viola la ley de Demeter . Puede usar el método sin acceso a una Contextinstancia, siempre que tenga una PackageManagerinstancia.

Úselo así:

public void someMethod() {
    // ...

    PackageManager pm = context.getPackageManager();
    boolean isInstalled = isPackageInstalled("com.somepackage.name", pm);

    // ...
}
Robin Kanters
fuente
1
La condición es: necesito verificar este proceso de instalación si está hecho. Hago clic en instalar y mientras tanto trato de verificar la instalación en un bucle. El código está bien, pero el método para verificar si la instalación está completa es lo que estoy buscando.
Siddharthan Asokan
3
@SiddharthanAsokan Puede usar un receptor de transmisión para la acción package_added.
Varun
@Varun Acabo de editar el código. Ya no estoy usando el nombre del paquete de la aplicación. Solo la URL web de la aplicación en Google Play Store
Siddharthan Asokan
@Robin Kanters Por favor revise los cambios que hice
Siddharthan Asokan
Lo que hizo en su pregunta es lo mismo que mi respuesta.
Robin Kanters
32

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 verifica las 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 Utilsy llamarlo en todas partes usando:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())
Antonio Papalillo
fuente
5

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;
}
Gopi Cg
fuente
5

Solución más rápida:

private boolean isPackageInstalled(String packagename, PackageManager packageManager) {
    try {
        packageManager.getPackageGids(packagename);
        return true;
    } catch (NameNotFoundException e) {
        return false;
    }
}

getPackageGidses menos costoso 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 siempre devolver una matriz, incluso si no hay una aplicación con ese nombre de paquete.
En este caso, utilice getPackageInfo.

Enyby
fuente
0
    private boolean isAppExist() {

    PackageManager pm = getPackageManager();
    try {
        PackageInfo info = pm.getPackageInfo("com.facebook.katana", PackageManager.GET_META_DATA);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
    return true;
}




if (isFacebookExist()) {showToast(" Facebook is  install.");}
     else {showToast(" Facebook is not install.");}
DEVSHK
fuente
0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// método para verificar el paquete instalado verdadero / falso

  public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    boolean found = true;
    try {
      packageManager.getPackageInfo(packageName, 0);
    } catch (PackageManager.NameNotFoundException e) {
      found = false;
    }

    return found;
  }
Faajir
fuente
0

Si desea probarlo sin el bloque try catch, puede usar el siguiente método, crear una intención y configurar el paquete de la aplicación que desea verificar

val intent = Intent(Intent.ACTION_VIEW)
intent.data = uri
intent.setPackage("com.example.packageofapp")

y llame al siguiente método para verificar si la aplicación está instalada

fun isInstalled(intent:Intent) :Boolean{
    val list = context.packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY)
    return list.isNotEmpty()
}
ked
fuente
0

Aquellos que buscan la solución Kotlin pueden utilizar este método,

Aquí he compartido el código completo y también manejé el estado habilitado. Compruebe si la aplicación está instalada en Android Kotlin

fun isAppInstalled(packageName: String, context: Context): Boolean {
        return try {
            val packageManager = context.packageManager
            packageManager.getPackageInfo(packageName, 0)
            true
        } catch (e: PackageManager.NameNotFoundException) {
            false
        }
    }
Asad Ali Choudhry
fuente
-9
@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;
}
Pertho
fuente
8
Este es un bucle infinito.
Robin Kanters