Android 默认不允许存储到公共目录

在Android开发中,我们经常会涉及到文件的读写操作。默认情况下,Android系统不允许应用程序直接访问和操作外部存储的公共目录。这是为了保护用户的隐私和确保应用程序的安全性。本文将为大家介绍为什么Android默认不允许存储到公共目录,并提供相关的代码示例。

为什么不允许存储到公共目录?

Android系统将外部存储分为两个部分:内部存储和外部存储。内部存储是指应用程序专用的存储空间,而外部存储则是指SD卡或者其他可移动存储设备。为了保护用户的隐私和数据安全,Android系统限制了应用程序对外部存储的访问权限。

  1. 隐私保护:外部存储包含用户的私密数据,如照片、视频、音乐等。如果应用程序能够随意访问外部存储的公共目录,就有可能导致用户的隐私泄露。为了保护用户的隐私,Android系统限制了应用程序对外部存储的读写权限。

  2. 数据安全:外部存储是一个共享的存储空间,可能被其他应用程序或者用户通过USB连接到电脑上进行读写操作。如果应用程序能够直接访问外部存储的公共目录,就有可能被其他应用程序或者用户篡改或者删除数据。为了确保应用程序的数据安全,Android系统限制了应用程序对外部存储的读写权限。

如何访问外部存储的公共目录?

虽然Android默认不允许应用程序直接访问外部存储的公共目录,但是Android提供了一些API来间接地访问外部存储的公共目录。

  1. 使用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,用于访问外部存储的根目录。

  1. 使用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()方法用于打开系统的文件选择器