1

Как проверить, загружен ли файл и запустить его установку? У меня есть код:Проверьте, загрузил ли Download Manager файл

public void downloadUpdate(String url){ 

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url)); 
    request.setDescription("Downloading..."); 
    request.setTitle("App Update"); 
    request.allowScanningByMediaScanner(); 
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 

    String name = URLUtil.guessFileName(url, null, MimeTypeMap.getFileExtensionFromUrl(url)); 

    request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, name); 

    DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
    manager.enqueue(request); 
} 
+0

Проверьте это http://www.gadgetsaint.com/android/download-manager/ – ASP

ответ

4

Чтобы проверить загружен ли менеджер загрузки файла, вы должны реализующие свой BroatcastReceiver.

@Override 
public void onReceive(Context context, Intent intent) { 
    String action = intent.getAction(); 
    if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) { 
     DownloadManager.Query query = new DownloadManager.Query(); 
     query.setFilterById(intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0)); 
     DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE); 
     Cursor cursor = manager.query(query); 
     if (cursor.moveToFirst()) { 
      if (cursor.getCount() > 0) { 
       int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); 
       if (status == DownloadManager.STATUS_SUCCESSFUL) { 
        String file = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME)); 
        // So something here on success 
       } else { 
        int message = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); 
        // So something here on failed. 
       } 
      } 
     } 
    } 
} 

Однако я не уверен, можно ли программно установить APK. По соображениям безопасности, я не думаю, что вы можете. Для обновления приложения, я думаю, вы должны использовать контроль версий Google. При повторном развертывании приложения с использованием другого номера версии пользователи могут автоматически обновлять (если пользователь не отключится при игре в Google). Надеюсь, что это поможет.

Update

Вам не нужно вызвать метод, который я упоминаю. Вам просто нужно объявить свой широковещательный приемник в вашем манифестном XML-файле, и DownloadManager будет звонить при завершении загрузки. Xml выглядит примерно так:

<receiver 
     android:name=".BroadcastReceiver" 
     android:enabled="true" 
     android:exported="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
      <action android:name="android.intent.action.DOWNLOAD_NOTIFICATION_CLICKED" /> 
     </intent-filter> 
    </receiver> 
+0

Как назвать этот метод? –

+0

Вам не нужно звонить, просто расширяет BroadcastReceiver и настраивается в вашем манифесте xml. Я уточнил ответ для более подробной информации. –

1

Это относительно простой способ. Он работал для меня: Вы должны добавить <receiver> тег в файле манифеста следующим образом:

<application> 
<receiver 
      android:name= "com.example.checkDownloadComplete" <!-- add desired full name here --> 
      android:exported="true" > 
      <intent-filter> 
       <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> 
      </intent-filter> 
</receiver> 
</application> 

Это зарегистрировать приемник вещания для случая, когда будет завершена загрузка. Это вызовет метод onReceive() в вашем классе, как только загрузка будет завершена. Помните, что вам нужен extend класс BroadcastReceiver, а не implement. Я использовал логическую переменную в качестве переключателя для проверки завершения загрузки. Таким образом, ваш класс Java будет что-то вроде:

public class checkDownloadComplete extends BroadcastReceiver{ 

    public static boolean isDownloadComplete= false; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     isDownloadComplete = true; 
     Log.i("Download completed?", String.valueOf(isDownloadcomplete)); 
    } 

} 

подождать, пока или проверить, является ли загрузка завершена из любого другого класса, используйте следующий простой код в желаемом подходящем месте:

while(!checkDownloadComplete.isDownloadcomplete){ 

    // add necessary code to be executed before completion of download 
} 
//code after completion of download 

Но помните, что если вам нужно проверить его несколько раз в своем проекте, вам нужно предварительно сбросить значение isDownloadComplete.