我有一个类,它存储应用程序第一次启动时从Facebook下载的图像。我所做的是,我会使用一个类来创建一个文件夹(如果它以前不存在的话),并将所有图像存储在那里。
重要我在不同API的多台设备上取得了成功(均低于23台)。文件写入和检索成功。最近,我有一部新手机,它使用6.0(API 23),但不知怎么的,将文件写入存储系统的代码不再有效。我无法再在SD卡中创建文件夹,这导致了错误。
作为补充信息,该手机是一个根nexus 5X,而不是一个外部SD卡。该应用程序在API 23上运行,在使用该应用程序之前,包括存储在内的危险权限都得到了正确授权。
使用getExternalStorageDirectory的久经考验的方法,该方法返回模拟的/0/。Environment.MEDIA_INSTALLED表示已授予对存储的访问权限问题是当我试图创建一个文件夹时,它告诉我不能这样做。
.canwrite表示我试图创建的mkdirs目录不可访问
供您参考,我的清单:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
我的写入外部存储的方法:
public static String storeImage(Bitmap bitmap, String filename) {
String stored = null;
String folder_main = "Samepage";
String root = Environment.getExternalStorageDirectory().toString();
String state = Environment.getExternalStorageState();
Log.i(TAG,"Storage state is " + state);
File folder = new File(root + "/Samepage");
Log.i(TAG, folder.toString());
if (!Environment.MEDIA_MOUNTED.equals(state)) {
Log.e(TAG,"Storage is not mounted!");
}
if (folder.canWrite()) {
Log.i(TAG, "External storage is accessible");
if (!folder.exists()) {
folder.mkdirs();
}
} else
Log.e(TAG, "Default storage is not accessible");
File sdcard = Environment.getExternalStorageDirectory();
if (folder.exists()) {
File file = new File(root, filename + ".png");
if (file.exists())
file.delete();
try {
FileOutputStream out = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.PNG, 90, out);
out.flush();
out.close();
stored = "success";
Log.i(TAG, "User image created successfully");
} catch (Exception e) {
e.printStackTrace();
}
}
return stored;
}
在API 23+上,我建议在任何外部存储操作之前运行此函数:
private static final int REQUESTCODE_STORAGE_PERMISSION = 999999999;
private static boolean storagePermitted(Activity activity) {
Boolean readPermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
Boolean writePermission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED;
if (readPermission && writePermission) {
return true;
}
ActivityCompat.requestPermissions(activity, new String[]{ Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUESTCODE_STORAGE_PERMISSION);
return false;
}
此方法请求对外部存储的读写权限,如果应该执行该操作,则返回true。截至API,默认情况下已禁用23个外部存储权限。
进一步阅读:developer.android.com/training/permissions/requesting.html