| | |
| | | package com.runt.open.mvi.base |
| | | |
| | | import android.Manifest |
| | | import android.app.ActivityManager |
| | | import android.content.ContentResolver |
| | | import android.content.Context |
| | | import android.content.Intent |
| | | import android.content.pm.PackageManager |
| | | import android.net.Uri |
| | | import android.os.Build |
| | | import android.os.Bundle |
| | | import android.os.Environment |
| | | import android.provider.MediaStore |
| | | import android.provider.Settings |
| | | import android.text.TextUtils |
| | | import android.util.Log |
| | | import android.view.MotionEvent |
| | | import android.view.View |
| | | import android.view.WindowManager |
| | | import android.view.inputmethod.InputMethodManager |
| | | import android.webkit.MimeTypeMap |
| | | import android.widget.EditText |
| | | import android.widget.Toast |
| | | import androidx.activity.ComponentActivity |
| | |
| | | |
| | | val PARAMS_TITLE = "title" |
| | | |
| | | private var requestFileResult:Observer<List<String>>? = null; |
| | | |
| | | private var fileLauncher : ActivityResultLauncher<Intent>? = null //选择文件 |
| | | private var filePermissionLauncher : ActivityResultLauncher<Intent>? = null //文件权限 |
| | | private val fileUriList = mutableListOf<Uri>() |
| | | |
| | | override fun onCreate(savedInstanceState : Bundle?) { |
| | | super.onCreate(savedInstanceState) // get genericity "B" |
| | |
| | | init(); |
| | | //setContentView(mLayout) |
| | | setContent { |
| | | mLayout!!.layout() |
| | | mLayout!!.layoutFrame() |
| | | } |
| | | mContext = this |
| | | TAG = this.javaClass.simpleName |
| | |
| | | mViewModel!!.onCreate(this as BaseActivity<LayoutView<BaseViewModel> , BaseViewModel>) |
| | | loadData() //加载数据 |
| | | } |
| | | |
| | | abstract fun init() |
| | | |
| | | abstract fun initViews() |
| | | |
| | | abstract fun loadData() |
| | | |
| | | fun registerPermissionResult(){ |
| | | protected fun registerPermissionResult(){ |
| | | permissionsLauncher = this.registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { result -> |
| | | if (result == null || result.size === 0) { |
| | | permissionObserver !!.onChanged("") |
| | | return@registerForActivityResult |
| | | } |
| | | mViewModel!!.hidePopupWindow() |
| | | Log.d(TAG , "result:" + result + " size:" + result.size) |
| | | var allGranted = true |
| | | for (key in result.keys) { |
| | |
| | | permissionObserver !!.onChanged(com.google.gson.Gson().toJson(result.keys).replace("[" , "").replace("]" , "").replace("\"" , "")) |
| | | } |
| | | } |
| | | } |
| | | |
| | | protected fun registerFileResult(){ |
| | | |
| | | filePermissionLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> |
| | | Log.i(TAG,"filePermission ${result}") |
| | | onRequestFileResult(); |
| | | } |
| | | //选择文件 |
| | | fileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult() , object : ActivityResultCallback<ActivityResult?> { |
| | | override fun onActivityResult(result : ActivityResult?) { |
| | | Log.i(TAG,"fileLauncher ${result!!.data?.data}") |
| | | Log.i(TAG,"fileLauncher clipData= ${result!!.data?.clipData}") |
| | | fileUriList.clear(); |
| | | result!!.data?.data?.let{ |
| | | fileUriList.add(it); |
| | | } |
| | | result!!.data?.clipData?.let{ |
| | | val count = it.itemCount |
| | | for (i in 0 until count) { |
| | | fileUriList.add(it.getItemAt(i).uri) |
| | | } |
| | | } |
| | | if(fileUriList.size == 0){ |
| | | requestFileResult?.onChanged(ArrayList()) |
| | | }else{ |
| | | onRequestFileResult(); |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | private fun onRequestFileResult(){ |
| | | |
| | | val cR : ContentResolver = getContentResolver() |
| | | val mime = MimeTypeMap.getSingleton() |
| | | var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(0)!!); |
| | | //文件不存在或读写权限受限 |
| | | if(filePath == null){ |
| | | //android 11需要申请权限 //是否有所有问读写权限 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && ! Environment.isExternalStorageManager()) { |
| | | //跳转到打开权限页面 |
| | | var intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); |
| | | |
| | | intent.setData(Uri.parse("package:" + mContext!!.getPackageName())); |
| | | filePermissionLauncher!!.launch(intent) |
| | | return; |
| | | } |
| | | requestFileResult?.onChanged(ArrayList()) |
| | | }else{ |
| | | var filePathes = ArrayList<String>() |
| | | for (i in 0 until fileUriList.size) { |
| | | var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(i)!!); |
| | | filePathes.add(filePath!!) |
| | | } |
| | | requestFileResult?.onChanged(filePathes) |
| | | } |
| | | } |
| | | |
| | | fun requestFile(fileType :String,maxCount:Int = 1,fileResult:Observer<List<String>>){ |
| | | requestFileResult = fileResult; |
| | | var permissions = ""; |
| | | //android 13 权限申请细化类型 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { |
| | | permissions = fileType ; |
| | | //android 14 选择文件授权 |
| | | if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { |
| | | permissions+=","+ Manifest.permission.READ_MEDIA_VISUAL_USER_SELECTED; |
| | | } |
| | | }else{ |
| | | //读取权限 |
| | | permissions = Manifest.permission.READ_EXTERNAL_STORAGE ; |
| | | } |
| | | //申请权限 |
| | | requestPermissions(permissions , object :Observer<String>{ |
| | | override fun onChanged(value : String) { |
| | | if(!value.isEmpty()){ |
| | | var intent = Intent() |
| | | // intent.action = Intent.ACTION_PICK |
| | | // intent.action = Intent.ACTION_GET_CONTENT |
| | | |
| | | //intent.setType("image/*") |
| | | when(fileType){ |
| | | Manifest.permission.READ_MEDIA_VIDEO ->{ |
| | | intent.action = MediaStore.ACTION_PICK_IMAGES |
| | | intent.setType("video/*") // 设置文件类型,可以更具体如"application/pdf" |
| | | } |
| | | Manifest.permission.READ_MEDIA_AUDIO ->{ |
| | | intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI) |
| | | intent.setType("audio/*") // 设置文件类型,可以更具体如"application/pdf" |
| | | } |
| | | Manifest.permission.READ_MEDIA_IMAGES ->{ |
| | | intent.action = MediaStore.ACTION_PICK_IMAGES |
| | | intent.setType("image/*") // 设置文件类型,可以更具体如"application/pdf" |
| | | } |
| | | else -> {} |
| | | } |
| | | // 设置可多选 |
| | | intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, maxCount > 1); |
| | | if(maxCount > 1){ |
| | | //设置最大数量 |
| | | intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxCount); |
| | | } |
| | | fileLauncher!!.launch(intent) |
| | | }else{ |
| | | requestFileResult?.onChanged(ArrayList()) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | |
| | | fun registerForActivityResult(callback : ActivityResultCallback<ActivityResult>):ActivityResultLauncher<Intent>{ |
| | |
| | | allGranted = false |
| | | if (showPop) { |
| | | // TODO: |
| | | //showPermissionPopu(permission) |
| | | var title = "" |
| | | var message = ""; |
| | | if(permissions.contains(Manifest.permission.READ_EXTERNAL_STORAGE)){ |
| | | title = "申请文件读取权限"; |
| | | message = "通过文件读取权限后,可无障碍使用图片、音乐、视频并添加到直播的音视频流中" |
| | | }else if(permissions.contains(Manifest.permission.CAMERA)){ |
| | | title = "申请相机权限"; |
| | | message = "通过相机权限后,可将相机画面添加到直播画面流中" |
| | | }else if(permissions.contains(Manifest.permission.RECORD_AUDIO)){ |
| | | title = "申请话筒权限"; |
| | | message = "通过话筒权限后,可将话筒声音添加到直播声音流中" |
| | | }else if(permissions.contains(Manifest.permission.READ_MEDIA_IMAGES)){ |
| | | title = "申请图片和视频文件权限"; |
| | | message = "通过图片和视频文件权限后,可将图片和视频画面添加到直播画面流中" |
| | | }else if(permissions.contains(Manifest.permission.READ_MEDIA_VIDEO)){ |
| | | title = "申请图片和视频文件权限"; |
| | | message = "通过图片和视频文件权限后,可将图片和视频画面添加到直播画面流中" |
| | | }else if(permissions.contains(Manifest.permission.READ_MEDIA_AUDIO)){ |
| | | title = "申请音频文件权限"; |
| | | message = "通过音频文件权限后,可将音频文件的声音添加到直播声音流中" |
| | | }/*else if(permissions.contains(Manifest.permission.POST_NOTIFICATIONS)){ |
| | | title = "申请通知栏权限"; |
| | | message = "通过通知栏权限后,可开启后台服务,保证相机、话筒、截屏、扬声器等功能不被系统终止" |
| | | }*/ |
| | | if(!TextUtils.isEmpty(title)){ |
| | | mViewModel!!.showPopupWindow(title = title, message = message) |
| | | } |
| | | } |
| | | break |
| | | } |
| | |
| | | |
| | | var permissionsLauncher : ActivityResultLauncher<Array<String>>? = null //权限 |
| | | var permissionObserver : Observer<String>? = null //权限和文件请求回调 |
| | | |
| | | /** |
| | | * 统一权限申请 |
| | | */ |