Installa l'applicazione a livello di codice su Android


212

Sono interessato a sapere se è possibile installare a livello di codice un apk scaricato in modo dinamico da un'applicazione Android personalizzata.


Non so cosa significhi "caricatore dinamico, dipendente dall'ambiente attuale dell'utente". La risposta fornita da @Lie Ryan mostra come installare un APK scaricato con qualsiasi mezzo tu scelga.
Commons War

Risposte:


241

Puoi facilmente avviare un link Play Store o un prompt di installazione:

Intent promptInstall = new Intent(Intent.ACTION_VIEW)
    .setDataAndType(Uri.parse("content:///path/to/your.apk"), 
                    "application/vnd.android.package-archive");
startActivity(promptInstall); 

o

Intent goToMarket = new Intent(Intent.ACTION_VIEW)
    .setData(Uri.parse("https://play.google.com/store/apps/details?id=com.package.name"));
startActivity(goToMarket);

Tuttavia, non è possibile installare .apks senza l' autorizzazione esplicita dell'utente ; a meno che il dispositivo e il programma non siano rootati.


35
Buona risposta, ma non hardcode /sdcard, dal momento che è sbagliato su Android 2.2+ e altri dispositivi. Usa Environment.getExternalStorageDirectory()invece.
Commons War

3
La directory / asset / esiste solo nella macchina di sviluppo, quando l'applicazione viene compilata in un APK, la directory / asset / non esiste più poiché tutte le risorse sono compresse all'interno dell'APK. Se desideri installare dalla tua directory / asset /, devi prima estrarlo in un'altra cartella.
Lie Ryan,

2
@LieRyan. Bello vedere la tua risposta. Ho il dispositivo rooted con ROM personalizzata. Voglio installare i temi in modo dinamico senza chiedere all'utente di premere il pulsante di installazione. Posso farlo.
Sharanabasu Angadi

1
Questo sembra non funzionare più quando targetSdk è 25. dà un'eccezione: "android.os.FileUriExposedException: ... apk esposto oltre l'app tramite Intent.getData () ...". Come mai?
sviluppatore Android

4
Sviluppatore @android: al momento non posso verificarlo, ma su targetSdkVersion> = 24, si applica quanto segue: stackoverflow.com/questions/38200282/…, quindi è necessario utilizzare FileProvider.
Lie Ryan,
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.