Controlla se l'applicazione è installata - Android


104

Sto provando a installare app da Google Play. Posso capire che aprendo l'URL di Google Play Store, si apre Google Play e quando premo il pulsante Indietro, l'attività riprende.

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

Quando sono tornato all'attività, ho provato a chiamarlo onResume()per verificare se l'app è installata, ma ricevo un errore:

@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 ;
}

L'errore è il seguente:

E / AndroidRuntime (796): java.lang.RuntimeException: impossibile avviare l'attività ComponentInfo {com.example.appinstaller / com.example.appinstaller.MainActivity}: android.content.ActivityNotFoundException: nessuna attività trovata per gestire Intent {act = android .intent.action.VIEW dat = market: // details? id = com.package.name flg = 0x40080000}

Immagino che l'attività sia onPause(). C'è un modo migliore per implementarlo? Sto cercando di controllare se l'installazione dell'app è terminata.



@SiddharthanAsokan Se ho capito bene, quello che stai cercando di ottenere qui è, avvia la tua app -> vai su Play Store-> fai clic su installa -> torna alla tua attività -> avvia l'app appena installata .. è vero?
Varun

No, torna all'app che ho aperto inizialmente. Devo ottenere alcune informazioni sull'app installata utilizzando PackageManager. Questo recupero delle informazioni inizia dopo aver installato l'app dall'iniziale che ha aperto l'URL web.
Siddharthan Asokan

Risposte:


299

Prova questo:

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

Tenta di recuperare le informazioni sul pacchetto di cui hai passato il nome. In caso NameNotFoundExceptioncontrario , se è stato lanciato a, significa che nessun pacchetto con quel nome è installato, quindi torniamo false.

Nota che passiamo a PackageManagerinvece di a Context, in modo che il metodo sia leggermente più utilizzabile in modo flessibile e non violi la legge di Demetra . Puoi utilizzare il metodo senza accedere a Contextun'istanza, purché tu disponga di PackageManagerun'istanza.

Usalo in questo modo:

public void someMethod() {
    // ...

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

    // ...
}

1
La condizione è: devo controllare questo processo di installazione se è fatto. Faccio clic su installa e nel frattempo cerco di verificare l'installazione in un ciclo. Il codice va bene ma il metodo per verificare se l'installazione è completa è quello che sto cercando.
Siddharthan Asokan,

3
@SiddharthanAsokan Puoi usare un ricevitore di trasmissione per l'azione package_added.
Varun

@ Varun Ho appena modificato il codice. Non è più il nome del pacchetto dell'app che sto usando. Solo l'URL web dell'app nel Google Play Store
Siddharthan Asokan

@Robin Kanters Per favore, rivedi le modifiche che ho fatto
Siddharthan Asokan

Quello che hai fatto nella tua domanda è lo stesso della mia risposta.
Robin Kanters

32

La risposta di Robin Kanters è giusta, ma controlla le app installate indipendentemente dal loro stato abilitato o disabilitato.

Sappiamo tutti che un'app può essere installata ma disabilitata dall'utente, quindi inutilizzabile.

Verifica la presenza di app installate E abilitate:

public static boolean isPackageInstalled(String packageName, PackageManager packageManager) {
    try {
        return packageManager.getApplicationInfo(packageName, 0).enabled;
    }
    catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

Puoi mettere questo metodo in una classe come Utilse chiamarlo ovunque usando:

boolean isInstalled = Utils.isPackageInstalled("com.package.name", context.getPackageManager())

5

Prova questo:

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

5

Soluzione più veloce:

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

getPackageGidsè meno costoso da getPackageInfo, quindi funziona più velocemente.

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: questo non funzionerà in alcuni spazi virtuali. Possono violare l'API Android e restituire sempre un array, anche se non sono presenti applicazioni con quel nome di pacchetto.
In questo caso, usa getPackageInfo.


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.");}

0
isFakeGPSInstalled = Utils.isPackageInstalled(Utils.PACKAGE_ID_FAKE_GPS, this.getPackageManager());

// metodo per controllare il pacchetto installato true / false

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

    return found;
  }

0

Se vuoi provarlo senza il blocco try catch, puoi utilizzare il seguente metodo, creare un intent e impostare il pacchetto dell'app che desideri verificare

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

e chiama il seguente metodo per verificare se l'app è installata

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

0

Coloro che cercano la soluzione Kotlin possono utilizzare questo metodo,

Qui ho condiviso il codice completo e gestito anche lo stato abilitato. Controlla se l'applicazione è installata in 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
        }
    }

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

8
Questo è un ciclo infinito.
Robin Kanters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.