Flutter文件打开插件open_filez的使用

Flutter文件打开插件open_filez的使用

pub package

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

使用方法

要使用此插件,在pubspec.yaml文件中添加以下依赖:

dependencies:
  open_filez: ^lastVersion

示例代码

import 'dart:async';

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

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  MyAppState createState() => MyAppState();
}

class MyAppState extends State<MyApp> {
  var _openResult = 'Unknown';

  Future<void> openFile() async {
    // 文件路径
    const filePath = '/storage/emulated/0/Download/dummy.pdf';
    // 打开文件并获取结果
    final result = await OpenFilez.open(filePath);

    // 更新UI显示结果
    setState(() {
      _openResult = "type=${result.type}  message=${result.message}";
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text('open result: $_openResult\n'),
              TextButton(
                onPressed: openFile,
                child: const Text('Tap to open file'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

支持的文件类型

Android

{
  ".3gp": "video/3gpp",
  ".torrent": "application/x-bittorrent",
  ".kml": "application/vnd.google-earth.kml+xml",
  ".gpx": "application/gpx+xml",
  ".csv": "application/vnd.ms-excel",
  ".asf": "video/x-ms-asf",
  ".avi": "video/x-msvideo",
  ".bin": "application/octet-stream",
  ".bmp": "image/bmp",
  ".c": "text/plain",
  ".class": "application/octet-stream",
  ".conf": "text/plain",
  ".cpp": "text/plain",
  ".doc": "application/msword",
  ".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  ".xls": "application/vnd.ms-excel",
  ".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
  ".exe": "application/octet-stream",
  ".gif": "image/gif",
  ".gtar": "application/x-gtar",
  ".gz": "application/x-gzip",
  ".h": "text/plain",
  ".htm": "text/html",
  ".html": "text/html",
  ".jar": "application/java-archive",
  ".java": "text/plain",
  ".jpeg": "image/jpeg",
  ".jpg": "image/jpeg",
  ".js": "application/x-javascript",
  ".log": "text/plain",
  ".m3u": "audio/x-mpegurl",
  ".m4a": "audio/mp4a-latm",
  ".m4b": "audio/mp4a-latm",
  ".m4p": "audio/mp4a-latm",
  ".m4u": "video/vnd.mpegurl",
  ".m4v": "video/x-m4v",
  ".mov": "video/quicktime",
  ".mp2": "audio/x-mpeg",
  ".mp3": "audio/x-mpeg",
  ".mp4": "video/mp4",
  ".mpc": "application/vnd.mpohun.certificate",
  ".mpe": "video/mpeg",
  ".mpeg": "video/mpeg",
  ".mpg": "video/mpeg",
  ".mpg4": "video/mp4",
  ".mpga": "audio/mpeg",
  ".msg": "application/vnd.ms-outlook",
  ".ogg": "audio/ogg",
  ".pdf": "application/pdf",
  ".png": "image/png",
  ".pps": "application/vnd.ms-powerpoint",
  ".ppt": "application/vnd.ms-powerpoint",
  ".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
  ".prop": "text/plain",
  ".rc": "text/plain",
  ".rmvb": "audio/x-pn-realaudio",
  ".rtf": "application/rtf",
  ".sh": "text/plain",
  ".tar": "application/x-tar",
  ".tgz": "application/x-compressed",
  ".txt": "text/plain",
  ".wav": "audio/x-wav",
  ".wma": "audio/x-ms-wma",
  ".wmv": "audio/x-ms-wmv",
  ".wps": "application/vnd.ms-works",
  ".xml": "text/plain",
  ".z": "application/x-compress",
  ".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>

如果遇到Android依赖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

对于iOS,可以使用UTI(Uniform Type Identifier)来识别文件类型。以下是一些常见的文件类型映射:

{
  ".rtf": "public.rtf",
  ".txt": "public.plain-text",
  ".html": "public.html",
  ".htm": "public.html",
  ".xml": "public.xml",
  ".tar": "public.tar-archive",
  ".gz": "org.gnu.gnu-zip-archive",
  ".gzip": "org.gnu.gnu-zip-archive",
  ".tgz": "org.gnu.gnu-zip-tar-archive",
  ".jpg": "public.jpeg",
  ".jpeg": "public.jpeg",
  ".png": "public.png",
  ".avi": "public.avi",
  ".mpg": "public.mpeg",
  ".mpeg": "public.mpeg",
  ".mp4": "public.mpeg-4",
  ".3gpp": "public.3gpp",
  ".3gp": "public.3gpp",
  ".mp3": "public.mp3",
  ".zip": "com.pkware.zip-archive",
  ".gif": "com.compuserve.gif",
  ".bmp": "com.microsoft.bmp",
  ".ico": "com.microsoft.ico",
  ".doc": "com.microsoft.word.doc",
  ".xls": "com.microsoft.excel.xls",
  ".ppt": "com.microsoft.powerpoint.ppt",
  ".wav": "com.microsoft.waveform-audio",
  ".wm": "com.microsoft.windows-media-wm",
  ".wmv": "com.microsoft.windows-media-wmv",
  ".pdf": "com.adobe.pdf"
}

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

1 回复

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


open_filez 是一个 Flutter 插件,用于在移动设备上打开文件。它支持多种文件类型,包括 PDF、图像、音频、视频、文档等。该插件是根据 Flutteropen_file 插件优化的版本。

以下是 open_filez 的基本使用方法:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  open_filez: ^3.0.0  # 请根据最新版本进行更新

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

2. 导入插件

在你的 Dart 文件中导入 open_filez 插件:

import 'package:open_filez/open_filez.dart';

3. 打开文件

使用 OpenFilez.open 方法来打开文件。你需要传入文件的路径:

void openFile(String filePath) async {
  try {
    await OpenFilez.open(filePath);
  } catch (e) {
    print("Error opening file: $e");
  }
}

4. 示例代码

以下是一个完整的示例,展示如何在 Flutter 应用中使用 open_filez 插件打开文件:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Open Filez Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              openFile('/storage/emulated/0/Download/example.pdf'); // 替换为你的文件路径
            },
            child: Text('Open File'),
          ),
        ),
      ),
    );
  }

  void openFile(String filePath) async {
    try {
      await OpenFilez.open(filePath);
    } catch (e) {
      print("Error opening file: $e");
    }
  }
}

5. 权限处理

在 Android 上,你可能需要请求存储权限才能访问文件。可以使用 permission_handler 插件来请求权限:

dependencies:
  permission_handler: ^10.0.0  # 请根据最新版本进行更新

然后,在打开文件之前请求权限:

import 'package:permission_handler/permission_handler.dart';

void requestStoragePermission() async {
  if (await Permission.storage.request().isGranted) {
    openFile('/storage/emulated/0/Download/example.pdf');
  } else {
    print("Permission denied");
  }
}
回到顶部