Flutter APP内部APK下载以及安装

强大的Flutter App升级功能 注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 应用程序升级功能是App的基础功能之一,如果没有此功能会造成用户无法升级,应用程序的bug或者新功能老用户无法触达,甚至损失这部分用户。 对于应用程序升级功能的重要性就无需赘言了,下面介绍下应用程序升级功能的几种方式,从平台方面来说: ... 阅读详情
AI摘要

本文介绍如何使用Flutter实现安卓应用的在线APK下载及安装流程。包括请求必要的文件系统权限、利用Dio进行APK文件的下载、显示下载进度以及通过插件安装已下载的APK。

本帖主要实现Flutter安卓系统 APK在线下载以及安装

  • 检查APK权限
//必要权限,安装权限 
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
//写外置存储的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//读外置存储的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
//读取手机状态和身份
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
  引用架包:
  permission_handler: ^3.2.0

  引用:
  import 'package:permission_handler/permission_handler.dart';

  /// 检查是否有权限
  void checkPermission() async {
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);
    if (permission != PermissionStatus.granted) {
      Map<PermissionGroup, PermissionStatus> permissions =
          await PermissionHandler()
              .requestPermissions([PermissionGroup.storage]);
      if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
        return;
      }
    } else {
      return;
    }
  }

 

  • 下载APK文件
  引用架包:
  dio: ^3.0.7

  引用文件:
  import 'dart:io';
  import 'package:dio/dio.dart';
  import 'package:path_provider/path_provider.dart';

  
  /// 下载并安装APK文件
  void updateAppEx(String url) async {
    try {
      File _apkFile = await downloadAndroid(url);
      _apkFilePath = _apkFile.path;

      if (_apkFilePath.isEmpty) {
        print('make sure the apk file is set');
        return;
      }
    } catch (e) {
      print('下载APK失败: $e');
    }
  }

  //用分割URL来获取下载的APK名称
  String getFlieName(String url) {
    try {
      if (url != null) {
        List<String> lstStr = url.split('/');
        return lstStr.last;
      }
    } catch (e) {
      print("获取下载文件名错误:$e");
    }
    return "";
  }

  /// 下载安卓更新包
  // ignore: missing_return
  Future<File> downloadAndroid(String url) async {
    //获取APK文件名
    String fileName = getFlieName(url);
    if (fileName != "") {
      /// 创建存储文件
      Directory storageDir = await getExternalStorageDirectory();
      String storagePath = storageDir.path;

      String filePath = '$storagePath/$fileName';
      File file = new File(filePath);
      try {
        // if (!file.existsSync()) {
        Dio dio = new Dio();
        // file.createSync();
        Response response = await dio.download(url, filePath,
            onReceiveProgress: (int count, int total) {
          //进度
          var d = (count / total).toStringAsFixed(2);
          _dPercent = double.parse(d);
          print((_dPercent * 100).toString() + "%");
          print("现在进度: 当前:$count  总:$total");
          setState(() {});
        });
        if (response.data.statusCode == 200) {
          _downloadFinish = true;
          print('文件下载完成!:${response.data}');
          setState(() {});
        }
        // }
        return file;
      } catch (e) {
        print(e);
      }
    }
  }
  • 安装APK
  引用架包:
  install_plugin: ^2.0.1

  引用:
  import 'package:install_plugin/install_plugin.dart';

  //安装APK
  void installApk() {
    try {
      InstallPlugin.installApk(
              _apkFilePath, "com.example.flutterDemo")
          .then((result) {
        print('install apk $result');
      }).catchError((error) {
        print('install apk error: $error');
      });
    } catch (e) {
      print('安装APK失败: $e');
    }
  }
  • 完整代码
import 'dart:io';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:install_plugin/install_plugin.dart';
import 'package:path_provider/path_provider.dart';
import 'package:percent_indicator/linear_percent_indicator.dart';
import 'package:permission_handler/permission_handler.dart';

class UpdateApk extends StatefulWidget {
  @override
  _UpdateApk createState() => _UpdateApk();
}

class _UpdateApk extends State<UpdateApk> {
  /// 检查是否有权限
  void checkPermission() async {
    PermissionStatus permission = await PermissionHandler()
        .checkPermissionStatus(PermissionGroup.storage);
    if (permission != PermissionStatus.granted) {
      Map<PermissionGroup, PermissionStatus> permissions =
          await PermissionHandler()
              .requestPermissions([PermissionGroup.storage]);
      if (permissions[PermissionGroup.storage] == PermissionStatus.granted) {
        return;
      }
    } else {
      return;
    }
  }

  String _apkFilePath = "";

  /// 下载并安装APK文件
  void updateAppEx(String url) async {
    try {
      File _apkFile = await downloadAndroid(url);
      _apkFilePath = _apkFile.path;

      if (_apkFilePath.isEmpty) {
        print('make sure the apk file is set');
        return;
      }
    } catch (e) {
      print('下载APK失败: $e');
    }
  }

  void installApk() {
    try {
      InstallPlugin.installApk(_apkFilePath, "com.example.flutterDemo")
          .then((result) {
        print('install apk $result');
      }).catchError((error) {
        print('install apk error: $error');
      });
    } catch (e) {
      print('安装APK失败: $e');
    }
  }

  String getFlieName(String url) {
    try {
      if (url != null) {
        List<String> lstStr = url.split('/');
        return lstStr.last;
      }
    } catch (e) {
      print("获取下载文件名错误:$e");
    }
    return "";
  }

  double _dPercent = 0;

  /// 下载安卓更新包
  // ignore: missing_return
  Future<File> downloadAndroid(String url) async {
    String fileName = getFlieName(url);
    if (fileName != "") {
      /// 创建存储文件
      Directory storageDir = await getExternalStorageDirectory();
      String storagePath = storageDir.path;

      String filePath = '$storagePath/$fileName';
      File file = new File(filePath);
      try {
        // if (!file.existsSync()) {
        Dio dio = new Dio();
        // file.createSync();
        Response response = await dio.download(url, filePath,
            onReceiveProgress: (int count, int total) {
          //进度
          var d = (count / total).toStringAsFixed(2);
          _dPercent = double.parse(d);
          print((_dPercent * 100).toString() + "%");
          print("现在进度: 当前:$count  总:$total");
          setState(() {});
        });
        if (response.data.statusCode == 200) {
          _downloadFinish = true;
          print('文件下载完成!:${response.data}');
          setState(() {});
        }
        // }
        return file;
      } catch (e) {
        print(e);
      }
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    //初始化系统数据
    checkPermission();
    super.initState();
  }

  //下载APP
  Future updateApp() {
    setState(() {});
    //APK文件下载地址
    var url = "http://flutterdemo/demo_1_0_1.apk";
    updateAppEx(url);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Padding(
                padding: EdgeInsets.only(left: 10, top: 10, right: 10),
                child: MaterialButton(
                  color: Color(0xFF0F4C81),
                  textColor: Colors.white,
                  child: Text('下载APK', textAlign: TextAlign.center),
                  onPressed: updateApp,
                ),
              ),
              Padding(
                padding: EdgeInsets.only(left: 10, top: 10, right: 10),
                child: new LinearPercentIndicator(
                  width: MediaQuery.of(context).size.width - 20,
                  animation: true,
                  lineHeight: 25.0,
                  percent: _dPercent,
                  center: Text(((_dPercent * 100).toString() + "%")),
                  linearStrokeCap: LinearStrokeCap.roundAll,
                  progressColor: Colors.greenAccent,
                ),
              ),
              Padding(
                padding: EdgeInsets.only(left: 10, top: 10, right: 10),
                child: MaterialButton(
                  color: Color(0xFF0F4C81),
                  textColor: Colors.white,
                  child: Text('安装APK', textAlign: TextAlign.center),
                  onPressed: installApk,
                ),
              ),
            ]),
      ),
    );
  }
}

 

Flutter插件开发之APK自动安装,洞悉MySQL底层架构 使用平台通道在客户端(Flutter UI)和宿主(平台)之间传递消息,如下图所示 创建Flutter App 相关代码见运行第一个Flutter App 创建Flutter Plugin 右键工程->New->Module,如下图所示 选择Flutter Plugin,点击Next,如下图所示 输入工程名(Project name),点击Next,如下图所示 输入包名(Package name),点击Finish,入下图所示 到此Flutter plugin创建完成。 引入插件 在工程目录下找 阅读详情

相关推荐

flutter实现app内部更新

import 'dart:io'; import 'dart:isolate'; import 'dart:ui'; import 'package:flutter_downloader/flutter_downloader.dart'; import 'package:flutter/material.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:path_provider/path_

weixin_43387282的博客 3620

从零学习Fluter(七):Flutter仿boss直聘以及Flutter打包apk详解

flutter_boss_v1.0 重构 ##说明 该项目是本人基于网上大佬9个月前公布的仿boss直聘app进行的v1.0版本的重构 而不是简单的copy,旧项目中有部分bug,本人已经修复,另外对目录结果进行从新调整,欢迎star 项目会持续跟新,欢迎关注 效果预览图 详情============ 说明 该项目有许多地方没有完善 启动页白屏 分页指示器dot问题 ...

weixin_33882443的博客 622

Flutter使用Flutter_xupdate 远程更新app实现记录

网络上有很多远程更新app的逻辑,我是第一次搞这个,参考了很多文章。这些文章大都逃不开一个框架,就是下面的这个步骤。这让我非常的懊恼,因为那些文章对我这个小白很不友好。正在懊恼之际,看到了大佬写的Flutter_Xupdate插件,这让我有种如获至宝的感觉(当时还不明白,只是有插件我就感觉好太多)。现在成功地通过Flutter_Xupdate插件实现了远程更新app的功能,对大佬更加地顶礼膜拜,因为代码量真的很少!

qq_63137016的博客 2859

flutter开发实战-应用更新apk下载、安装apk、启动应用实现

flutter开发实战-应用更新apk下载、安装apk、启动应用实现在开发过程中,经常遇到需要更新下载新版本的apk文件,之后进行应用更新apk下载、安装apk、启动应用。我们在flutter工程中实现下载apk,判断当前版本与需要更新安装的版本进行比对判断,通过判断VersionCode来确定下载新版版APK。

一名开发者 3253

Flutter-实现-App-内更新安装包

IOS的处理方式比较简单,直接跳转到appStore即可,我这里采用的urlLauncher直接跳转(2) Android更新app包需要开启存储权限,如果没有权限就申请/// 检查是否有权限,用于安卓} else {} else {需要在Android的 AndroidManifest.xml文件增加权限配置。

2301_79098336的博客 1073

Flutter应用程序版本更新与自动升级配置方法

本文介绍了Android应用升级的实现流程和关键API。首先通过package_info插件获取本地版本号,与服务器版本对比,若不一致则提示升级。下载环节使用flutter_downloader插件,需配置相关权限和存储路径。文件下载完成后通过open_file插件进行安装。注意版本控制需同步修改AndroidManifest.xml和pubspec.yaml中的versionCode和versionName,确保升级后能正确覆盖旧版本。整个流程包括版本检测、下载管理和安装处理三个核心环节。

分享前端工程化、AI 应用、Agent 开发与大模型实践! 9088

在Flutter中使用Install_Plugin安装APK

在开发Flutter应用时,有时候我们需要实现在应用内部安装APK的功能。众所周知,Android 7.0以后由于改变了文件URI的访问方式,我们需要使用FileProvider来创建一个content://URI来授予临时访问权限。Flutter不同与原生,在Flutter中要么自己手写插件调用原生代码进行安装APK,要么找个第三方库来实现该功能,本人能力有限就简单介绍并使用本文的主角来实现该功能吧。

WriteBug001的博客 2688

FlutterDemo合集.7z

FlutterDemo合集.7z

Flutter APP下载更新

由于我做的项目不是放在APP商店(公司内部用)的,一些flutter的第三方库不合适我,我需要用的是从网上下载再安装(从服务下),网上也找了花了我好几天时间。不全又乱,这我自己做一下备注现在只使用安卓下载,ios没有做(后期可能更新)

weixin_59916662的博客 2445

Flutter下载更新App的方法示例

主要介绍了Flutter下载更新App的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一文说清STM32CubeMX中文汉化全流程(图解说明)

详细讲解STM32CubeMX中文汉化的完整流程,通过图文并茂的方式手把手教学,解决界面英文带来的使用障碍,让开发更高效。掌握stm32cubemx中文汉化技巧,提升嵌入式开发体验。

weixin_42499004的博客 6267

flutter APP下载或 APP更新的几种方法

博主试了3种方案 如下: 方法1 先下载安装包,打开文件进行安装 使用dio工具库的下载,也可以采用下载插件flutter_downloader,这个插件支持Android、IOS下载 我这里使用的是dio下载 ,使用install_plugin 安装apk ,ios则跳转到 app stor /// 下载apk Future<File> _downloadApk(String datasource) async { /// 创建文件 Directory stora...

jq的博客 3586

1.Fay-UE5数字人工程导入(UE数字人系统教程)

ue5数字人系列教程(含源文件工程)

1万+

flutter创建、安装扩展包、打包apk

flutter创建、安装扩展包、打包apk

lau_jw的博客 5304

【python科研数据处理】将Endnote自动搜索的所有pdf文件,全都移动指定文件夹中

将Endnote自动搜索到的全部pdf文件,全都移动指定文件夹中1 背景2 问题解决 手动反爬虫,禁止转载:原博地址 https://blog.youkuaiyun.com/lys_828/article/details/122370892(优快云博主:Be_melting) 知识梳理不易,请尊重劳动成果,文章仅发布在优快云网站上,在其他网站看到该博文均属于未经作者授权的恶意爬取信息 1 背景 在进行期末考试周后,面对最后一门功课,需要提交至少80篇SCI参考文献,因此最快下载文献的方式就是通过Web of S

lys_828的博客 1826

通信算法之267 : DJI无人机 云哨 DroneID 640ms

消费级无人机可以用于高级航拍、物流和人道主义救援等等。但是其广泛使用给安全、安保和隐私带来了许多风险。例如,攻击方可能会使用无人机进行监视、运输非法物品,或通过侵入机场上方的封闭空域造成经济损失。为了防止恶意使用,无人机制造商采用多种对策来强制安全可靠地使用无人机,例如对速度和高度施加软件限制,或使用地理围栏实施禁飞区。作为对传统对策的补充,市场领导者大疆(DJI)为无人机实施了一种称为 DroneID 的跟踪协议,该协议旨在将无人机及其操作员的位置传输给授权实体,例如执法部门或关键基础设施的运营商。

leegang12的专栏 3306

flutter_install_plugin:实现Flutter应用内安装APK和跳转App Store

flutter_install_plugin:实现Flutter应用内安装APK和跳转App Store 项目介绍 flutter_install_plugin 是一个功能强大的Flutter插件,它允许开发者在使用Flutter框架开发的应用程序中,直接安装Android应用的APK文件,同时也可以通过URL跳转到iOS的App Store进行应用下载。这一功能极大地提升了Flutter应用的用...

gitblog_00960的博客 982

PCL Trimmed ICP实现点云精配准【2025最新版】

博客长期更新,本文最新更新时间为:2025年6月25日。抄袭狗记得来抄最新代码哦,抄都抄成错的,不够丢人钱。

点云侠的博客 37万+

最新FlutterAPP内部更新并且安装的功能

前言: 介绍一下APP更新的流程 1 、Android App 升级执行流程 1、获取本地版本号 2、请求服务器获取服务器版本号 3、本地版本和服务器版本不一致提示升级,弹窗提示用户是否更新 4、用户确定升级,调用文件传输方法下载 apk 文件 5、监听下载进度 6、下载完成打开 Apk 进行安装 注意:在 Ios 中没法直接下载安装,如果版本不一致直接跳转到 Ios 应用对应的应用市场就可以了...

qq_38774121的博客 5032

【OpenClaw企业级智能体实战】第16篇:电商“龙虾”掘金记:用OpenClaw实现小红书/抖音/淘宝全自动矩阵运营(2026实测版)

2026年,OpenClaw(小龙虾)已成为电商运营的核心效率工具——从公众号文案3分钟生成到TikTok爆款视频1小时复刻,从多平台内容同步到自动比价加购,彻底重构了电商运营的工作模式。本文基于真实商业案例(元岳科技、TikTok跨境卖家、淘宝MCP工具),系统拆解电商智能体的落地路径:先详解OpenClaw在电商场景的核心原理与变现模式(代部署、模板售卖、轻定制、内容套利),再提供阿里云/本地双部署方案,完整实现小红书/抖音/淘宝的自动化运营(热点抓取、内容生成、多平台分发、数据分析)。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2282

【大模型】AI 辅助编程操作实战使用详解

AI 编程实战使用详解

congge 8459

Flutter应用内更新App版本使用flutter_downloader而非ota_update,很全面的讲解

(插件文档说明可以通知栏显示,但是我用的这个版本在100%下完后总是failed,而不是complete,就不会很友好,后面我就删掉了,不会详细介绍,大体就是插件文档中配置文件配置后,还需要去授权通知栏权限)为什么选择flutter_downloader而非ota_update插件。

qq_45276054的博客 5897

【天气雷达】双偏振产品-差分传播相移KDP详解

双偏振产品-差分传播相移KDP详解。

珞瑜的博客 2661

【Flutter-xiaomi-su7-App】开源下载和安装教程

【Flutter-xiaomi-su7-App】开源下载和安装教程 【免费下载链接】Flutter-xiaomi-su7-App 基于 Flutter 开发的小米 SU7 智能汽车控制界面,展示了丰富的动画效果和交互体验。支持多平台运行,提供统一的用户体验。支持Android、iOS、Web、Windows、macOS、...

gitblog_01401的博客 1084

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流

优雅草央千澈设置为我们以vs-code开发flutter 项目来打包 apk为例,安卓apk打包流程设置图标,包名-签名-APP名-打包流程,接上一篇我们已经初步写了一个注册页面代码。构建完成后,可以在build/app/outputs/flutter-apk/目录下找到生成的APK文件。

一颗优雅草科技-央千澈的优快云博客~只想无穷无尽的学习~作息早8-晚8 2984

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

flutter跨平台开发之App升级方案

题记 —— 执剑天涯,从你的点滴积累开始,所及之处,必精益求精,即是折腾每一天。 重要消息 精通点的可以查看这里 精述 Flutter 从入门实践到开发一个APP之UI基础篇 视频 flutter从入门 到精通 系列文章 本文章将讲述: 在 flutter 跨平台开发中,使用插件 install_plugin_custom,实现在 Android 平台调起自动安装,在 ios 平台跳转...

代码小疯子 2224

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

上一篇: Flutter 实现二维码扫描
下一篇: Flutter 修改程序版本以及程序名称
leftstrange
博客等级 码龄15年 23粉丝 35原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值