分区存储将存储空间分为两部分:
● 公共目录:Downloads、Documents、Pictures 、DCIM、Movies、Music、Ringtones等
■ 公共目录的文件在App卸载后,不会删除
■ 可以通过SAF、MediaStore接口访问
■ 拥有权限,也能通过路径直接访问
● 应用专属目录
■ 应用专属目录只能自己直接访问
■ App卸载,数据会清除。
当您将应用更新为以 Android 11 为目标平台后,您将无法使用requestLegacyExternalStorage,而且也没有其他标记可以提供停用分区存储。
对于/storage/emulated/0没没有权限访问的问题进行如下解决:
1、加入文件读写、和存储管理权限 READ_EXTERNAL_STORAGE(仅照片和视频权限) MANAGE_EXTERNAL_STORAGE(所有文件权限) 这两个都要有,没有READ_EXTERNAL_STORAGE就没有文件存储管理界面、没有MANAGE_EXTERNAL_STORAGE就没有所有文件选项,也就无法访问普通文件
requestLegacyExternalStorage好像可有可无
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.helloworld">
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:requestLegacyExternalStorage="true"
android:theme="@style/Theme.HelloWorld">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/Theme.HelloWorld.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
2、代码中动态获取
private static final int REQUEST_PERMISSION_CODE = 1;
public void requestPermission() {
int permission_read = ContextCompat.checkSelfPermission(MainActivity.this,
Manifest.permission.READ_EXTERNAL_STORAGE);
if (permission_read != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSION_CODE);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSION_CODE) {
Log.i(TAG, "request permission success");
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
网上还有一种方法启动activity,这种获取了设置---隐私---权限管理----右上角特殊访问权限---所有文件访问权限
public void requestPermission() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
if (Environment.isExternalStorageManager()) {
Log.i(TAG, "isExternalStorageManager");
} else {
Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);
startActivityForResult(intent, REQUEST_PERMISSION_CODE);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_PERMISSION_CODE) {
Log.i(TAG, "request permission success");
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
3、读取相关文件
try {
InputStream is = new FileInputStream(new File("/storage/emulated/0/Pictures/hello.txt"));
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(is));
String buffer;
while ((buffer = bufferedReader.readLine()) != null) {
Log.i(TAG, "read line:" + buffer);
}
} catch (Exception e) {
Log.i(TAG, "error msg:" + e.getMessage());
}