1

Iam пытается обновить мое приложение, загрузив apk с помощью диспетчера загрузки. Я зарегистрировал широковещательный приемник для прослушивания DownloadManager.ACTION_DOWNLOAD_COMPLETE в MainActivity и откройте apk в методе onReceive. Ниже приводится код:Приложение для обновления Android через приложение перезагружается с помощью DownloadManager (во избежание загрузки нескольких раз)

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) вызывается нажатием кнопки в интерфейсе. Теперь после нажатия кнопки начинается загрузка. Допустим, приложение закрыто (приемник незарегистрирован) после запуска загрузки, у меня проблема с двумя сценариями, когда приложение запускается снова.

  1. Предыдущая загрузка завершится после того, как мое приложение перезапускается -
    downloadReference теряется и когда мой приемник принимает передачу, то referenceId обыкновение быть такой же, как downloadReference, так installIntent никогда не начал. Итак, Мне нужно снова нажать кнопку «Обновить» и начать загрузку. Есть Есть ли способ избежать этой проблемы?

  2. Предыдущая загрузка завершена до перезагрузки моего приложения. Невозможно узнать, что моя предыдущая загрузка завершена в вновь запущенном действии. Снова я должен нажать кнопку и возобновить загрузку. Есть ли способ включить липкую версию для диспетчера загрузки?

ответ

0

Для этого вам необходимо сохранить ссылку для скачивания по своему усмотрению. Затем вы можете запросить DownloadManager с помощью DownloadManager.Query(), который вернет курсор, содержащий все запросы на загрузку, отправленные вашим приложением DownloadManager. Затем вы можете сопоставить идентификатор downloadReference, а затем проверить статус загрузки. Если он завершен, вы можете получить путь от 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(); 
    } 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^