• Kotlin高仿微信-第29篇-朋友圈-发布作品(图片)


     Kotlin高仿微信-项目实践58篇详细讲解了各个功能点,包括:注册、登录、主页、单聊(文本、表情、语音、图片、小视频、视频通话、语音通话、红包、转账)、群聊、个人信息、朋友圈、支付服务、扫一扫、搜索好友、添加好友、开通VIP等众多功能。

    Kotlin高仿微信-项目实践58篇,点击查看详情

    效果图:

    实现代码:

    
    
    
        
    
    
            
    
            
    
            
    
            
    
            
    
    
        
    

    /**
     * Author : wangning
     * Email : maoning20080809@163.com
     * Date : 2022/5/24 14:13
     * Description : 发布朋友圈信息
     */
    class MomentsPublishFragment : BaseDataBindingFragment() {
    
        override fun getLayoutRes() = R.layout.wc_moments_publish
    
        var type : Int = CommonUtils.Moments.TYPE_PICTURE
        //多张图片
        var imageList = ArrayList()
        //小视频地址
        var videoFilePath = ""
        private var loadingUtils: BaseDialogUtils? = null
        private var navController: NavController? = null
    
        override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
            super.onViewCreated(view, savedInstanceState)
    
            navController = findNavController()
    
            super.builder().showRightButton().hideTitleContent().setOnRightItemClick(object : WcOnItemClickInterface{
                override fun onItemClick(obj: Any) {
                    if(!NetWorkUtils.isNetworkConnected()) {
                        ToastUtils.makeText(requireActivity(), BaseUtils.getString(R.string.wc_base_network_tip))
                        return
                    }
    
                    SoftInputUtils.hideSoftInput(moment_publish_content)
                    showLoadingDialog()
    
                    //点击右上角发表按钮
                    CoroutineScope(Dispatchers.IO).launch {
                        when(type){
                            CommonUtils.Moments.TYPE_PICTURE -> {
                                var result = UploadFileUtils.uploadImages(type, moment_publish_content.text.toString(), imageList)
                                publishResult(result)
                            }
                            CommonUtils.Moments.TYPE_VIDEO -> {
                                var result = UploadFileUtils.uploadVideo(type, moment_publish_content.text.toString(), videoFilePath)
                                publishResult(result)
                            }
                        }
                    }
                }
            })
    
            type = arguments?.get(CommonUtils.Moments.TYPE_NAME) as Int
            videoFilePath = arguments?.get(CommonUtils.Moments.TYPE_VIDEO_PATH).toString()
            var images = arguments?.get(CommonUtils.Moments.TYPE_IMAGE_PATH)
            TagUtils.d("朋友圈:${type}, ${videoFilePath} , ${images}")
            if(images != null && !"null".equals(images)){
                if(images is String){
                    imageList.add(images)
                } else {
                    imageList = images as ArrayList
                }
            }
    
            when(type){
                CommonUtils.Moments.TYPE_PICTURE -> showImage()
                CommonUtils.Moments.TYPE_VIDEO -> showVideo()
            }
    
        }
    
        //显示图片
        fun showImage(){
            moment_publish_video.visibility = View.GONE
            moment_publish_play.visibility = View.GONE
            moment_publish_recyclerview.visibility = View.VISIBLE
    
            var adapter = MomentsPublishAdapter(1, imageList, object : WcOnItemClickInterface{
                override fun onItemClick(obj: Any) {
                    var iamgeFilePath = obj as String
                    var bundle = bundleOf(CommonUtils.Moments.TYPE_NAME to type, CommonUtils.Moments.TYPE_IMAGE_PATH to iamgeFilePath)
                    Navigation.findNavController(moment_publish_recyclerview).navigate(R.id.action_publish_preview, bundle)
                }
            })
            var linearLayoutManager = GridLayoutManager(requireActivity() , 3)
            moment_publish_recyclerview.layoutManager = linearLayoutManager
            moment_publish_recyclerview.adapter = adapter
        }
    
        //显示小视频
        fun showVideo(){
            TagUtils.d("显示视频路径:$videoFilePath")
            moment_publish_video.visibility = View.VISIBLE
            moment_publish_play.visibility = View.VISIBLE
            moment_publish_recyclerview.visibility = View.GONE
            //var videoFilePath = "/mnt/sdcard/image/1.mp4"
            val retriever = MediaMetadataRetriever()
    
            var path :String? = videoFilePath
            val uri = Uri.parse(path)
            val scheme = uri.scheme
            if ("file" == scheme) {
                path = uri.getPath()
                TagUtils.d("显示视频路径path = :$path")
                retriever.setDataSource(path)
            } else {
                retriever.setDataSource(videoFilePath)
            }
            val bmp = retriever.getFrameAtTime(0, MediaMetadataRetriever.OPTION_CLOSEST_SYNC)
            moment_publish_video.setImageBitmap(bmp)
    
            moment_publish_video.setOnClickListener {
                var bundle = bundleOf(CommonUtils.Moments.TYPE_NAME to type, CommonUtils.Moments.TYPE_IMAGE_PATH to videoFilePath)
                Navigation.findNavController(it).navigate(R.id.action_publish_preview, bundle)
            }
    
        }
    
        //显示加载对话框
        private fun showLoadingDialog(){
            loadingUtils = BaseDialogUtils(requireActivity())
            loadingUtils!!.builder()
                .hideCancel()
                .hideConfirm()
                .setCancelable(true)
                .setOnLoadingClick(object : BaseDialogUtils.OnLoadingClick{
                    override fun onClickCancel() {
                        ToastUtils.makeText(requireActivity(), "对话框取消按钮")
                    }
    
                    override fun onClickConfirm() {
                        ToastUtils.makeText(requireActivity(), "对话框确定按钮")
                    }
                })
            loadingUtils?.show()
        }
    
        private fun publishResult(any: Any?){
            CoroutineScope(Dispatchers.Main).launch {
                dismissLoadingDialog()
                if(any == null){
                    ToastUtils.makeText(R.string.wc_publish_failure)
                    Navigation.findNavController(moment_publish_video).popBackStack()
                } else {
                    var momentsBean = any as MomentsBean
                    CoroutineScope(Dispatchers.IO).launch {
                        MomentsRepository.insertMomentLocal(momentsBean)
                        CoroutineScope(Dispatchers.Main).launch {
                            ToastUtils.makeText(R.string.wc_publish_success)
                            navController?.previousBackStackEntry?.savedStateHandle?.set(CommonUtils.Moments.PUBLISH_SUCCESS, true)
                            navController?.popBackStack()
                        }
                    }
                }
            }
        }
    
        //隐藏加载对话框
        private fun dismissLoadingDialog(){
            loadingUtils?.dismiss()
        }
    
    }
  • 相关阅读:
    Redis相关知识
    mysql数据库重启、登录mysql数据库、通过命令执行mysql的sql脚本等命令
    【Apache Spark 】第 10 章使用 MLlib 进行机器学习
    (ECCV-2022)GaitEdge:超越普通的端到端步态识别,提高实用性
    【数据结构】Java实现数据结构的前置知识,时间复杂度空间复杂度,泛型类的讲解
    基于 hugging face 预训练模型的实体识别智能标注方案:生成doccano要求json格式
    failed to create symbolic link ‘/usr/bin/mysql’: File exists
    SLAM从入门到精通(构建自己的slam包)
    如何编写一个拍卖的智能合约
    盲人辅助设备赋能视障人士,实时导航与避障打造无障碍生活
  • 原文地址:https://blog.csdn.net/maoning20080808/article/details/128122470