Android Studio SD卡访问权限
1、在 AndroidManifext.xml 中添加如下代码
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
其分别表示 SD 卡的写,读和创建/删除文件权限
2、请求用户授予 SD 卡读写权限
@SuppressLint("NewApi")
private void requestReadExternalPermission() {
if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "READ permission IS NOT granted...");
requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 0);
} else {
Log.d(TAG, "READ permission is granted...");
}
}
@SuppressLint("NewApi")
private void requestWriteExternalPermission() {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
Log.d(TAG, "WRITE permission IS NOT granted...");
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
} else {
Log.d(TAG, "WRITE permission is granted...");
}
}
3、操作asserts下的文件(将asserts文件夹下 data 文件夹下的所有文件复制到SD卡中)
systemPath = Environment.getExternalStorageDirectory() + "/";
appFolderPath = systemPath + "AppClassificationAssets/";
// create assets folder if it doesn't exist
createAssetsFolder();
// copy all data files from assets to external storage
try {
String[] list = getAssets().list("data");
for (String file: list) {
copyToExternalStorage(file, "data");
}
} catch (IOException e) {
e.printStackTrace();
}
private void createAssetsFolder(){
// create app assets folder if not created
File folder = new File(appFolderPath);
if (!folder.exists()) {
Log.d(TAG,"AppClassificationAssets folder does not exist, creating one");
folder.mkdirs();
} else {
Log.w(TAG,"INFO: AppClassificationAssets folder already exists.");
}
}
private void copyToExternalStorage(String assetName, String assetsDirectory){
String from = assetName;
String to = appFolderPath+from;
// check if the file exists
File file = new File(to);
if(file.exists()){
Log.d(TAG, "copyToExternalStorage: file already exist, no need to copy: "+from);
} else {
// do copy
boolean copyResult = copyAsset(getAssets(), from, assetsDirectory, to);
Log.d(TAG, "copyToExternalStorage: isCopied -> "+copyResult);
}
}
private boolean copyAsset(AssetManager assetManager, String fromAssetPath, String assetsDirectory, String toPath) {
InputStream inputStream = null;
OutputStream outputStream = null;
try {
inputStream = assetManager.open(assetsDirectory+"/"+fromAssetPath);
new File(toPath).createNewFile();
outputStream = new FileOutputStream(toPath);
copyFile(inputStream, outputStream);
inputStream.close();
outputStream.flush();
outputStream.close();
return true;
} catch(Exception e) {
e.printStackTrace();
Log.e(TAG, "copyAsset: unable to copy file: "+fromAssetPath);
return false;
}
}
private void copyFile(InputStream inputStream, OutputStream outputStream) throws IOException {
byte[] buffer = new byte[1024];
int read;
while ((read = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, read);
}
}