• Flutter高仿微信-第33篇-单聊-图片


    Flutter高仿微信系列共59篇,从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。

     详情请查看

    效果图:

    详情请参考 Flutter高仿微信-第29篇-单聊 , 这里只是提取图片实现的部分代码。

    实现代码:

    //打开相册权限
    void _openAblumPermission() async {
      bool isPhotosGranted = await Permission.photos.isGranted;
      bool isPhotosDenied = await Permission.photos.isDenied;
      if(isPhotosGranted){
        _openAblum();
      } else {
        if(isPhotosDenied){
          _openAblum();
        } else {
          //跳转到设置页面提示
          _showPhotosConfirmationAlert(context);
        }
      }
    }

    // 为正常拍摄,请前往设备中的【设置】> 【隐私】> 【相机】中允许无他相机使用
    _showPhotosConfirmationAlert(BuildContext context) {
      showPlatformDialog(
        context: context,
        builder: (_) => BasicDialogAlert(
          title: Text("无法使用相册"),
          content: Text("为编辑照片,请前往设备中的【设置】> 【隐私】> 【照片】中允许${AppManager.getInstance().appName}使用"),
          actions: [
            BasicDialogAction(
              title: Text("知道了"),
              onPressed: () {
                Navigator.pop(context);
              },
            ),
            BasicDialogAction(
              title: Text("去设置"),
              onPressed: () {
                // 跳转到系统设置页
                AppSettings.openAppSettings();
              },
            ),
          ],
        ),
      );
    }

    //打开相册
    void _openAblum() {
      List selectedAssets = [];
      AssetPicker.pickAssets(
        context,
        pickerConfig: AssetPickerConfig(
          maxAssets: 1,
          selectedAssets: selectedAssets,
        ),
      ).then((imageList) {
        if(imageList == null){
          return;
        }
        imageList as List;
        for(int i = 0; i < imageList.length; i++){
          AssetEntity ae = imageList[i];
          ae.file.then((file) async {
            String resultFilePath = file?.path??"";
            _processVideoAndPicture(resultFilePath);
          });
        }
      });
    }

    //处理图片和小视频(相册、拍照)
    void _processVideoAndPicture(String resultFilePath) async {
    
      if(resultFilePath == null || "" == resultFilePath){
        return;
      }
    
      String messageId = UUID.getUUID();
    
      if(CommonUtils.isImage(resultFilePath)){
        //压缩图片完成再发送
        String compressImagePath = await CompressImageUtils.compressFile(fileName: resultFilePath);
        widget.sendMedialCallback(CommonUtils.CHAT_CONTENT_TYPE_IMG, compressImagePath,0 ,messageId);
        widget.refreshMediaCallback(CommonUtils.CHAT_CONTENT_TYPE_IMG, compressImagePath, "",0, messageId);
      } 
    

    }

    接收到消息:

    String serverImagePath = CommonUtils.BASE_URL_UPLOAD + content;
    String localImagePath = await FileUtils.getBaseFile("${DateUtil.getNowDateMs()}.jpg");
    //先下载图片
    await DownloadUtils.getInstance().downloadFile(serverImagePath, localImagePath);
    chatBean.imgPath = serverImagePath;
    chatBean.imgPathLocal = localImagePath;
    //通知栏提示
    NotificationUtils.getInstance().showNotification(chatBean);
    //插入本地数据库
    ChatRepository.getInstance().insertChat(chatBean);
    //EventBus刷新页面
    eventBus.emit(chatBean);

  • 相关阅读:
    数字孪生这10款超好用的软件,你用过几个?
    cannot find defineEmits(or defineProps) in ts的原因
    Jenkins+Docker+SVN实现SpringBoot项目半自动化部署
    C++游戏game | 井字棋游戏坤坤版(配资源+视频)【赋源码,双人对战】
    linux-进程调度schedule
    【软件测试】大学毕业后顶着压力,巧合的开启了我人生的新篇章......
    Qt——设置字体样式
    抖音播映量破500的原因找到了,不是内容不好,而是这5个功能
    【Django】执行查询——比较、删除、复制、批量修改对象
    Node.js编译失败怎么办?
  • 原文地址:https://blog.csdn.net/maoning20080808/article/details/128013065