已授予权限,但是当我尝试保存文件时出现权限被拒绝异常
Permission granted, but when I try to save file I get permission denied exception
我正在尝试下载 PDF 文件并将其保存到设备内存中。
public void downloadPdfAttachment(Activity activity, Attachment attachment) {
Dexter.withActivity(activity)
.withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted() && attachment != null) {
startPdfAttachmentDownload(activity, attachment);
} else {
view.displayStoragePermissionRequired();
}
}
@Override public void onPermissionRationaleShouldBeShown(
List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
我在这里获得了所有两个许可。然后我尝试下载附件并保存。
public static String savePdfToDisk(Context context, ResponseBody body, String pdfName) {
try {
File fileDirectory = new File(getPdfFolder(context));
fileDirectory.mkdir();
File file = new File(fileDirectory, pdfName);
file.createNewFile();
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
inputStream = body.byteStream();
outputStream = new FileOutputStream(file);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
Log.d("PdfUtils", "file download: " + fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return file.getAbsolutePath();
} catch (IOException e) {
Log.d("PdfUtils", e.getMessage());
return null;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
}
} catch (IOException e) {
Log.d("PdfUtils", e.getMessage());
return null;
}
}
public static String getPdfFolder(Context context) {
return context.getFilesDir()+ "/my_app_name/pdf_files";
}
在这一行我得到了权限被拒绝的异常。
file.createNewFile();
我仔细检查了应用程序设置并授予了存储权限。
这是我的清单文件:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
有什么想法吗?
试试这个,
public static String getPdfFolder(Context context) {
return context.getFilesDir().getAbsolutePath() + "/my_app_name/pdf_files";
}
getFilesDir 的 return 值是 File 类型,因此如果您以这种方式进行字符串转换,将无法获得正确的路径。
问题是我的目标是 Android 10,API 29,他们更改了存储权限。
我正在尝试下载 PDF 文件并将其保存到设备内存中。
public void downloadPdfAttachment(Activity activity, Attachment attachment) {
Dexter.withActivity(activity)
.withPermissions(Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE)
.withListener(new MultiplePermissionsListener() {
@Override public void onPermissionsChecked(MultiplePermissionsReport report) {
if (report.areAllPermissionsGranted() && attachment != null) {
startPdfAttachmentDownload(activity, attachment);
} else {
view.displayStoragePermissionRequired();
}
}
@Override public void onPermissionRationaleShouldBeShown(
List<PermissionRequest> permissions, PermissionToken token) {
token.continuePermissionRequest();
}
}).check();
}
我在这里获得了所有两个许可。然后我尝试下载附件并保存。
public static String savePdfToDisk(Context context, ResponseBody body, String pdfName) {
try {
File fileDirectory = new File(getPdfFolder(context));
fileDirectory.mkdir();
File file = new File(fileDirectory, pdfName);
file.createNewFile();
InputStream inputStream = null;
OutputStream outputStream = null;
try {
byte[] fileReader = new byte[4096];
long fileSize = body.contentLength();
long fileSizeDownloaded = 0;
inputStream = body.byteStream();
outputStream = new FileOutputStream(file);
while (true) {
int read = inputStream.read(fileReader);
if (read == -1) {
break;
}
outputStream.write(fileReader, 0, read);
fileSizeDownloaded += read;
Log.d("PdfUtils", "file download: " + fileSizeDownloaded + " of " + fileSize);
}
outputStream.flush();
return file.getAbsolutePath();
} catch (IOException e) {
Log.d("PdfUtils", e.getMessage());
return null;
} finally {
if (inputStream != null) {
inputStream.close();
}
if (outputStream != null) {
outputStream.flush();
outputStream.close();
}
}
} catch (IOException e) {
Log.d("PdfUtils", e.getMessage());
return null;
}
}
public static String getPdfFolder(Context context) {
return context.getFilesDir()+ "/my_app_name/pdf_files";
}
在这一行我得到了权限被拒绝的异常。
file.createNewFile();
我仔细检查了应用程序设置并授予了存储权限。
这是我的清单文件:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
有什么想法吗?
试试这个,
public static String getPdfFolder(Context context) {
return context.getFilesDir().getAbsolutePath() + "/my_app_name/pdf_files";
}
getFilesDir 的 return 值是 File 类型,因此如果您以这种方式进行字符串转换,将无法获得正确的路径。
问题是我的目标是 Android 10,API 29,他们更改了存储权限。