使用share_extend 2.0.0与Permission_handler 11.0.0时Android分享异常
1. 适配Android 13+的存储权限
Permission_handler 11.0.0在Android 13及以上版本中,Permission.storage不再对应传统的读写外部存储权限,需根据分享文件类型请求对应权限:
- 分享图片/截图时,请求
Permission.photos(对应READ_MEDIA_IMAGES权限) - Android 12及以下版本,仍使用
Permission.storage
修改权限检查逻辑,分版本处理:
import 'package:permission_handler/permission_handler.dart'; void checkPermission({GlobalKey? repaintKey, String? reference, BuildContext? context}) async { Permission permission; // 判断当前系统是否支持photos权限(Android 13+) if (await Permission.photos.isSupported) { permission = Permission.photos; } else { permission = Permission.storage; } final status = await permission.status; bool isGranted = status.isGranted; if (!isGranted) { final result = await permission.request(); isGranted = result.isGranted; } if (isGranted) { print('权限已授予: ${status}'); takescrshot(repaintKey: repaintKey!, reference: reference, context: context); } else { print('权限被拒绝: ${status}'); if (await permission.isPermanentlyDenied) { openAppSettings(); } } }
2. 检查share_extend的文件路径处理
Android 10及以上版本对文件访问权限限制更严格,需确保截图路径符合规则:
- 若使用应用私有目录存储截图,分享时需通过
FileProvider生成Uri:- 在
AndroidManifest.xml中添加FileProvider配置:<application> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> </application> - 在
res/xml目录下创建file_paths.xml:<?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="transaction_screenshots" path="Pictures/" /> </paths> - 分享时使用FileProvider获取Uri:
import 'package:share_extend/share_extend.dart'; import 'package:path_provider/path_provider.dart'; import 'dart:io'; import 'package:flutter/services.dart'; void takescrshot({required GlobalKey repaintKey, String? reference, BuildContext? context}) async { // 保存截图到应用私有Pictures目录 final directory = await getExternalFilesDir(Directory.systemPictures); final file = File('${directory!.path}/transaction_${reference}.png'); // 此处省略截图生成与保存逻辑 // 通过FileProvider生成可分享的Uri final uri = FileProvider.getUriForFile(context!, file); await ShareExtend.share(uri.path, 'image'); }
- 在
3. 验证Manifest权限配置
确保AndroidManifest.xml中添加了对应版本的权限:
- Android 12及以下:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> - Android 13+:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
4. 简化权限检查逻辑
原代码存在重复请求权限的冗余,建议使用上述简化版本,避免多次请求导致的权限状态不一致问题。
内容的提问来源于stack exchange,提问作者Abiodun Oni
相关产品推荐
相关产品推荐

