如何在 Android 13 中创建外部存储目录

在 Android 13 中,处理外部存储的方式稍有变化,尤其是在权限方面。本文将指导你如何实现创建外部存储目录的功能。我们将通过流程图和代码示例,并详细说明每个步骤。

流程概述

我们将分成以下几个步骤来完成任务:

步骤 描述
1 创建新 Android 项目
2 在清单文件中添加权限
3 请求权限
4 创建外部存储目录
5 处理错误

序列图

以下是完成此任务的序列图:

sequenceDiagram
    participant User
    participant App
    participant Device
    User->>App: 打开应用
    App->>Device: 请求权限使用外部存储
    Device-->>App: 权限被授予
    App->>App: 创建外部存储目录
    App-->>User: 显示创建结果

第一步:创建新 Android 项目

首先,使用 Android Studio 创建一个新的项目。选择 Empty Activity 模板,并命名你的项目。

// MainActivity.java
package com.example.mydirectoryapp;

import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import java.io.File;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 第三步:请求运行时权限
        requestPermissions();
    }

    // 第四步:请求运行时权限的方法
    private void requestPermissions() {
        // 检查是否有权限
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE);
        } else {
            // 权限已被授予
            createDirectory();
        }
    }

    // 第五步:处理权限请求结果
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == REQUEST_CODE) {
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                createDirectory();
            } else {
                Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();
            }
        }
    }
}

第二步:在清单文件中添加权限

打开 AndroidManifest.xml 文件,添加对外部存储的访问权限:

<manifest xmlns:android="
    package="com.example.mydirectoryapp">

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application
        ...>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

解析:

  • WRITE_EXTERNAL_STORAGE 权限允许应用程序写入外部存储。

第三步:请求权限

MainActivity.javaonCreate 方法中,我们检查并请求权限。如果权限已被授予,则直接调用 createDirectory 方法。

第四步:创建外部存储目录

我们将在 MainActivity 中添加一个新函数用于创建外部存储目录。

private void createDirectory() {
    // 外部存储路径
    File externalStorage = Environment.getExternalStorageDirectory();
    File newDir = new File(externalStorage, "MyNewDirectory");

    // 创建目录
    if (!newDir.exists()) {
        boolean success = newDir.mkdirs();
        if (success) {
            Toast.makeText(this, "目录创建成功", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "目录创建失败", Toast.LENGTH_SHORT).show();
        }
    } else {
        Toast.makeText(this, "目录已存在", Toast.LENGTH_SHORT).show();
    }
}

解析:

  • Environment.getExternalStorageDirectory():获取外部存储的根目录。
  • new File(...):构造新的目录路径。
  • newDir.mkdirs():创建目录,如果路径中不存在的目录则会同时创建。

第五步:处理错误

在用户拒绝权限时,我们使用 Toast 向用户显示提示。我们也处理目录创建失败的情况。

甘特图

下面是一个甘特图,用于表示任务的时间安排:

gantt
    title Android 13 外部存储器创建目录流程
    dateFormat  YYYY-MM-DD
    section 流程
    创建新项目          :a1, 2023-10-01, 1d
    添加权限到清单       :a2, 2023-10-02, 1d
    请求权限              :a3, 2023-10-03, 1d
    创建目录             :a4, 2023-10-04, 1d
    处理错误            :a5, 2023-10-05, 1d

结论

本文介绍了如何在 Android 13 中创建外部存储目录,包括权限处理和目录创建的具体代码。通过以上步骤,你应该能够独立实现此功能。后续如果需要执行对创建目录内文件的读写操作,也可以参考本文的权限处理机制。希望这篇文章对你有所帮助,祝你在 Android 开发的旅程中顺利前行!