2010-08-25 27 views
5

Ho un'applicazione che mi piacerebbe aggiungere funzionalità di aggiornamento automatico (non è nel marketplace). Ho tutto il codice in luogo che avrebbe controllare per vedere se c'è un aggiornamento disponibile e poi chiamare qualcosa di simile:Android: come aprire un file apk dopo il download per l'aggiornamento automatico?

Intent intent = new Intent(Intent.ACTION_VIEW ,Uri.parse(Configuration.APK_URL)); 
c.startActivity(intent); 

che inizia il download. C'è un modo in cui posso programmaticamente dire di "aprire" il file per iniziare il processo di installazione senza che l'utente debba andare ai download e cliccarci sopra?

risposta

6

Ciò avvierà il processo di installazione

File apkFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/packageName.apk"); 
Intent intent = new Intent(Intent.ACTION_VIEW); 
intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive"); 
startActivity(intent); 
+0

questo non funzionerà più, se i vostri obiettivi app API 24 o più. Vedi la mia risposta qui sotto –

4

La risposta sopra era pre-API-24.

Se i vostri obiettivi app API 24 o più (e dovrebbe), è necessario utilizzare qualcosa di diverso (altrimenti si ottiene FileUriExposedException, come descritto here):

File apkFile = new File(...); 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    Uri fileUri = android.support.v4.content.FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", apkFile); 
    intent.setDataAndType(fileUri, "application/vnd.android.package-archive"); 
    intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    startActivity(intent); 

provider_paths.xml:

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!--<external-path name="external_files" path="."/>--> 
    <external-path path="Android/data/YOUR_PACKAGE_NAME" name="files_root" /> 
    <external-path path="." name="external_storage_root" /> 
</paths> 

where YOUR_PACKAGE_NAME è il nome del pacchetto dell'app.

manifestare:

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="${applicationId}.provider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/provider_paths"/> 
    </provider> 
Problemi correlati