Проверьте, скачал ли 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);
}

person Community    schedule 29.03.2015    source источник


Ответы (2)


Чтобы проверить, загрузил ли менеджер загрузки файл, вы должны реализовать свой 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 Play). Надеюсь, что это поможет.

Обновить

Вам не нужно вызывать метод, который я упоминаю. Вам просто нужно объявить свой широковещательный приемник в 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>
person Joey Chong    schedule 30.03.2015
comment
Как вызвать этот метод? - person ; 30.03.2015
comment
Вам не нужно звонить, просто расширяйте BroadcastReceiver и настраивайте в своем XML-манифесте. Я обновил ответ для более подробной информации. - person Joey Chong; 31.03.2015
comment
подскажите, пожалуйста, как проверить наличие нескольких загруженных файлов.. я должен использовать цикл while, я не знаю, как использовать, пожалуйста, обновите ответ для нескольких файлов, сэр... - person Gowthaman M; 07.06.2018

Это относительно простой метод. У меня это сработало: вам нужно добавить тег <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 static 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.

person huskygrad    schedule 16.11.2015