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

这篇具有很好参考价值的文章主要介绍了小米手机使用FlutterDownloader下载安卓apk文件不能正常安装。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目场景:

在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);
      }

创作不易,请作者喝杯咖啡:
flutter 下载apk,Flutter,Bugs,android,flutter,android studio文章来源地址https://www.toymoban.com/news/detail-535720.html

到了这里,关于小米手机使用FlutterDownloader下载安卓apk文件不能正常安装的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT APK 安卓手机 安装包

    ChatGPT APK 安卓手机 安装包 2023官方最新版是全新上线的ai智能对话软件,你可以通过声音匹配自己喜欢的队友,在这里参与到体验中来下载地址:https://download.csdn.net/download/qq_24529345/87427760

    2024年02月12日
    浏览(54)
  • 安卓studio的APK包安装到手机

    建立APK密钥等信息          2. 创建新的apk信息  3.选择版本,两个都勾选,考虑兼容性  4.导包完成,进入文件所在位置  5.将文件到QQ,自行安装   出错时考虑版本兼容 打开AndroidManifest.xml文件   再次导包,安装成功     

    2024年02月11日
    浏览(49)
  • 华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看

    华为手机 鸿蒙系统 或者安卓系统的百度网盘下载的文件保存在手机什么位置如何查看  连接电脑后一般在这里位置 计算机Mate 20 Pro (UD)内部存储DownloadBaiduNetdisk 也就是用usb(数据线,不是充电线,要四心的 )连接手机后,打开手机盘,download目录  

    2024年04月13日
    浏览(217)
  • 利用MSF打包加固APK对安卓手机进行控制

    由于经典的MSF生成apk安装包控制,版本较低,高版本安卓手机可能会出现版本不支持或无法使用的现象,而且apk无法正常使用,没有图形化界面,比较假。 相比于原始的msf远控,此版本app在进行远控时,被注入的app可以正常运行,原始msf生成的app程序,只在桌面上有一个图标

    2024年01月16日
    浏览(42)
  • 解决安卓手机(小米手机实测有效)移动网络无信号以及快速恢复的方法

    现象: 行动到某个区域时突然没网(微信支付无法使用、 健康宝无法加载、公交卡二维码无法展现等等) 解决方案: 1.   可以先尝试把手机打开“飞行模式”, 几秒种后再关闭“飞行模式”。 看下手机网络是否已恢复。 2.   在手机的拨号盘(打电话的地方)输入 *#*#4

    2024年02月13日
    浏览(114)
  • uniapp:实现手机端APP登录强制更新,从本地服务器下载新的apk更新,并使用WebSocket,实时强制在线用户更新

    实现登录即更新,或实时监听更新 本文介绍的是在 App打开启动 的时候调用更新,点击下方链接,查看使用 WebSocket 实现 实时 通知 在线用户 更新。 uniapp:全局消息是推送,实现app在线更新,WebSocket,apk上传: 背景 :内部手持机app开发功能,需要更新的到车间各个手持机上。

    2024年02月03日
    浏览(39)
  • Android开发-安卓手机真机调试配置教程(以小米/红米手机为例)

    打开手机的设置,点击我的设备。 进入全部参数信息。  下拉找到MIUI版本,多次连续点击,直到进入开发者模式,弹出如图提示。   在设置最上方的搜索框中搜索 开发者选项 ,点击进入开发者选项。    下拉找到“调试”中的“USB调试”和“USB安装”,全部开启,并无视

    2024年02月07日
    浏览(83)
  • 安卓账户锁(解密码,刷机,忘记密码,手机工程向)华为,小米等

    手机的密码分为两种:密码锁和账户锁 这里用的是P30-鸿蒙系统 密码锁太简单了,不作赘述,需要的找我。刷机后的账户才是比较麻烦的。 准备的工具:工程线、菊花三代、手机一部 软件: 华为OEM版本查询用于查看被锁手机的信息-Android文档类资源-CSDN下载 步骤:手机不连

    2024年02月11日
    浏览(52)
  • 安卓逆向学习及APK抓包(二)--Google Pixel一代手机的ROOT刷入面具

    在手机选择上,优先选择谷歌系列手机,Nexus和Pixel系列,刚好手头有Pixel一代,就直接root了,大家感兴趣可以某宝几百块钱入手一台。Pixel手机花了本人一天,中间踩坑无数,终于还是root成功,感触颇深,所以先记录一下Pixel手机的root之旅。 安卓逆向学习及APK抓包(一)【Ka

    2024年02月11日
    浏览(63)
  • 安卓系统--翻译手机rom语言 添加多国语言 编译apk 反编译ODEX 工具步骤解析

    很多小品牌机型不具备多语言设置。国内大都是中文。要想换为其他语言除非固件支持。例如国际版固件等等。大厂基本都有中文或者英文或者其他语言配置。而小品牌机型只能通过修改rom来达到多语言调用. 今天给友友介绍一款工具,可以用来翻译手机rom语言。添加多国语

    2024年02月04日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包