AndroidManifest.xml
中声明权限,如`
,并在运行时动态请求该权限。然后通过相关API,如
Environment.getExternalStorageDirectory()`获取外部存储路径,再进行文件操作。
1、权限需求
Android 6.0(API 级别 23)及更高版本:需要动态请求权限,在安装应用时,系统不会授予应用访问外部存储的权限,而是在应用运行时,根据实际需要动态申请,如果应用需要读取外部存储中的文件,需要在代码中通过ContextCompat.checkSelfPermission()
方法检查是否已经获得READ_EXTERNAL_STORAGE
权限,如果没有获得,则使用ActivityCompat.requestPermissions()
方法向用户请求该权限。
Android 6.0以下版本:通常在AndroidManifest.xml
文件中声明权限即可,如<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
和<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
。
2、访问方式
使用内置存储API
获取外部存储的根目录:可以使用Environment.getExternalStorageDirectory()
方法获取外部存储的根目录,然后基于此目录进行文件的读写操作。
获取特定类型的公共目录:要获取图片存储的公共目录,可以使用Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
。
使用文档提供程序模式(适用于Android 10及更高版本):从Android 10开始,谷歌推荐使用文档提供程序模式来访问外部存储,应用可以通过Intent
启动文档选择器,让用户选择要操作的文件或文件夹,然后通过ContentResolver
来操作这些文件,这种方式不需要申请传统的存储权限,但需要处理一些额外的逻辑,如处理用户选择的文件Uri等。
3、示例代码
写入文件到外部存储
“`java
File file = new File(getExternalFilesDir(null), "example.txt");
try {
FileOutputStream fos = new FileOutputStream(file);
fos.write("Hello, world!".getBytes());
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
读取外部存储中的文件 ```java File file = new File(getExternalFilesDir(null), "example.txt"); try { FileInputStream fis = new FileInputStream(file); int size = fis.available(); byte[] buffer = new byte[size]; fis.read(buffer); String text = new String(buffer); fis.close(); System.out.println(text); } catch (IOException e) { e.printStackTrace(); }
4、相关问题与解答
问题1:为什么在Android 10及以上版本中,不建议使用传统的存储权限来访问外部存储?
解答:在Android 10及以上版本中,谷歌对外部存储的访问进行了更严格的限制,以保护用户的隐私和数据安全,传统的存储权限可能会导致应用过度获取用户的数据,而文档提供程序模式可以让用户更精细地控制应用对文件的访问,提高安全性。
问题2:如何在Android中判断外部存储是否可用?
解答:可以使用Environment.getExternalStorageState()
方法来判断外部存储的状态,如果返回Environment.MEDIA_MOUNTED
,则表示外部存储已挂载且可用;如果返回Environment.MEDIA_MOUNTED_READ_ONLY
,则表示外部存储已挂载但只读;如果返回其他值,则表示外部存储不可用。
Android访问外部存储设备涉及权限申请、多种访问方式及具体代码实现,同时需注意不同版本的权限变化和最佳实践,以确保应用能够安全、有效地访问外部存储。