environment.isexternalstoragemanager()
时间: 2023-08-10 08:01:24 浏览: 170
environment.isExternalStorageManager()是一个Android系统的方法,用于检测当前应用程序是否拥有管理外部存储器的权限。
在Android 11及以上的版本中,应用需要申请MANAGE_EXTERNAL_STORAGE权限才能对外部存储器进行读写操作。而isExternalStorageManager()方法用于检查当前应用是否具有这个权限。
如果应用程序拥有MANAGE_EXTERNAL_STORAGE权限,则调用isExternalStorageManager()方法会返回true,表示应用程序可以对外部存储器进行读写操作。
如果应用程序没有MANAGE_EXTERNAL_STORAGE权限,则调用isExternalStorageManager()方法会返回false,表示应用程序无法对外部存储器进行读写操作。
需要注意的是,即使应用程序没有MANAGE_EXTERNAL_STORAGE权限,仍然可以使用其他合适的权限进行文件读写操作,例如READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限等。
总之,environment.isExternalStorageManager()方法可以帮助应用程序检查自身是否具有管理外部存储器权限,从而决定是否可以对外部存储器进行读写操作。
相关问题
public static boolean saveFile(Context context, String fileName, String data, boolean append){ String path = Environment.getExternalStorageDirectory()+"/osnavData/"; String filePath = path+fileName; File folder = new File(path); File file = new File(filePath); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M){ // 版本<23 threadToast(context, "版本号:"+Build.VERSION.SDK_INT); return false; } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 版本>=30 if(!Environment.isExternalStorageManager()){ Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION); context.startActivity(intent); return false; } }else{ // 23~29 if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_WRITEFILE); return false; } }
这段代码是一个静态方法,用于保存数据到文件中。下面对每一行代码进行解释:
1. `public static boolean saveFile(Context context, String fileName, String data, boolean append){}`
这是方法的声明,指定方法名称为saveFile,参数类型为Context、String、String、boolean,返回类型为boolean。
2. `String path = Environment.getExternalStorageDirectory()+"/osnavData/";`
获取外部存储目录的路径,并在路径后面添加一个名为osnavData的文件夹名,用于存储文件。
3. `String filePath = path+fileName;`
将文件名添加到路径后面,生成完整的文件路径。
4. `File folder = new File(path);`
创建一个名为folder的File对象,代表存储文件的目录。
5. `File file = new File(filePath);`
创建一个名为file的File对象,代表要保存数据的文件。
6. `if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M){}`
判断当前设备的Android版本是否小于23(Build.VERSION_CODES.M)。
7. `threadToast(context, "版本号:"+Build.VERSION.SDK_INT);`
如果版本小于23,则调用threadToast方法,弹出一个Toast提示当前的Android版本号。
8. `return false;`
并返回false,表示保存文件失败。
9. `} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {`
如果版本号大于或等于30(Build.VERSION_CODES.R)。
10. `if(!Environment.isExternalStorageManager()){`
判断当前应用是否被授予管理所有文件的权限。
11. `Intent intent = new Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION);`
如果没有被授予权限,则创建一个Intent对象,跳转到系统设置界面,让用户手动授权。
12. `context.startActivity(intent);`
启动Intent对象,跳转到系统设置界面。
13. `return false;`
并返回false,表示保存文件失败。
14. `} else{`
如果版本号在23到29之间。
15. `if (ActivityCompat.checkSelfPermission(context, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {`
检查当前应用是否被授予写外部存储的权限。
16. `ActivityCompat.requestPermissions((Activity) context, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, CODE_WRITEFILE);`
如果没有被授予权限,则请求授权,弹出授权对话框,并等待用户授权。
17. `return false;`
并返回false,表示保存文件失败。
18. `}`
如果已经被授予权限,则继续执行下面的代码。
在这段代码中,没有对权限请求的结果进行处理,需要在onRequestPermissionsResult方法中处理授权结果。
该方法的主要作用是判断当前设备的Android版本和应用是否被授予权限,如果没有被授予权限,则请求授权,并在授权完成后保存数据到文件中。
已经获取了 MANAGE_EXTERNAL_STORAGE 权限
如果你已经获取了 MANAGE_EXTERNAL_STORAGE 权限,那么你就可以遍历整个外部存储空间,包括其他应用程序的私有目录。下面是一个可以遍历整个外部存储空间的方法:
```
public void traverseFiles(Context context) {
if (Environment.isExternalStorageManager()) {
ContentResolver resolver = context.getContentResolver();
Uri uri = MediaStore.Files.getContentUri(MediaStore.VOLUME_EXTERNAL);
String[] projection = {MediaStore.Files.FileColumns.DATA};
String selection = MediaStore.Files.FileColumns.MEDIA_TYPE + "="
+ MediaStore.Files.FileColumns.MEDIA_TYPE_NONE;
Cursor cursor = resolver.query(uri, projection, selection, null, null);
if (cursor != null) {
while (cursor.moveToNext()) {
String path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Files.FileColumns.DATA));
// 处理文件
}
cursor.close();
}
} else {
// 请求 MANAGE_EXTERNAL_STORAGE 权限
Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", context.getPackageName(), null);
intent.setData(uri);
context.startActivity(intent);
}
}
```
这个方法与之前的方法基本相同,只是在判断是否获取了 MANAGE_EXTERNAL_STORAGE 权限时,使用了 Environment.isExternalStorageManager() 方法。如果已经获取了该权限,则可以直接遍历整个外部存储空间,包括其他应用程序的私有目录。