32

次の方法でいくつかのファイルをダウンロードするためにAndroidDownloadMangerシステムサービスを使用しています

dwnId = mgr.enqueue(new DownloadManager.Request(serveruri)
        .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI |
                DownloadManager.Request.NETWORK_MOBILE)
                .setAllowedOverRoaming(false)
                .setTitle(getAlbumName())
                .setDescription(getTrackName())
                .setDestinationUri(deviceUri)
                .setShowRunningNotification(true));

ここで、mgrはダウンロードマネージャーインスタンスであり、dwnIdは一意のIDが返されます。私も登録していますACTION_DOWNLOAD_COMPLETE

registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

そして、onDownloadComplete BroadcastReceiverのonReceive()メソッドで、ダウンロードIDを取得しています。

Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);

その後、ダウンロードマネージャーにダウンロードステータスを問い合わせています

Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

DownloadManager.STATUS_*定数の場合。

問題は、同じdwnIdに対して同じdownIdを2回(onReceiveメソッドが2回呼び出されることを意味します)、1回はDownloadManager.STATUS_SUCCESSFULステータスで、もう1回はDownloadManager.STATUS_FAILEDステータスで受信していることです。一度に約10個のファイルをダウンロードするように要求していますが、デバイスのダウンロードマネージャーでは、左上の通知バーにダウンロード数が約12または13と表示されています。ダウンロードマネージャーはファイルのダウンロードに問題があり、同じファイルを再度ダウンロードするために再開または自動的に再起動したと思います。そのため、ダウンロードを要求したファイル数とダウンロードキューの実際の数に違いがあります。このため、同じDownloadIdの完全なアクションを2回取得しています。これが本当なら、それを制限する方法。実際のダウンロードを要求したものとのカウントの違いの理由は何でしょうか?放送受信機が同じダウンロードIDを2回受信するのはなぜですか。誰か教えてもらえますか?

前もって感謝します...

4

3 に答える 3

37

これは報告されたバグです:http ://code.google.com/p/android/issues/detail?id = 18462

私が見つけた回避策は、ダウンロードが成功したかどうかを確認することです。そうでない場合は、インテントを破棄するか、ダウンロードされなかった場合はファイルを再キューイングします...

その1つを理解するために数時間を失った:(

**編集:コード例を追加**

/**
 * Check if download was valid, see issue
 * http://code.google.com/p/android/issues/detail?id=18462
 * @param long1
 * @return
 */
private boolean validDownload(long downloadId) {

    Log.d(TAG,"Checking download status for id: " + downloadId);

    //Verify if download is a success
    Cursor c= dMgr.query(new DownloadManager.Query().setFilterById(downloadId));

    if(c.moveToFirst()){            
        int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

        if(status == DownloadManager.STATUS_SUCCESSFUL){
            return true; //Download is valid, celebrate
        }else{
            int reason = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON));
            Log.d(TAG, "Download not correct, status [" + status + "] reason [" + reason + "]");            
            return false;
        }   
    }               
    return false;                                   
}

完全なコードについては、https ://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.javaを参照してください。

于 2012-04-15T20:33:23.590 に答える
1

ファイルをダウンロードする簡単な方法。通知バーでダウンロードの進行状況を確認し、通知バーでファイルをクリックするだけで、ダウンロードが完了したらファイルを開くこともできます。

このメソッドを呼び出してファイル名を渡し、URLをダウンロードするだけです

 public void downloadFile(String name, String url){ 
        //download link
        downloadUri = Uri.parse(url);

        DownloadManager.Request request = new DownloadManager.Request(downloadUri);

        //allow download to take place over wifi, mobile network and roaming
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE ).setAllowedOverRoaming(true);
        request.setAllowedOverRoaming(false);

        //name to show while downloading
        request.setTitle(name);

        //description to show while downloading
        request.setDescription("Downloading " + name);

        //show on navigation
        request.setVisibleInDownloadsUi(true);

        //download path
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS.toString(), "/" + name);

        //file open when item on navigation is clicked
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
       long downloadId = downloadManager.enqueue(request);

    }

出力

下の画像からの出力を参照してください

あなたはここでもっと学ぶことができます

于 2018-04-17T19:18:37.473 に答える
0

各ダウンロードタスクの完了後に特定の作業を行うために、BroadcastReceiverの下にブール値または数値の条件を追加することもできます。

など

private BroadcastReceiver onDownloadComplete = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Fetching the download id received with the broadcast
        long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
        //Checking if the received broadcast is for our enqueued download by matching download id
        if (downloadID == id) {
            //firstDownload is a boolean variable and assign each downloadManager as true or false

            if (firstDownload) {
                //First task downlaoded
            } else {
                //Second task downloaded


            }
        }


    };
于 2021-10-25T06:48:02.543 に答える