2010-08-25 6 views
5

J'ai une application que j'aimerais ajouter fonctionnalité de mise à jour automatique (ce n'est pas sur le marché). J'ai tout le code en place qui vérifierait si une mise à jour disponible, puis-je appeler quelque chose comme ceci:Android: comment ouvrir un fichier apk après le téléchargement pour mise à jour automatique?

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

qui commence le téléchargement du fichier. Y at-il un moyen que je peux dire par programme pour "ouvrir" le fichier pour commencer le processus d'installation sans que l'utilisateur doive aller aux téléchargements et en cliquant dessus?

Répondre

6

Cela va démarrer le processus d'installation

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

Cela ne fonctionnera plus, si vos objectifs d'application API 24 ou plus. Voir ma réponse ci-dessous –

4

La réponse ci-dessus était pré-API-24.

Si vos cibles d'applications API 24 ou plus (et devrait), vous devez utiliser autre chose (sinon vous obtenez FileUriExposedException, comme décrit 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> 

où YOUR_PACKAGE_NAME est le nom du package de votre application.

manifeste:

<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> 
Questions connexes