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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:15:32