Flutter存储路径获取插件flutter_storage_path的使用

Flutter存储路径获取插件flutter_storage_path的使用

StoragePath

flutter_storage_path 是一个Flutter插件,用于以JSON格式获取所有图片、音频、视频和文件的位置路径。它基于 StoragePath 实现。

注意

  • 该插件仅适用于Android平台。
  • 在iOS上将返回一个空数组 []

安装

在你的pubspec.yaml文件中添加依赖:

dependencies:
  flutter_storage_path: ^1.0.4

使用示例

获取图片路径

import 'package:flutter_storage_path/flutter_storage_path.dart';

try {
  String imagePath = await StoragePath.imagesPath; // 包含图片路径和文件夹名称的JSON格式
} on PlatformException {
  print('Failed to get path');
}

获取视频路径

try {
  String videoPath = await StoragePath.videoPath; // 返回视频路径
} on PlatformException {
  print('Failed to get path');
}

获取音频路径

try {
  String audioPath = await StoragePath.audioPath; // 返回音频路径
} on PlatformException {
  print('Failed to get path');
}

获取文件路径

try {
  String filePath = await StoragePath.filePath; // 返回文件路径
} on PlatformException {
  print('Failed to get path');
}

JSON格式示例

图片JSON示例

[
  {
    "files": [
      "path/screenshot/abc.png",
      "path/screenshot/pqr.png"
    ],
    "folderName": "screenshot"
  }
]

文件JSON示例

[
  {
    "files": [
      {
        "mimeType": "application/pdf",
        "size": "34113",
        "title": "C001-SP-2719^201902",
        "path": "/storage/emulated/0/Download/abc.pdf"
      }
    ],
    "folderName": "Download"
  }
]

音频JSON示例

[
  {
    "files": [
      {
        "album": "ABC",
        "artist": "PQR",
        "path": "/storage/emulated/0/Download/todo.mp3",
        "dateAdded": "1515060080",
        "displayName": "todo.mp3",
        "duration": "235986",
        "size": "9506989"
      }
    ],
    "folderName": "Download"
  }
]

视频JSON示例

[
  {
    "files": [
      {
        "path": "/storage/emulated/0/DCIM/Camera/VID_20190304_112455.mp4",
        "dateAdded": "1551678904",
        "displayName": "VID_20190304_112455.mp4",
        "duration": "7147",
        "size": "12787914"
      }
    ],
    "folderName": "Camera"
  }
]

完整示例代码

以下是一个完整的示例应用,展示了如何使用flutter_storage_path插件来获取图片路径并在GridView中显示这些图片。

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_storage_path/flutter_storage_path.dart';
import 'package:storage_path_example/file_model.dart';

void main() => runApp(MyApp());

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  List<FileModel> _files = [];
  FileModel? _selectedModel;

  @override
  void initState() {
    super.initState();
    getImagesPath();
  }

  Future<void> getImagesPath() async {
    try {
      String imagePath = await StoragePath.imagesPath;
      var images = jsonDecode(imagePath) as List;
      _files = images.map<FileModel>((e) => FileModel.fromJson(e)).toList();
      if (_files.isNotEmpty) {
        setState(() {
          _selectedModel = _files[0];
        });
      }
    } on PlatformException {
      print('Failed to get path');
    }
  }

  Future<void> getVideoPath() async {
    try {
      String videoPath = await StoragePath.videoPath;
      var response = jsonDecode(videoPath);
      print(response);
    } on PlatformException {
      print('Failed to get path');
    }
  }

  Future<void> getAudioPath() async {
    try {
      String audioPath = await StoragePath.audioPath;
      var response = jsonDecode(audioPath);
      print(response);
    } on PlatformException {
      print('Failed to get path');
    }
  }

  Future<void> getFilePath() async {
    try {
      String filePath = await StoragePath.filePath;
      var response = jsonDecode(filePath);
      print(response);
    } on PlatformException {
      print('Failed to get path');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: _selectedModel == null || (_selectedModel != null && _selectedModel.files.isEmpty)
            ? Center(child: Text('No files found'))
            : GridView.builder(
                itemCount: _selectedModel!.files.length,
                gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
                  crossAxisCount: 4,
                  crossAxisSpacing: 4,
                  mainAxisSpacing: 4,
                ),
                itemBuilder: (_, i) {
                  var file = _selectedModel!.files[i];
                  return Container(
                    child: Image.file(
                      File(file),
                      fit: BoxFit.cover,
                    ),
                  );
                },
              ),
      ),
    );
  }
}

FileModel类

为了更好地处理JSON数据,你可以定义一个FileModel类:

class FileModel {
  final String folderName;
  final List<String> files;

  FileModel({required this.folderName, required this.files});

  factory FileModel.fromJson(Map<String, dynamic> json) {
    return FileModel(
      folderName: json['folderName'] as String,
      files: (json['files'] as List).map((file) => file.toString()).toList(),
    );
  }
}

通过以上步骤,你可以轻松地在Flutter应用中使用flutter_storage_path插件来获取和显示存储路径中的媒体文件。希望这个示例对你有所帮助!


更多关于Flutter存储路径获取插件flutter_storage_path的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter存储路径获取插件flutter_storage_path的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用flutter_storage_path插件来获取存储路径的示例代码。

步骤1:添加依赖

首先,你需要在pubspec.yaml文件中添加flutter_storage_path的依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_storage_path: ^x.y.z  # 请使用最新版本号

替换x.y.z为当前最新版本号,可以通过运行flutter pub outdated来查看可用的版本。

步骤2:导入插件

在你的Dart文件中(通常是main.dart或其他你需要使用存储路径的文件),导入插件:

import 'package:flutter_storage_path/flutter_storage_path.dart';

步骤3:获取存储路径

你可以使用FlutterStoragePath类的方法来获取不同的存储路径。以下是一个完整的示例,展示如何获取外部存储路径和应用的缓存目录:

import 'package:flutter/material.dart';
import 'package:flutter_storage_path/flutter_storage_path.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: StoragePathScreen(),
    );
  }
}

class StoragePathScreen extends StatefulWidget {
  @override
  _StoragePathScreenState createState() => _StoragePathScreenState();
}

class _StoragePathScreenState extends State<StoragePathScreen> {
  String? externalStoragePath;
  String? cacheDirectoryPath;

  @override
  void initState() {
    super.initState();
    _getExternalStoragePath();
    _getCacheDirectoryPath();
  }

  Future<void> _getExternalStoragePath() async {
    String? path = await FlutterStoragePath.getExternalStoragePath();
    setState(() {
      externalStoragePath = path;
    });
  }

  Future<void> _getCacheDirectoryPath() async {
    String? path = await FlutterStoragePath.getCacheDirectoryPath();
    setState(() {
      cacheDirectoryPath = path;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Storage Path Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('External Storage Path:', style: TextStyle(fontSize: 18)),
            externalStoragePath != null
                ? Text(externalStoragePath!, style: TextStyle(fontSize: 16))
                : Text('Loading...', style: TextStyle(fontSize: 16)),
            SizedBox(height: 16),
            Text('Cache Directory Path:', style: TextStyle(fontSize: 18)),
            cacheDirectoryPath != null
                ? Text(cacheDirectoryPath!, style: TextStyle(fontSize: 16))
                : Text('Loading...', style: TextStyle(fontSize: 16)),
          ],
        ),
      ),
    );
  }
}

说明

  1. 依赖添加:在pubspec.yaml文件中添加flutter_storage_path依赖。
  2. 导入插件:在需要使用存储路径的Dart文件中导入flutter_storage_path
  3. 获取路径:通过FlutterStoragePath.getExternalStoragePath()FlutterStoragePath.getCacheDirectoryPath()方法分别获取外部存储路径和应用的缓存目录路径。
  4. UI展示:使用Flutter的UI组件(如TextColumn)在屏幕上显示获取到的路径。

确保你在运行示例代码之前已经正确安装了所有依赖,并且你的设备或模拟器具有相应的存储权限。

回到顶部