项目场景:

在Flutter项目中使用flutter_downloader: ^1.9.1下载apk文件,小米手机提示下载成功但是通知栏进度条卡住并且未跳出安装apk的窗口。
当前Android项目包名:com.app.update.demo


问题描述

下载更新app提示“下载成功!”,但是执行语句

OpenResult openResult=  await OpenFile.open(file.path,type: 'application/vnd.android.package-archive');

时报错:ResultType.fileNotFound。下载保存地址为:/storage/emulated/0/Android/data/com.app.update.demo/files/my_app/my_app_1668582134848.apk,可是在文件管理器中找到my_app_1668582134848.apk文件实际保存地址为:/storage/emulated/0/Download/my_app_1668582134848.apk,与目标位置不一致所以报错找不到文件

upDateApp() async {if (Platform.isIOS) {if (await canLaunchUrl(Uri.parse(XConfig.appStoreUrl))) {await launchUrl(Uri.parse(XConfig.appStoreUrl));} else {throw ('无效的url');}} else if (Platform.isAndroid) {bool isStorage = await PreferenceUtils.requestStoragePermission();if (!isStorage) {Fluttertoast.showToast(msg: "未开启手机储权限",gravity: ToastGravity.CENTER,);return;}var times = DateTime.now().millisecondsSinceEpoch;var fileName = 'my_app_$times.apk';_bindBackgroundIsolate(fileName);FlutterDownloader.registerCallback(downloadCallback);var savedDir = await _prepareSaveDir();File file = File(Uri.encodeFull(savedDir + '/' + fileName));if (await file.exists()) await file.delete();FlutterDownloader.enqueue(url: XConfig.androidApkUrl + '?time=$times',headers: {"auth": "test_for_sql_encoding"},savedDir: savedDir,fileName: fileName,showNotification: true,saveInPublicStorage: true,openFileFromNotification: true);}}
void _bindBackgroundIsolate(String name) {final ReceivePort _port = ReceivePort();bool isSuccess = IsolateNameServer.registerPortWithName(_port.sendPort, 'downloader_send_port_app');if (!isSuccess) {_unbindBackgroundIsolate();_bindBackgroundIsolate(name);return;}_port.listen((dynamic data) async {String? id = data[0];DownloadTaskStatus? status = data[1];double progress = data[2] / 100;if (status == DownloadTaskStatus.running) {EasyLoading.showProgress(progress, status: '正在下载最新版本');}if (status == DownloadTaskStatus.failed) {EasyLoading.showError('下载失败,请稍后再试!');EasyLoading.dismiss();}if (status == DownloadTaskStatus.complete && id != null) {EasyLoading.showSuccess('下载成功!');EasyLoading.dismiss();var savedDir = await _prepareSaveDir();var filePath = '$savedDir/$name';File file =File(Uri.encodeFull(filePath));OpenResult openResult=  await OpenFile.open(file.path,type: 'application/vnd.android.package-archive');print(openResult.message);}});}
_prepareSaveDir() async {String _localPath = (await _findLocalPath())! + '/my_app';final savedDir = Directory(Uri.encodeFull(_localPath));bool hasExisted = await savedDir.exists();if (!hasExisted) {savedDir.createSync();}return _localPath;}void _unbindBackgroundIsolate() {IsolateNameServer.removePortNameMapping('downloader_send_port_app');}Future<String?> _findLocalPath() async {var externalStorageDirPath;if (Platform.isAndroid) {final directory = await getExternalStorageDirectory();externalStorageDirPath = directory?.path??await getTemporaryDirectory();} else if (Platform.isIOS) {externalStorageDirPath =(await getApplicationDocumentsDirectory()).absolute.path;}return externalStorageDirPath;}

原因分析:

小米手机MIUI针对下载保存的apk文件进行了另存,并且删除了原路径的文件


解决方案:

在下载成功以后根据下载目标路径判断当前文件是否存在,如果不存在则使用小米系统下载保存路径+文件名重试:/storage/emulated/0/Download/文件名.apk

 if (status == DownloadTaskStatus.complete && id != null) {EasyLoading.showSuccess('下载成功!');EasyLoading.dismiss();var savedDir = await _prepareSaveDir();var filePath = '$savedDir/$name';File file =File(Uri.encodeFull(filePath));if(file.existsSync()){print(file.path);}else{// 小米手机下载完成后会将文件移动到/storage/emulated/0/Download/路径下var xiaomiPath= filePath.replaceAll("Android/data/com.app.update.demo/files/my_app/", "Download/");file =File(Uri.encodeFull(xiaomiPath));}OpenResult openResult=  await OpenFile.open(file.path,type: 'application/vnd.android.package-archive');print(openResult.message);}

创作不易,请作者喝杯咖啡:

小米手机使用FlutterDownloader下载安卓apk文件不能正常安装相关推荐

  1. 7z001怎么解压在安卓手机上面_安卓zip文件压缩RAR解压手机下载-安卓zip文件压缩RAR解压v1.0最新版下载...

    安卓zip文件压缩RAR解压是一款非常好用的手机压缩解压缩神器,在安卓zip文件压缩RAR解压上我们可以看到很多的实用的功能,软件可以帮助我们更好的处理我们手机中的文件,感兴趣的朋友赶紧下载安卓zip ...

  2. cordova 安卓文件多选_安卓zip文件压缩RAR解压软件下载-安卓zip文件压缩RAR解压下载v3.0.4安卓版...

    安卓zip文件压缩RAR解压是一款非常好用的手机压缩解压缩神器,在安卓zip文件压缩RAR解压上我们可以看到很多的实用的功能,软件可以帮助我们更好的处理我们手机中的文件,感兴趣的朋友赶紧下载安卓zip ...

  3. 小米4如何用计算机读取文件夹,小米手机如何连接电脑?如何传输文件至电脑?[多图]...

    ?最近有位朋友想要把自己小米手机的文件发送至电脑,但是文件较大无法通过微信或者QQ传送,因此想要将小米手机连接电脑,从而进行文件传输.那么,小米手机如何连接电脑呢?其实,方法还是比较多的,下面就和大白 ...

  4. 安卓apk文件使用命令行进行V1和V2签名

    安卓apk文件使用命令行进行V1和V2签名 前言 安装JDK.安卓SDK V1签名 V2签名 签名验证 批处理自动签名 批处理文件编写 批处理签名使用 尾巴 前言 现在安卓APP要上传应用市场或者基于 ...

  5. android app安装时检测本地文件,天天模拟器怎么安装本地APK文件 天天模拟器安装本地APK图文教程...

    天天模拟器是目前比较好用的一款安卓模拟器软件,国内首款支持游戏游戏手柄.天天模拟器兼容性好,支持市面上99%以上的安卓游戏和软件,优越的性能,是Windows平台首选的安卓模拟器软件. 本文将为大家列 ...

  6. 小米手机系统脚本上传服务器文件夹,小米手机与电脑可以高速传文件?看看这些你也许会明白-红米手机怎么连接电脑...

    现在很多人喜欢用手机办公,但是大部分的时候手机和电脑的文件需要互传,就需要借用数据线.联网的还好,不联网的没办法用网络传输 手机与电脑间传输文件有很多种方法,有不需要USB数据线的但需要无线WIFI联 ...

  7. 手机版本android升级包下载,安卓7.0通用升级包安装

    安卓7.0通用升级包安装,这是有安卓最新推出的手机系统更新版本,用户通过这款版本能够轻松让自己的手机进行更新升级,让使用过程更加流畅,不卡顿,还提供了多种多样更新的细节等待大家去发现,安装过程中也会自 ...

  8. uniapp项目创建打包生成安卓apk文件

    1.下载开发工具 HBuilder X 并安装 下载地址(安装过程不赘述):HBuilderX-高效极客技巧 2.创建uniapp项目 点击左上角文件=>新建=>项目,选择项目类型,填写项 ...

  9. 小米手机系统脚本上传服务器文件,学会这几招,MIUI传文件不用愁

    原标题:学会这几招,MIUI传文件不用愁 生活中总会遇到这样的困扰,想要传文件的时候不知道用什么方式传输.想和朋友分享一个好玩的APP,纠结于怎样传送.既想节省流量,又得传输速度快,省时间.好在注重用 ...

最新文章

  1. strcpy.strcmp.strlen.strcat函数的实现
  2. openmv集成应用_使用OpenMV引导无人机飞行
  3. ABAP SET UPDATE TASK LOCAL的测试
  4. STM32 应用程序加密的一种设计方案
  5. 全排列函数(next_permutation)
  6. TBS 腾讯浏览服务(X5WebView) 集成指南
  7. vs c语言绘图函数,C语言图形编程(绘图函数部分)
  8. .net使用本地MQ消息队列( .net 4.5 环境)
  9. HTML5工程师利用原生js开发百度搜索黑洞漩涡特效
  10. USACO-Fractions to Decimals
  11. python判断是否是英文字母_python学习:判断字符串中字母数字空格的个数
  12. 物流行业SaaS多租用商城系统:提升企业物流管理效率,实现高效协同
  13. 基于STM32F407的人脸追踪
  14. 人工智能和中国国家人工智能发展战略
  15. Redis主从模式下从库过期的key仍然能够被读到的解决方案
  16. 中缀表达式转后缀表达式详细思路及代码实现
  17. 如何加盟游戏代理充值
  18. 群晖nas介绍文档_群晖 NAS 选购 入门指南:动手打造自己的家庭数据中心
  19. python自动标注autocad坐标_Python+matplotlib数据可视化鼠标悬停自动标注功能实现
  20. 深信服超融合基础架构管理平台--虚拟网络测试实践

热门文章

  1. php 促成交易,促成交易的方法
  2. 2020年最新计算机二级考试题库资料大全!
  3. r语言寻找1000以内的质数
  4. 利盟 x466 双面打印问题之正反面颠倒
  5. BIM技术在装饰装修工程中的应用
  6. 上海莉莉丝、米哈游、B站、小红书、得物等互联网公司前端面试总结
  7. 0xffffffff在不同情况下的输出
  8. linux-Ubuntu-centos-deepin操作系统网卡驱动Realtek-RTL8111-RTL8168-rtlwifi-rtl8188-8192-8723-8821-免费下载---收集到的
  9. 手机变速齿轮_手机app变速齿轮
  10. Xilinx FPGA时钟及I/O接口规划(二)