我正在尝试使用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}}
答案 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
描述),每个用户都有各自独立的共享 存储。应用程序只能访问共享存储 用户以他们的身份运行。如果出现以下情况,返回的路径可能会随时间变化 插入了不同的共享存储介质,因此只有相对路径 应该坚持下去。
此链接可能有用:
答案 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);
}
}