1

私はをMainActivityに聞いて、onReceiveの方法でapkを開いて放送受信機を登録しました。ダウンロードマネージャを使用してapkをダウンロードしてアプリケーションを更新しようとしています。ダウンロードマネージャを使用してアプリケーション間でAndroidアップデートアプリを再起動します(複数回のダウンロードは避けてください)

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)がUI内のボタンのクリック時に呼び出されます。 以下はコードです。 ボタンをクリックすると、ダウンロードが開始されます。ダウンロードを開始した後、アプリケーションが閉じられている(受信者が登録解除されている)と言いますが、アプリが再び起動される2つのシナリオに問題があります。 downloadReference
が失われ、私の受信機は、放送を受信したとき、referenceIdは文句を言わないので、installIntentが開始されることはありませんdownloadReferenceと同じにすること - 私のアプリを再起動した後

  1. 以前のダウンロードが完了します。だから もう一度[更新]ボタンをクリックしてダウンロードを開始する必要があります。 この問題を回避する方法はありますか?

  2. 私のアプリが再起動される前に前回のダウンロードが完了しました。 - 私の前回のダウンロードが完了したことを知る方法は、新しく開始されたアクティビティ です。もう一度ボタンをクリックしてダウンロードを再開する必要があります。 ブロードキャストをダウンロードマネージャにブロードキャストする方法はありますか?

答えて

0

このためには、ダウンロードリファレンスを希望どおりに保存する必要があります。次に、DownloadManager.Query()を使用してDownloadManagerを照会すると、アプリによってDownloadManagerに投稿されたすべてのダウンロード要求を保持するカーソルが返されます。その後、downloadReferenceのIDと一致させ、ダウンロードのステータスを確認することができます。完了したら、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(); 
    } 
    } 
} 
関連する問題