flutter如何访问sd卡

在Flutter开发中,如何访问Android设备的SD卡文件?我尝试使用path_provider插件,但只能获取到应用内部存储目录。需要读取/写入SD卡上的文档、图片等文件,请问需要哪些权限配置?是否要使用Environment.getExternalStorageDirectory()这类原生方法?跨平台方案中如何处理iOS和Android的差异?

2 回复

Flutter中访问SD卡需使用path_provider插件获取外部存储路径,然后通过dart:io进行文件操作。注意Android需申请存储权限,iOS无SD卡概念。

更多关于flutter如何访问sd卡的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中访问 SD 卡(外部存储)需要使用 path_providerpermission_handler 插件来获取存储路径并请求权限。以下是具体步骤:

1. 添加依赖

pubspec.yaml 中添加:

dependencies:
  path_provider: ^2.1.1
  permission_handler: ^11.0.1

运行 flutter pub get 安装依赖。

2. 配置权限

Android

android/app/src/main/AndroidManifest.xml 中添加:

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

对于 Android 10+,可能需要添加:

<application android:requestLegacyExternalStorage="true" ...>

iOS

iOS 不支持直接访问 SD 卡,只能访问应用沙盒目录。若需访问相册等,需添加:

<key>NSPhotoLibraryUsageDescription</key>
<string>需要访问相册</string>

3. 请求权限并获取路径

import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';

class SDCardAccess extends StatefulWidget {
  @override
  _SDCardAccessState createState() => _SDCardAccessState();
}

class _SDCardAccessState extends State<SDCardAccess> {
  String? sdCardPath;

  Future<void> getSDCardPath() async {
    // 检查并请求存储权限
    var status = await Permission.storage.status;
    if (!status.isGranted) {
      status = await Permission.storage.request();
    }
    
    if (status.isGranted) {
      // 获取外部存储目录(通常是 SD 卡)
      final directory = await getExternalStorageDirectories();
      if (directory != null && directory.isNotEmpty) {
        setState(() {
          sdCardPath = directory.first.path; // 第一个路径通常是主外部存储
        });
      }
    } else {
      print("权限被拒绝");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            ElevatedButton(
              onPressed: getSDCardPath,
              child: Text("获取 SD 卡路径"),
            ),
            if (sdCardPath != null) Text("路径: $sdCardPath"),
          ],
        ),
      ),
    );
  }
}

注意事项:

  • Android 差异:不同设备的外部存储路径可能不同,getExternalStorageDirectories 返回多个路径,需根据需求选择。
  • iOS 限制:无法直接访问 SD 卡,只能使用应用沙盒或系统相册。
  • Android 11+:可能需要使用 MANAGE_EXTERNAL_STORAGE 权限,但需通过 Google Play 审核。

通过以上步骤,即可在 Flutter 中访问外部存储(SD 卡)。

回到顶部