1

J'essaie de mettre à jour mon application en téléchargeant l'apk en utilisant le gestionnaire de téléchargement. J'ai enregistré le récepteur de diffusion pour écouter DownloadManager.ACTION_DOWNLOAD_COMPLETE dans MainActivity et ouvrir l'apk dans la méthode onReceive. Voici le code:Application de mise à jour Android à travers l'application redémarre en utilisant DownloadManager (éviter de télécharger plusieurs fois)

public class MainActivity extends CordovaActivity { 
private long downloadReference; 
private DownloadManager downloadManager; 
private IntentFilter intentFilter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    registerReceiver(downloadReceiver, intentFilter); 

} 

public void updateApp(String url) { 
    //start downloading the file using the download manager 
    downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    Uri Download_Uri = Uri.parse(url); 
    DownloadManager.Request request = new DownloadManager.Request(Download_Uri); 
    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI); 
    request.setAllowedOverRoaming(false); 
    request.setDestinationInExternalFilesDir(MainActivity.this, Environment.DIRECTORY_DOWNLOADS, "myapk.apk"); 
    downloadReference = downloadManager.enqueue(request); 
} 


@Override 
public void onDestroy() { 
    //unregister your receivers 
    this.unregisterReceiver(downloadReceiver); 
    super.onDestroy(); 
} 

private BroadcastReceiver downloadReceiver = new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     //check if the broadcast message is for our Enqueued download 
     long referenceId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == referenceId) { 

      //start the installation of the latest version 
        Intent installIntent = new Intent(Intent.ACTION_VIEW); 
       installIntent.setDataAndType(downloadManager.getUriForDownloadedFile(downloadReference), 
         "application/vnd.android.package-archive"); 
       installIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       context.startActivity(installIntent); 

     } 

    } 

}; 

} 

updateApp(url) est appelé clic d'un bouton dans l'interface utilisateur. Maintenant, après avoir cliqué sur le bouton, le téléchargement commence. Disons que l'application est fermée (le récepteur n'est pas enregistré) après avoir lancé le téléchargement, j'ai un problème avec deux scénarios lorsque l'application est relancée.

  1. Le téléchargement précédent se termine après mon application redémarre -
    downloadReference est perdu et quand mon récepteur reçoit l'émission, le referenceId ne sera pas identique à downloadReference, donc installIntent est jamais commencé. Donc Je dois encore cliquer sur le bouton Mettre à jour et lancer le téléchargement. Y at-il un moyen d'éviter ce problème?

  2. Le téléchargement précédent se termine avant le redémarrage de mon application - Il est impossible de savoir que mon dernier téléchargement est terminé en l'activité nouvellement démarrée. Encore une fois je dois cliquer sur le bouton et relancer le téléchargement. Est-il possible d'activer la diffusion pour le gestionnaire de téléchargement?

Répondre

0

Pour cela, vous devez stocker la référence de téléchargement dans votre préférence. Ensuite, vous pouvez interroger le DownloadManager en utilisant DownloadManager.Query() qui renverra un curseur contenant toutes les demandes de téléchargement publiées à DownloadManager par votre application. Ensuite, vous pouvez faire correspondre l'ID downloadReference, puis vérifier l'état de votre téléchargement. Si c'est terminé, vous pouvez obtenir le chemin de DownloadManager.COLUMN_LOCAL_FILENAME.

private void updateDownloadStatus(long downloadReference) {  
    DownloadManager.Query query = new DownloadManager.Query(); 

    // if you have stored the downloadReference. Else you have to loop through the cursor. 
    query.setFilterById(downloadReference); 

    Cursor cursor = null; 

    try { 
    cursor = DOWNLOAD_MANAGER.query(query); 
    if (cursor == null || !cursor.moveToFirst()) { 
     // restart download 
     return; 
    } 
    float bytesDownloaded = 
     cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); 
    float bytesTotal = 
     cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); 
    int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS); 
    int downloadStatus = cursor.getInt(columnIndex); 
    int columnReason = cursor.getColumnIndex(DownloadManager.COLUMN_REASON); 
    int failureStatus = cursor.getInt(columnReason); 
    int filePathInt = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); 
    String filePath = cursor.getString(filePathInt); 

    switch (downloadStatus) { 
     case DownloadManager.STATUS_FAILED: 
     case DownloadManager.ERROR_FILE_ERROR: 
     // restart download 
     break; 

     case DownloadManager.STATUS_SUCCESSFUL: 
     if (filePath != null) { 
      //got the file 
     } else { 
      //restart 
     } 
     break; 

     case DownloadManager.STATUS_PENDING: 
     case DownloadManager.STATUS_RUNNING: 
     case DownloadManager.STATUS_PAUSED: 
     /// wait till download finishes 
     break; 
    } 
    } catch (Exception e) { 
    Log.e("Error","message" + e.getMessage(), e); 
    } finally { 
    if (cursor != null) { 
     cursor.close(); 
    } 
    } 
}