如何在Flutter应用中分享当前或其他已安装应用的APK文件
Flutter应用分享自身APK文件实现方案
核心思路:定位APK本地路径 + 借助share_plus完成分享
1. 添加必要依赖
在pubspec.yaml中引入所需库:
dependencies: share_plus: ^6.3.0 package_info_plus: ^4.0.0 permission_handler: ^10.2.0 # 适配安卓9及以下权限需求
2. 获取自身APK的本地路径
安卓应用的APK默认存放在/data/app/[包名]/目录下,部分设备路径会带数字后缀(如包名-1),需通过包名匹配查找:
import 'package:package_info_plus/package_info_plus.dart'; import 'dart:io'; Future<String?> getOwnApkPath() async { // 获取当前应用包名 PackageInfo packageInfo = await PackageInfo.fromPackageInfo(); String packageName = packageInfo.packageName; // 先尝试基础路径 String basePath = "/data/app/$packageName/base.apk"; if (await File(basePath).exists()) { return basePath; } // 遍历/data/app目录,匹配包含包名的APK文件 try { Directory appDir = Directory("/data/app/"); if (await appDir.exists()) { List<FileSystemEntity> items = appDir.listSync(); for (var item in items) { if (item is Directory && item.path.contains(packageName)) { String apkPath = "${item.path}/base.apk"; if (await File(apkPath).exists()) { return apkPath; } } } } } catch (e) { print("查找APK路径出错: $e"); } return null; }
3. 权限处理(安卓9及以下)
安卓10及以上访问/data/app目录无需额外权限,但安卓9及以下需要READ_EXTERNAL_STORAGE权限,可通过permission_handler请求:
import 'package:permission_handler/permission_handler.dart'; import 'package:device_info_plus/device_info_plus.dart'; Future<bool> checkAndRequestPermission() async { if (!Platform.isAndroid) return true; // 安卓10+无需权限 AndroidDeviceInfo androidInfo = await DeviceInfoPlugin().androidInfo; if (androidInfo.version.sdkInt >= 29) { return true; } PermissionStatus status = await Permission.storage.request(); return status.isGranted; }
4. 调用share_plus分享APK
import 'package:share_plus/share_plus.dart'; Future<void> shareOwnApk() async { // 先检查权限 bool hasPermission = await checkAndRequestPermission(); if (!hasPermission) { // 提示用户开启存储权限 return; } // 获取APK路径 String? apkPath = await getOwnApkPath(); if (apkPath == null) { // 提示未找到APK文件 return; } // 执行分享 XFile apkFile = XFile(apkPath); await Share.shareXFiles( [apkFile], text: "分享我的应用安装包", ); }
注意事项
- 该逻辑仅适用于安卓平台,iOS无APK文件,需通过
Platform.isAndroid做平台判断 - 部分定制ROM可能修改APK存储路径,若遍历方式仍无法找到,可考虑将APK复制到外部存储后再分享(需额外权限)
- 分享前务必检查文件是否存在,避免抛出异常
内容的提问来源于stack exchange,提问作者Anandh Krishnan
相关产品推荐
相关产品推荐

