下载文件需要什么权限?

时间:2018-03-31 15:45:08

标签: android android-permissions

我正在尝试使用public void downloadFile(View view) { String urlString = "your_url_here"; try { // Get file name from the url String fileName = urlString.substring(urlString.lastIndexOf("/") + 1); // Create Download Request object DownloadManager.Request request = new DownloadManager.Request(Uri.parse((urlString))); // Display download progress and status message in notification bar request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // Set description to display in notification request.setDescription("Download " + fileName + " from " + urlString); // Set title request.setTitle("DownloadManager"); // Set destination location for the downloaded file request.setDestinationUri(Uri.parse("file://" + Environment.getExternalStorageDirectory() + "/" + fileName)); // Download the file if the Download manager is ready did = dManager.enqueue(request); } catch (Exception e) { } } // BroadcastReceiver to receive intent broadcast by DownloadManager private BroadcastReceiver downloadReceiver = new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { // TODO Auto-generated method stub Query q = new Query(); q.setFilterById(did); Cursor cursor = dManager.query(q); if (cursor.moveToFirst()) { String message = ""; int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); if (status == DownloadManager.STATUS_SUCCESSFUL) { message = "Download successful"; } else if (status == DownloadManager.STATUS_FAILED) { message = "Download failed"; } tvMessage.setText(message); } } }; 类下载文件。

dexter

我正在使用 Dexter.withActivity(this) .withPermission(Manifest.permission.READ_EXTERNAL_STORAGE) .withListener(new PermissionListener() { @Override public void onPermissionGranted(PermissionGrantedResponse response) { 获取权限

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

我的清单中也有两个

No permission to write to /storage/emulated/0/download: Neither user 10205 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.

但是我在尝试下载文件时仍然遇到此错误(仅限Oreo)。它适用于android 7

{{1}}

3 个答案:

答案 0 :(得分:2)

您只需要互联网许可。

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

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

如果您想存储和阅读此下载文件。

答案 1 :(得分:1)

需要互联网许可:

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

如果要保存没有任何存储权限的文件,则可以使用getExternalFilesDir。 如文档中所述:

  

getExternalFilesDir

     

添加到API level 8

     

File getExternalFilesDir (String type)

     

返回主目录上目录的绝对路径   可以放置应用程序的共享/外部存储设备   它拥有的永久文件。这些文件是内部文件   应用程序,通常对用户来说是不可见的。

     

这类似于getFilesDir(),因为当   应用程序已卸载,但是有一些重要的   区别:共享存储可能并不总是可用,因为   用户可以弹出可移动媒体。可以检查媒体状态   使用getExternalStorageState(File)。没有强制执行安全性   这些文件。例如,任何持有   WRITE_EXTERNAL_STORAGE可以写入这些文件。

     

如果模拟共享存储设备(由isExternalStorageEmulated(File)确定),   它的内容由私有用户数据分区支持,这意味着   在这里存储数据而不是私有数据几乎没有什么好处   getFilesDir()等返回的目录。

     

从KITKAT开始,不需要任何权限来读取或写入返回的路径;调用应用程序始终可以访问它。这仅适用于为调用应用程序的程序包名称生成的路径。

     

访问路径   属于其他软件包WRITE_EXTERNAL_STORAGE和/或   READ_EXTERNAL_STORAGE是必需的。在具有多个用户的设备上(例如   由UserManager描述),每个用户都有各自独立的共享   存储。应用程序只能访问共享存储   用户以他们的身份运行。

     

如果出现以下情况,返回的路径可能会随时间变化   插入了不同的共享存储介质,因此只有相对路径   应该坚持下去。

https://developer.android.com/reference/android/content/Context#getExternalFilesDir(java.lang.String)


此链接可能有用:

Save files on device storage

答案 2 :(得分:1)

您收到此错误,因为您的应用程序在Android 6.0(API级别23)上运行。从API级别> = 23开始,您将需要在运行时检查权限。您的代码仅适用于23级以下。因此,请首先检查您的用户是否已获得使用存储的权限:

if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
    Log.e("Permission error","You have permission");
    return true;
}

如果没有,则提示请求:

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);

总的情况如下:

public  boolean haveStoragePermission() {
    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            Log.e("Permission error","You have permission");
            return true;
        } else {

            Log.e("Permission error","You have asked for permission");
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
    else { //you dont need to worry about these stuff below api level 23
        Log.e("Permission error","You already have the permission");
        return true;
    }
}

并通过回调接收结果:

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if(grantResults[0]== PackageManager.PERMISSION_GRANTED){
            //you have the permission now.
            DownloadManager.Request request = new DownloadManager.Request(Uri.parse(myurl));
            request.setTitle("Vertretungsplan");
            request.setDescription("wird heruntergeladen");
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            String filename = URLUtil.guessFileName(myurl, null, MimeTypeMap.getFileExtensionFromUrl(myurl));
            request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
            DownloadManager manager = (DownloadManager) c.getSystemService(Context.DOWNLOAD_SERVICE);
            manager.enqueue(request);
        }
    }