[英]Unable to write pdf on External storage Android
I am not able to write a pdf file downloaded from a url into android storage. 我无法将从网址下载的pdf文件写入Android存储设备。 I have read all related questions on this site, but still unable to fighre out whats wrong with my code.
我已经阅读了本网站上的所有相关问题,但仍然无法找出我的代码有什么问题。
Error is in pdfFile.createNewFile(); pdfFile.createNewFile()中有错误; inside try{ } block.
在try {}块中。
private class DownloadFile extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
String fileUrl = strings[0];
String fileName = strings[1];
String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "/test/");
folder.mkdirs();
File pdfFile = new File(folder, fileName);
try{
pdfFile.getParentFile().mkdirs();
pdfFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
return null;
}
My Logcat 我的Logcat
06-24 19:11:26.886 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: java.io.IOException: open failed: ENOENT (No such file or directory)
06-24 19:11:26.886 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.io.File.createNewFile(File.java:939)
06-24 19:11:26.886 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at in.ac.iitd.bsw.iitdapp.VolleyDownload$DownloadFile.doInBackground(VolleyDownload.java:112)
06-24 19:11:26.888 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at in.ac.iitd.bsw.iitdapp.VolleyDownload$DownloadFile.doInBackground(VolleyDownload.java:96)
06-24 19:11:26.888 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
06-24 19:11:26.888 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.lang.Thread.run(Thread.java:818)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
06-24 19:11:26.889 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.Posix.open(Native Method)
06-24 19:11:26.890 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
06-24 19:11:26.890 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.io.File.createNewFile(File.java:932)
06-24 19:11:26.890 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: ... 8 more
06-24 19:11:26.890 22920-22999/in.ac.iitd.bsw.iitdapp W/System: ClassLoader referenced unknown path: /system/framework/tcmclient.jar
06-24 19:11:27.040 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: java.io.FileNotFoundException: /storage/emulated/0/test/maven.pdf: open failed: ENOENT (No such file or directory)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:87)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.io.FileOutputStream.<init>(FileOutputStream.java:72)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at in.ac.iitd.bsw.iitdapp.FileDownloader.downloadFile(FileDownloader.java:27)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at in.ac.iitd.bsw.iitdapp.VolleyDownload$DownloadFile.doInBackground(VolleyDownload.java:116)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at in.ac.iitd.bsw.iitdapp.VolleyDownload$DownloadFile.doInBackground(VolleyDownload.java:96)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
06-24 19:11:27.041 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
06-24 19:11:27.042 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at java.lang.Thread.run(Thread.java:818)
06-24 19:11:27.042 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
06-24 19:11:27.043 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.Posix.open(Native Method)
06-24 19:11:27.043 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
06-24 19:11:27.043 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
06-24 19:11:27.043 22920-22999/in.ac.iitd.bsw.iitdapp W/System.err: ... 11 more
I have correctly set permission in Android Manifest 我已经在Android清单中正确设置了权限
I was testing it on my device running Android 6.0 Marshmallow, which requires extra permissions to access sensitive data. 我在运行Android 6.0 Marshmallow的设备上进行了测试,该设备需要额外的权限才能访问敏感数据。
Credit - @CommonsWare Android permission doesn't work even if I have declared it 信用- 即使我已声明 @CommonsWare Android权限也无法使用
This method can be used to ask user for permissions. 此方法可用于向用户询问权限。 Original answer - https://stackoverflow.com/a/33162451/4420961
原始答案-https: //stackoverflow.com/a/33162451/4420961
public boolean isStoragePermissionGranted() {
if (Build.VERSION.SDK_INT >= 23) {
if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_GRANTED) {
Log.v(TAG,"Permission is granted");
return true;
} else {
Log.v(TAG,"Permission is revoked");
ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
return false;
}
}
else { //permission is automatically granted on sdk<23 upon installation
Log.v(TAG,"Permission is granted");
return true;
}
}
Please try this. 请尝试这个。
private class DownloadFile extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... strings) {
String fileUrl = strings[0];
String fileName = strings[1];
String extStorageDirectory = Environment.getExternalStorageDirectory().getPath() + "/test/";
File folder = new File(extStorageDirectory);
if (!folder.exists()) {
folder.mkdirs();
}
fileName = extStorageDirectory + fileName;
File pdfFile = new File(fileName);
try{
pdfFile.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
return null;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.