You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用share_extend 2.0.0与Permission_handler 11.0.0时Android分享异常

解决Android端share_extend交易凭证分享失效问题

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:
    1. 在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>
      
    2. 在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>
      
    3. 分享时使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 10:56:22