Android 外部存储句柄不可用
Android External storage handle unavailability
在我的应用程序中,用户可以将屏幕截图和文件保存在他的外部存储中。但是外部存储不可写怎么办?我在将设备从棒棒糖更新为棉花糖时遇到了这个问题。当我尝试保存屏幕截图时,我的应用程序无法识别 SD 卡。但它可以通过 ES Filex Explorer 访问,但只读!每个设备上不应该保留一部分内部存储作为 "external" 存储吗?为什么这不起作用?
P.S。当外部存储可写时,代码运行良好!
那是我的代码:
Bitmap bitmap = getScreenshotFromRecyclerView(recyclerView);
File file = storeImage(bitmap, name);
if(file != null){
Toast.makeText(this, getString(R.string.screenshotSaved, name), Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(file.toURI().toString()), "image/*");
startActivity(intent);
}else{
Toast.makeText(this, getString(R.string.notAvailable), Toast.LENGTH_LONG).show();
}
private File storeImage(Bitmap image, String name) {
File pictureFile = getOutputMediaFile(name);
if (pictureFile == null) {
System.out.println("Error A");
}else{
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
image.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.close();
} catch (FileNotFoundException e) {
System.out.println("Error B");
} catch (IOException e) {
System.out.println("Error C");
}
}
return pictureFile;
}
private File getOutputMediaFile(String name){
File mediaStorageDir = new File(new Helper(this).getPathToAppFolder());
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
// Create a media file name#
File mediaFile;
if(!name.equals(getString(R.string.training))){
String timeStamp = new SimpleDateFormat("dd.MM.yyyy_HH:mm", Locale.getDefault()).format(new Date());
String mImageName= name + "_" + timeStamp + ".jpg";
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
}else{
String mImageName= name + ".jpg";
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
}
return mediaFile;
}
您将需要申请 Marshmallow 风格的权限,请参阅此处了解更多信息:https://guides.codepath.com/android/Understanding-App-Permissions#permission-updates-in-marshmallow
在 运行 文件保存操作之前,您需要检查权限是否被接受,如果未被接受,您可以决定让您的应用出现 "graceful" 失败的原因。
对于 write/read phone 存储,您需要从 Marshmallow 手动请求用户许可。
查看此示例或使用此 example 手动请求权限。
在我的应用程序中,用户可以将屏幕截图和文件保存在他的外部存储中。但是外部存储不可写怎么办?我在将设备从棒棒糖更新为棉花糖时遇到了这个问题。当我尝试保存屏幕截图时,我的应用程序无法识别 SD 卡。但它可以通过 ES Filex Explorer 访问,但只读!每个设备上不应该保留一部分内部存储作为 "external" 存储吗?为什么这不起作用?
P.S。当外部存储可写时,代码运行良好!
那是我的代码:
Bitmap bitmap = getScreenshotFromRecyclerView(recyclerView);
File file = storeImage(bitmap, name);
if(file != null){
Toast.makeText(this, getString(R.string.screenshotSaved, name), Toast.LENGTH_LONG).show();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(file.toURI().toString()), "image/*");
startActivity(intent);
}else{
Toast.makeText(this, getString(R.string.notAvailable), Toast.LENGTH_LONG).show();
}
private File storeImage(Bitmap image, String name) {
File pictureFile = getOutputMediaFile(name);
if (pictureFile == null) {
System.out.println("Error A");
}else{
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
image.compress(Bitmap.CompressFormat.PNG, 90, fos);
fos.close();
} catch (FileNotFoundException e) {
System.out.println("Error B");
} catch (IOException e) {
System.out.println("Error C");
}
}
return pictureFile;
}
private File getOutputMediaFile(String name){
File mediaStorageDir = new File(new Helper(this).getPathToAppFolder());
// Create the storage directory if it does not exist
if (! mediaStorageDir.exists()){
if (! mediaStorageDir.mkdirs()){
return null;
}
}
// Create a media file name#
File mediaFile;
if(!name.equals(getString(R.string.training))){
String timeStamp = new SimpleDateFormat("dd.MM.yyyy_HH:mm", Locale.getDefault()).format(new Date());
String mImageName= name + "_" + timeStamp + ".jpg";
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
}else{
String mImageName= name + ".jpg";
mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
}
return mediaFile;
}
您将需要申请 Marshmallow 风格的权限,请参阅此处了解更多信息:https://guides.codepath.com/android/Understanding-App-Permissions#permission-updates-in-marshmallow
在 运行 文件保存操作之前,您需要检查权限是否被接受,如果未被接受,您可以决定让您的应用出现 "graceful" 失败的原因。
对于 write/read phone 存储,您需要从 Marshmallow 手动请求用户许可。
查看此示例或使用此 example 手动请求权限。