Java SetDestinationNexternalFilesDir()工作SetDestinationNexternalPublicDir()不工作';T

Java SetDestinationNexternalFilesDir()工作SetDestinationNexternalPublicDir()不工作';T,java,android,android-download-manager,Java,Android,Android Download Manager,我正在尝试从url下载文件并将其保存到general downloads文件夹setDestinationNexternalPublicDir()不起作用,也不会引发任何异常。但是setdestinationnexternalfilesdir()工作正常。你知道原因是什么吗 我的代码如下: webView.setDownloadListener(new DownloadListener() { @Override public void onDownloadStart(Strin

我正在尝试从url下载文件并将其保存到general downloads文件夹
setDestinationNexternalPublicDir()
不起作用,也不会引发任何异常。但是
setdestinationnexternalfilesdir()
工作正常。你知道原因是什么吗

我的代码如下:

webView.setDownloadListener(new DownloadListener() {
    @Override
    public void onDownloadStart(String url, String userAgent,
                                String contentDisposition, String mimeType,
                                long contentLength) {

        if (url.startsWith("data:")) {
            save(url);
            return;
        }


        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
        request.setMimeType(mimeType);
        String cookies = CookieManager.getInstance().getCookie(url);
        request.addRequestHeader("cookie", cookies);
        request.addRequestHeader("User-Agent", userAgent);
        request.setDescription(getResources().getString(R.string.downloadingMsg));
        String filename = URLUtil.guessFileName(url, contentDisposition, mimeType);
        request.setTitle(filename);
        request.allowScanningByMediaScanner();
        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//DOESN'T WORK
            request.setDestinationInExternalPublicDir("Downloads", filename); 
//WORKS
            //request.setDestinationInExternalFilesDir(getApplicationContext(), "Downloads", filename); 
        DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        dm.enqueue(request);
        Toast.makeText(getApplicationContext(), R.string.downloadingMsg, Toast.LENGTH_LONG).show();
    }
});
和清单文件:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

从url下载图像的我的解决方案

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Environment;
import android.provider.CalendarContract;
import android.util.Log;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.util.UUID;

public class DownloadImage extends AsyncTask<String, Void, Bitmap> implements MediaScannerConnection.MediaScannerConnectionClient {

    private Context context;
    private File mFile;
    private MediaScannerConnection mMs;


    public DownloadImage(Context context) {
        this.context = context;
    }

    private Bitmap downloadImageBitmap(String sUrl) {
        Bitmap bitmap = null;
        try {
            InputStream inputStream = new URL(sUrl).openStream();   // Download Image from URL
            bitmap = BitmapFactory.decodeStream(inputStream);       // Decode Bitmap
            inputStream.close();
        } catch (Exception e) {
            Log.d(TAG, "Exception 1, Something went wrong!");
            e.printStackTrace();
        }
        return bitmap;
    }

    @Override
    protected Bitmap doInBackground(String... params) {
        return downloadImageBitmap(params[0]);
    }

    protected void onPostExecute(Bitmap result) {
        String fileName = UUID.randomUUID().toString();
        getFilePath(fileName + ".jpg", result, context);
    }


    public void getFilePath(String name, Bitmap bitmap2, Context context) {
        Bitmap bitmap = bitmap2;
        String root = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).toString();//Downloads folder path
        File myDir = new File(root);
        myDir.mkdirs();
        String fname = name.replaceAll("-", "");
        File file = new File(myDir, fname);
        if (file.exists()) {
            file.delete();
        }
        try {
            FileOutputStream out = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
            out.flush();
            out.close();
        } catch (Exception e) {
            Toast.makeText(context, "Error occurred", Toast.LENGTH_SHORT).show();
            return;
        }

        Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show();

        mFile = file;
        mMs = new MediaScannerConnection(context, this);//finding image in gallery after download 
        mMs.connect();

    }

    @Override
    public void onMediaScannerConnected() {
        mMs.scanFile(mFile.getAbsolutePath(), null);
    }

    @Override
    public void onScanCompleted(String path, Uri uri) {
        mMs.disconnect();
    }
}
UPD1:
我想您可以使用文件下载此代码。

因此,我终于可以让setDestinationNexternalPublicDir()函数工作了。多亏了公共软件。通过遵循Commonware的评论和回答,我了解到在android版本6+上,即使在清单文件中声明了权限,也应该在运行时请求它们。你猜怎么着,我在用安卓7。。。也就是说,我的权限被拒绝了

因此,我在我的
onCreate()
函数中添加了这些行,这将提示用户在运行时获得权限(这最终解决了我的问题):


我也使用了AsyncTask,并且我得到了被拒绝的权限错误
DownloadImage downloadImage = new DownloadImage(this);
downloadImage.execute("url");
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        int PERMISSION_REQUEST_CODE = 1;
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {

            if (ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this,
                    Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            } else {
                ActivityCompat.requestPermissions(MainActivity.this,
                        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                        PERMISSION_REQUEST_CODE);
            }
        }
    }