1

Ich versuche, meine App durch Herunterladen der apk mit Download-Manager zu aktualisieren. Ich habe Rundfunkempfänger registriert, um DownloadManager.ACTION_DOWNLOAD_COMPLETE in MainActivity zu hören und die apk in onReceive Methode zu öffnen. Im Folgenden finden Sie den Code ein:Android Update-App über App neu startet mit DownloadManager (vermeiden Sie den Download mehrmals)

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) auf einen Klick in UI aufgerufen wird. Nach dem Klick auf den Button wird der Download gestartet. Nehmen wir an, die App ist geschlossen (Empfänger ist nicht registriert), nachdem der Download gestartet wurde. Ich habe Probleme mit zwei Szenarien, wenn die App erneut gestartet wird.

  1. Der vorherige Download abgeschlossen ist nach meiner app neu gestartet wird -
    downloadReference verloren, und wenn mein Empfänger die Sendung empfängt, wird die referenceId gewohnt gleiche wie downloadReference, so wird installIntent nie gestartet. Also Ich muss noch einmal auf Update klicken und den Download starten. Ist gibt es eine Möglichkeit, dieses Problem zu vermeiden?

  2. Der vorherige Download wird abgeschlossen, bevor meine App neu gestartet wird - Es ist nicht möglich zu wissen, dass mein vorheriger Download in der neu gestarteten Aktivität abgeschlossen ist. Wieder muss ich auf den Button klicken und den Download neu starten. Gibt es eine Möglichkeit, Sticky Broadcast für Download-Manager zu aktivieren?

Antwort

0

Dazu müssen Sie die Download-Referenz in Ihrer Präferenz speichern. Dann können Sie den DownloadManager mit DownloadManager.Query() abfragen, der einen Cursor zurückgibt, der alle von Ihrer App an DownloadManager geposteten Download-Anfragen enthält. Dann können Sie die ID downloadReference abgleichen und dann den Status Ihres Downloads überprüfen. Wenn es abgeschlossen ist, können Sie den Pfad von DownloadManager.COLUMN_LOCAL_FILENAME abrufen.

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