flutter Android端权限

07-16 1228阅读

flutter 中权限请求path_provider

      • Android 6.0 - 10.0 (API level 23 - 29)
      • Android 11+ (API level 30+)
      • 具体实现示例
      • 注意事项

        在 Flutter 中使用 path_provider 插件获取除本应用外所有的 PDF 文件,对于不同的 Android 版本(从 Android 6.0 到 Android 14.0),需要提供以下权限:

        flutter Android端权限
        (图片来源网络,侵删)

        Android 6.0 - 10.0 (API level 23 - 29)

        1. 读取外部存储权限 (READ_EXTERNAL_STORAGE):

          • 用途:允许应用程序访问设备外部存储器中的文件,包括 PDF 文件。
          • 权限声明:
             
          • 写入外部存储权限 (WRITE_EXTERNAL_STORAGE)(如果需要写入文件):

            • 用途:允许应用程序在设备外部存储器中创建、修改或删除文件。
            • 权限声明:
               
            • 请求运行时权限:

              • 使用 permission_handler 插件在应用程序运行时请求权限。示例代码见上一个回答中的 checkPermissionAndFetchPDFs 方法。

        Android 11+ (API level 30+)

        从 Android 11 开始,Google 引入了更严格的存储访问权限政策,因此需要特别处理:

        1. Scoped Storage 访问:

          • 应用程序默认只能访问其自己的应用目录 (Android/data/) 和共享媒体存储(例如相册)。为了访问其他应用程序的文件(如 PDF 文件),需要特殊处理。
          • MANAGE_EXTERNAL_STORAGE 权限(可能需要):

            • 如果你的应用需要直接访问和管理设备上的任何文件,包括非应用特有目录(如下载目录),则需要 MANAGE_EXTERNAL_STORAGE 权限。
            • 权限声明:
               
            • 注意:此权限需要在 AndroidManifest.xml 中声明,并且可能需要通过 Google Play 的审核才能获得。
            • 使用 MediaStore API 访问文件:

              • 对于 Android 11+,推荐使用 MediaStore API 来访问共享的媒体文件,包括 PDF 文件。例如,使用 query 方法来获取设备上的 PDF 文件列表。
              • 请求运行时权限:

                • 使用 permission_handler 插件在应用程序运行时请求权限。请注意,从 Android 11 开始,即使在 AndroidManifest.xml 中声明了权限,也需要在运行时请求。

        具体实现示例

        以下是一个简单的示例,演示如何在 Flutter 中使用 path_provider 和 permission_handler 插件来获取设备上的 PDF 文件列表:

        import 'dart:io';
        import 'package:flutter/material.dart';
        import 'package:path_provider/path_provider.dart';
        import 'package:permission_handler/permission_handler.dart';
        void main() {
          runApp(MyApp());
        }
        class MyApp extends StatelessWidget {
          @override
          Widget build(BuildContext context) {
            return MaterialApp(
              home: Scaffold(
                appBar: AppBar(title: Text('PDF Files Example')),
                body: Center(
                  child: ElevatedButton(
                    onPressed: () {
                      checkPermissionAndFetchPDFs();
                    },
                    child: Text('Fetch PDF Files'),
                  ),
                ),
              ),
            );
          }
          Future checkPermissionAndFetchPDFs() async {
            if (await Permission.storage.request().isGranted) {
              // Permission is granted, fetch PDF files
              fetchPDFFiles();
            } else {
              // Permission denied
              print('Permission denied');
            }
          }
          Future fetchPDFFiles() async {
            // Get external storage directory
            final directory = await getExternalStorageDirectory();
            // Assuming PDF files are in the 'Download' directory
            final path = directory.path + '/Download';
            // Now you can access PDF files in the 'path' directory
            print('PDF files path: $path');
            final dir = Directory(path);
            List files = dir.listSync(recursive: false, followLinks: false);
            files.forEach((file) {
              if (file is File && file.path.endsWith('.pdf')) {
                // Process the PDF file
                print('Found PDF file: ${file.path}');
              }
            });
          }
        }
        

        注意事项

        • 权限处理:在开发时务必测试不同版本的 Android 设备和不同的存储情况,以确保权限请求和文件访问功能的正确性和兼容性。

        • Scoped Storage:对于 Android 11+,建议遵循 Scoped Storage 的最佳实践,尽量使用 MediaStore API 来访问共享的媒体文件。

          通过上述方法,你可以在 Flutter 应用程序中成功获取并处理设备上的 PDF 文件,确保在各个 Android 版本上的兼容性和功能性。

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]