3

DownloadManagerを介してファイルをダウンロードしようとしていますが、ほとんどの電話(Nexusファミリー、S3など)では完全に機能しますが、Galaxy S2では何らかの理由でダウンロードは機能しますが、ファイルの名前が間違って設定されています。それを開くには(通知から、またはアプリをダウンロードするか)、jpeg、gif、pngなどのファイルであってもファイルを開くことができないと表示されます。

ここに画像の説明を入力してください

コードは次のとおりです。

DownloadManager downloadManager = (DownloadManager) service
                .getSystemService(Context.DOWNLOAD_SERVICE);
        DownloadManager.Request downloadReq = new DownloadManager.Request(
                Uri.parse(URL));
        downloadReq
                .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI
                        | DownloadManager.Request.NETWORK_MOBILE);
        downloadReq.allowScanningByMediaScanner();
        downloadReq.setMimeType(attachment.mimeType);
        downloadReq.setTitle(attachment.fileName);
        downloadReq.setDescription("attachment");
        downloadReq.setDestinationInExternalFilesDir(service,
                Environment.DIRECTORY_DOWNLOADS, "");
        downloadReq
                .setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE
                        | DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        downloadIDs.add(downloadManager.enqueue(downloadReq));

また、すべてのURLがhttpsであり、電話のAndroidバージョンが4.1.2であることに注意してください。

どうもありがとう!

更新:この呼び出しでファイル名を追加した場合:

downloadReq.setDestinationInExternalFilesDir(service,
                Environment.DIRECTORY_DOWNLOADS, attachment.fileName);

良い名前は通知センターに表示されます。

4

1 に答える 1

0

ファイルのダウンロードが完了したら、ブロードキャストを受信するために自分自身を登録する必要があります。あちらでファイル名を取得することもできます。これには、コードにいくつかの変更が必要になります。

エンキュー呼び出しから返されたIDを保持します。

long enqueue = downloadManager.enqueue(downloadReq);

ブロードキャストを取得するには、レシーバーを登録します。

getApplicationContext().registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

受信者を宣言します。

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (!DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
            return;
        }
        context.getApplicationContext().unregisterReceiver(receiver);
        Query query = new Query();
        query.setFilterById(enqueue);
        Cursor c = dm.query(query);
        if (c.moveToFirst()) {
            int columnIndex = c.getColumnIndex(DownloadManager.COLUMN_STATUS);
            if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(columnIndex)) {

                String uriString = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
                Log.i(TAG, "downloaded file " + uriString);                    
            } else {
                Log.i(TAG, "download failed " + c.getInt(columnIndex));                    
            }
        }
    }
};

ダウンロード用のファイル名を想定することはお勧めできません。前のものを削除せずに再度ダウンロードすると、自動的にサフィックスが付けられます。

于 2013-03-08T11:16:23.990 に答える