首页 > 其他分享 >flutterr 检测应用版本号、服务器下载文件 以及实现 App 自动升级、安装

flutterr 检测应用版本号、服务器下载文件 以及实现 App 自动升级、安装

时间:2024-04-12 22:45:41浏览次数:25  
标签:String appName 版本号 App await 获取 flutterr print 权限

依赖

  package_info_plus: ^7.0.0
  path_provider: ^2.1.2 #查找文件 获取文件存储路径
  open_file: ^3.3.2 # 打开文件插件
  permission_handler: ^11.3.1 #检测 Apk 是否拥有权限

配置权限

  <!-- 在 Android 6(Marshmallow)之前的版本中,明确声明网络权限 -->
 <uses-permission android:name="android.permission.INTERNET" /> 
    <!-- 添加存储权限声明 -->
   <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 允许应用程序读取外部存储器上的文件。如果你的应用需要读取设备上的文件 -->
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <!-- 应用有权请求安装其他应用程序的权限 -->
   <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

代码

//下载app
class UpdateApp extends StatefulWidget {
  const UpdateApp({super.key});

  @override
  State<UpdateApp> createState() => _UpdateAppState();
}

class _UpdateAppState extends State<UpdateApp> {
  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    this._getPackageInfo(); //获取版本号
    this._getAppPath(); //获取路径
  }

  void _showDialog() async {
    await showDialog(
        context: context,
        builder: (context) {
          return AlertDialog(
            title: const Text("更新APP提示!"),
            content: const Text("发现新的版本,新版本修复了如下bug 是否更新!"),
            actions: <Widget>[
              ElevatedButton(
                child: const Text("否"),
                onPressed: () {
                  Navigator.pop(context, 'Cancle');
                },
              ),
              ElevatedButton(
                child: const Text("是"),
                onPressed: () {
                  _downLoad();
                  Navigator.pop(context, 'Ok');
                },
              )
            ],
          );
        });
  }

  //获取版本号
  _getPackageInfo() async {
    PackageInfo packageInfo = await PackageInfo.fromPlatform();
    String appName = packageInfo.appName; // 获取应用程序的名称
    String packageName = packageInfo.packageName; // 获取应用程序的包名
    String version = packageInfo.version; // 获取应用程序的版本号
    String buildNumber = packageInfo.buildNumber; // 获取应用程序的构建号

    print("appName:$appName");
    print("packageName:$packageName");
    print("version:$version");
    print("buildNumber:$buildNumber");
  }

  //获取路径
  _getAppPath() async {
    // 获取应用程序的临时目录
    Directory tempDir = await getTemporaryDirectory();
    String tempPath = tempDir.path;

    // 获取应用程序的文档目录
    Directory appDocDir = await getApplicationDocumentsDirectory();
    String appDocPath = appDocDir.path;

    // 获取外部存储目录
    Directory? directory = await getExternalStorageDirectory();
    String storageDirectory = directory!.path;

    print("tempPath:$tempPath");
    print("appDocDir:$appDocPath");
    print("StorageDirectory:$storageDirectory");
  }

  //检查权限
// _checkPermission 方法用于检查并请求存储权限(仅限于 Android 平台)
  Future<bool> _checkPermission() async {
    await Permission.storage.request();
    // 检查当前主题平台是否为 Android
    if (Theme.of(context).platform == TargetPlatform.android) {
      // 获取存储权限的当前状态
      final status = await Permission.storage.status;

      final status1 = await Permission.requestInstallPackages.status;

      // 如果权限尚未被授予,则向用户请求权限
      if (status != PermissionStatus.granted &&
          status1 != PermissionStatus.granted) {
        final result = await Permission.storage.request();
        // 请求安装应用权限
        final requestInstallPackages =
            await Permission.requestInstallPackages.request();
        // 如果权限请求成功,则返回 true
        if (result == PermissionStatus.granted &&
            requestInstallPackages == PermissionStatus.granted) {
          return true;
        }
      }
      // 如果权限已经被授予,则直接返回 true
      else {
        return true;
      }
    }
    // 如果当前平台不是 Android,则直接返回 false
    return false;
  }

  //下载打开文件
  _downLoad() async {
    // 检查并获取存储权限
    var permission = await this._checkPermission();
//
    // await OpenFile.open("/storage/emulated/0/Android/data/com.example.kid_app/files/aaa.apk");

    // 如果权限已经被授予
    if (permission) {
      // 获取外部存储目录
      final directory = await getExternalStorageDirectory();
      String localPath = directory!.path;

      // 设置 APK 文件的保存路径和名称
      String appName = "aaa.apk";
      // String appName = "aaa.png";
      String savePath = "$localPath/$appName";

      // 设置 APK 文件的网络下载地址
      String apkUrl =
          "https://dashanjiaoyu.oss-cn-shanghai.aliyuncs.com/apk/app-release.apk";
      // 使用 Dio 库进行文件下载,并显示下载进度
      Dio dio = Dio();
      await dio.download(apkUrl, savePath,
          onReceiveProgress: (received, total) {
        if (total != -1) {
          // 打印当前下载进度百分比
          print((received / total * 100).toStringAsFixed(0) + "%");
        }
      });

      // 打印 APK 文件的保存路径
      print(savePath);
      print(
          "------------------------------------------打印 APK 文件的保存路径------------------------------------------");
      try {
        await OpenFile.open(
            "/storage/emulated/0/Android/data/com.example.kid_app/files/aaa.apk",
            type: "application/vnd.android.package-archive");
        //  await OpenFile.open(savePath);
      } catch (e) {
        print("Error opening file: $e");
      }
      // final result = await OpenFile.open(savePath);
    }
    // 如果权限未被授予
    else {
      print("没有权限");
    }
  }

  @override
  Widget build(BuildContext context) {
    return GestureDetector(
        onTap: () async {

          // 点击图标后执行的操作
          _showDialog();
        },
        child: SettingIcon(textLeft: 'Update App', textRight: "1.1.1"));
  }
}

 

 

标签:String,appName,版本号,App,await,获取,flutterr,print,权限
From: https://www.cnblogs.com/xbinbin/p/18132272

相关文章

  • uniapp实现虚拟列表(元素固定高度)
    一、应用场景当接口返回数据太多时,前端可使用虚拟列表,实现长列表。二、原理只有在屏幕部分元素被显示出来,并且被更新,始终只有固定数量的节点,不会卡顿。三、效果图四、思路步骤使用Object.freeze冻结对象,极大优化性能生成多个元素的options,或者动态获取根据onPag......
  • [题解][2022年江西省大学生程序设计竞赛] Remove and append
    题目描述给定一个包含n个整数的数组a。定义一个操作如下:从数组a中选择k个整数,将它们删除,并将它们的和追加到数组末尾。如果数组A比数组B(长度相同)字典序大,那么在A和B第一次不同的位置上,A的数字比B对应位置上的数字要大。例如,[0,1,14,0]比[0,1,5,6]字典序大,因为它们在第三......
  • 实验一 原型设计—游戏商城app
    问题一1.墨刀是一款在线原型工具,具有丰富的组件库和模板,允许设计师创建具有丰富交互元素的原型。可以快速创建各种类型的原型。还支持实时协作和云端存储,方便团队成员之间的沟通和合作。优点:墨刀支持实时协作,团队成员可以在原型上直接评论和批注,方便及时沟通和反馈;多人在线编......
  • 网易云音乐搜索与播放APP设计
    一、原型工具优缺点对比墨刀、Axure、Mockplus都是常见的原型设计工具,它们在适用领域和优缺点上有着各自的特点:墨刀:适用领域:墨刀适用于快速原型设计和团队协作。它的界面简洁易用,支持多种交互和动画效果,适合用于移动应用和网页的设计。优点:简单易上手,无需编码经验;提供在线协......
  • 背单词APP
    一、对墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点的分析1.墨刀适用领域:网页设计和移动应用界面设计快速原型制作和协作设计用户体验设计和交互设计优点:(1)界面直观,上手简单,适合初学者快速学习和使用。(2)支持实时协作,多人可以同时在同一个项目上工作,提高团队协......
  • apple 各手机尺寸说明
     iPhone是苹果公司最受欢迎的产品线之一,其尺寸从4英寸到6.7英寸不等。以下是iPhone各型号的尺寸:机型屏幕尺寸(英寸)分辨率(pt)像素(pixel)图片后缀iPhone4/4s 3.5(326ppi) 320x480 640x960 @2xiPhone5/5c/5s/SE1 4(326ppi) 320x568 640x1136 @2xiPhone6/6s/7/8/SE2-3 4.7(326ppi) 375......
  • 实验一:原型设计—大学生搜题app
    一、实验题目:原型设计二、实验目的:掌握产品原型设计方法和相应工具使用。三、实验要求(1)对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点(至少3条)。(2)利用网络资源自学Mockplus或墨刀等原型设计工具,并利用原型工具自拟主题进行原型设计。主题可以是高校二......
  • APP上架流程解析
    在当今数字化时代,移动应用程序已经成为企业和个人推广业务、增加收入的重要途径之一。然而,许多开发者却面临着一个共同的问题:他们不知道如何将自己开发的应用程序上架到应用商店中。本文将深入探讨APP上架的流程,并为您提供详细的指导,以便顺利将您的App推向市场。准备上架所需......
  • 手机商城APP-vivo
    1.墨刀是一款在线原型工具,具有丰富的组件库和模板,允许设计师创建具有丰富交互元素的原型。可以快速创建各种类型的原型。还支持实时协作和云端存储,方便团队成员之间的沟通和合作。优点:墨刀支持实时协作,团队成员可以在原型上直接评论和批注,方便及时沟通和反馈;多人在线编辑:墨刀......
  • 智慧校园外卖app
    分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点。墨刀(MockingBot):适用领域:墨刀适用于团队协作、快速原型设计和交互设计。它提供了丰富的组件库和交互功能,能够帮助设计师快速创建高保真度的原型。优点:简单易用:墨刀的界面简洁明了,操作简单,适合新手上手使......