Flutter安全打开文件插件open_file_safe_plus的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter安全打开文件插件 open_file_safe_plus 的使用

open_file_safe_plus 是一个可以在Flutter中调用原生应用打开文件的插件,支持iOS(DocumentInteraction)、Android(intent)、PC(ffi)和Web(dart:html)。它是 open_file 插件的继承者。

使用方法

要在项目中使用此插件,请在 pubspec.yaml 文件中添加 open_file_safe_plus 作为依赖项:

dependencies:
  open_file_safe_plus: ^lastVersion

请确保将 ^lastVersion 替换为最新版本号。

示例代码

以下是一个简单的示例,展示如何使用 open_file_safe_plus 打开文件:

import 'package:open_file_safe_plus/open_file_safe_plus.dart';

void openFile() {
  OpenFileSafePlus.open("/sdcard/example.txt");
}

支持

Android

对于Android平台,该插件支持多种文件类型。以下是部分文件类型的MIME类型映射表:

{
    ".3gp": "video/3gpp",
    ".torrent": "application/x-bittorrent",
    ".kml": "application/vnd.google-earth.kml+xml",
    // 更多文件类型...
    ".zip": "application/x-zip-compressed",
    "": "*/*"
}

如果与其他插件发生 FileProvider 冲突,请在 /android/app/src/main/AndroidManifest.xml 中添加以下代码:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="xxx.xxx.xxxxx">
    <application>
        ...
        <provider
                android:name="androidx.core.content.FileProvider"
                android:authorities="${applicationId}.fileProvider"
                android:exported="false"
                android:grantUriPermissions="true"
                tools:replace="android:authorities">
            <meta-data
                    android:name="android.support.FILE_PROVIDER_PATHS"
                    android:resource="@xml/filepaths"
                    tools:replace="android:resource" />
        </provider>
    </application>
</manifest>

此外,在 /android/app/src/main/res/xml/filepaths.xml 中添加以下内容:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <external-path name="external_storage_directory" path="." />
</resources>

当遇到编译错误 'com.android.support:appcompat-v7' 版本冲突时,请在 /android/build.gradle 中添加以下代码:

subprojects {
    project.configurations.all {
        resolutionStrategy.eachDependency { details ->
            if (details.requested.group == 'com.android.support'
                    && !details.requested.name.contains('multidex') ) {
                details.useVersion "27.1.1"
            }
        }
    }
}

iOS with UTI (DocumentInteraction Auto)

对于iOS平台,以下是部分文件类型的UTI映射表:

{
    ".rtf": "public.rtf",
    ".txt": "public.plain-text",
    ".html": "public.html",
    // 更多文件类型...
    ".wmv": "com.microsoft.windows-media-wmv",
    ".pdf": "com.adobe.pdf"
}

更多关于Flutter安全打开文件插件open_file_safe_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter安全打开文件插件open_file_safe_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用open_file_safe_plus插件来安全地打开文件的示例代码。这个插件提供了一个更安全的方式来打开文件,通过验证文件URI和类型来防止潜在的安全风险。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  open_file_safe_plus: ^x.y.z  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

2. 配置Android权限

由于打开文件可能需要访问存储权限,你需要在android/app/src/main/AndroidManifest.xml中添加必要的权限:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourapp">

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

    <!-- 其他配置 -->

</manifest>

3. 请求权限(如果需要)

在Android上,你可能需要在运行时请求这些权限。你可以在MainActivity.ktMainActivity.java中处理权限请求,或者使用Flutter的permission_handler插件来简化这个过程。

4. 使用open_file_safe_plus插件

下面是一个简单的Flutter代码示例,演示如何使用open_file_safe_plus插件来打开一个文件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Open File Safe Plus Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _openFile,
            child: Text('Open File'),
          ),
        ),
      ),
    );
  }

  Future<void> _openFile() async {
    try {
      // 获取应用文档目录路径
      final directory = await getApplicationDocumentsDirectory();
      final filePath = '${directory.path}/example.txt';

      // 写入示例文件(仅用于演示,实际应用中文件可能来自其他源)
      await File(filePath).writeAsString('Hello, this is a test file!');

      // 使用openFileSafePlus打开文件
      await OpenFileSafePlus.openFile(filePath);
    } catch (e) {
      // 处理错误
      print('Error opening file: $e');
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Failed to open file: $e')),
      );
    }
  }
}

注意事项

  1. 文件类型:确保你尝试打开的文件类型是被设备支持的。
  2. 文件路径:确保文件路径是正确的,并且文件是存在的。
  3. 权限处理:在Android上,确保你已经请求并获得了必要的存储权限。

这个示例展示了如何使用open_file_safe_plus插件来打开一个存储在应用文档目录中的文本文件。你可以根据需要修改文件路径和文件类型。

回到顶部