Android 默认不允许存储到公共目录
在Android开发中,我们经常会涉及到文件的读写操作。默认情况下,Android系统不允许应用程序直接访问和操作外部存储的公共目录。这是为了保护用户的隐私和确保应用程序的安全性。本文将为大家介绍为什么Android默认不允许存储到公共目录,并提供相关的代码示例。
为什么不允许存储到公共目录?
Android系统将外部存储分为两个部分:内部存储和外部存储。内部存储是指应用程序专用的存储空间,而外部存储则是指SD卡或者其他可移动存储设备。为了保护用户的隐私和数据安全,Android系统限制了应用程序对外部存储的访问权限。
-
隐私保护:外部存储包含用户的私密数据,如照片、视频、音乐等。如果应用程序能够随意访问外部存储的公共目录,就有可能导致用户的隐私泄露。为了保护用户的隐私,Android系统限制了应用程序对外部存储的读写权限。
-
数据安全:外部存储是一个共享的存储空间,可能被其他应用程序或者用户通过USB连接到电脑上进行读写操作。如果应用程序能够直接访问外部存储的公共目录,就有可能被其他应用程序或者用户篡改或者删除数据。为了确保应用程序的数据安全,Android系统限制了应用程序对外部存储的读写权限。
如何访问外部存储的公共目录?
虽然Android默认不允许应用程序直接访问外部存储的公共目录,但是Android提供了一些API来间接地访问外部存储的公共目录。
- 使用FileProvider:Android提供了FileProvider来访问外部存储的公共目录。通过在AndroidManifest.xml文件中定义一个FileProvider,并配置相应的
<paths>
标签,可以指定哪些目录可以被其他应用程序或者用户访问。示例代码如下:
<manifest xmlns:android="
package="com.example.myapplication">
<application
...>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.example.myapplication.fileprovider"
android:grantUriPermissions="true"
android:exported="false">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
...
</application>
</manifest>
在<meta-data>
标签中,通过android:resource
属性指定了一个XML文件@xml/file_paths
,用于配置可以被访问的目录。示例代码如下:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="
<external-path name="external_files" path="." />
</paths>
在以上的示例代码中,<external-path>
标签定义了一个外部目录external_files
,用于访问外部存储的根目录。
- 使用ACTION_OPEN_DOCUMENT:Android提供了ACTION_OPEN_DOCUMENT来访问外部存储的公共目录。通过调用
startActivityForResult(Intent, int)
方法,并使用ACTION_OPEN_DOCUMENT作为Intent的action,可以打开一个系统的文件选择器,让用户选择一个文件。示例代码如下:
private static final int REQUEST_CODE_OPEN_DOCUMENT = 1;
private void openDocument() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("*/*");
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_OPEN_DOCUMENT && resultCode == RESULT_OK) {
Uri uri = data.getData();
// 处理选择的文件
}
}
以上示例代码中,openDocument()
方法用于打开系统的文件选择器