| | |
| | | |
| | | import android.Manifest |
| | | import android.app.ActivityManager |
| | | import android.app.UiModeManager |
| | | import android.content.ClipData |
| | | import android.content.ClipboardManager |
| | | import android.content.ContentResolver |
| | | import android.content.Context |
| | | import android.content.Intent |
| | | import android.content.pm.PackageManager |
| | | import android.content.res.Configuration |
| | | import android.net.Uri |
| | | import android.os.Build |
| | | import android.os.Bundle |
| | |
| | | import androidx.activity.result.ActivityResultLauncher |
| | | import androidx.activity.result.contract.ActivityResultContracts |
| | | import androidx.annotation.ColorRes |
| | | import androidx.annotation.StringDef |
| | | import androidx.annotation.StringRes |
| | | import androidx.core.content.ContextCompat |
| | | import androidx.lifecycle.Observer |
| | |
| | | import com.runt.open.mvi.R |
| | | import com.runt.open.mvi.base.model.BaseViewModel |
| | | import com.runt.open.mvi.base.model.ViewModelFactory |
| | | import com.runt.open.mvi.utils.FileUtils |
| | | import com.runt.open.mvi.utils.PreferencesUtils |
| | | import java.io.File |
| | | import java.lang.reflect.ParameterizedType |
| | |
| | | private var requestFileResult:Observer<List<String>>? = null; |
| | | |
| | | private var fileLauncher : ActivityResultLauncher<Intent>? = null //选择文件 |
| | | private var multipleFileLauncher : ActivityResultLauncher<Array<String>>? = null //选择文件 |
| | | private var filePermissionLauncher : ActivityResultLauncher<Intent>? = null //文件权限 |
| | | private val fileUriList = mutableListOf<Uri>() |
| | | |
| | |
| | | initViews() //初始化UI |
| | | mViewModel!!.onCreate(this as BaseActivity<LayoutView<BaseViewModel> , BaseViewModel>) |
| | | loadData() //加载数据 |
| | | } |
| | | |
| | | override fun onPause() { |
| | | super.onPause() |
| | | mViewModel!!.onPause() |
| | | Log.i(TAG , "onPause: ") |
| | | } |
| | | |
| | | override fun onResume() { |
| | | super.onResume() |
| | | mViewModel!!.onResume() |
| | | Log.i(TAG , "onResume: ") |
| | | } |
| | | |
| | | override fun onStart() { |
| | | super.onStart() |
| | | mViewModel!!.onStart() |
| | | Log.i(TAG , "onStart: ") |
| | | } |
| | | |
| | | override fun onStop() { |
| | | super.onStop() |
| | | mViewModel!!.onStop() |
| | | Log.i(TAG , "onStop: ") |
| | | } |
| | | |
| | | override fun onDestroy() { |
| | | super.onDestroy() |
| | | mViewModel!!.onDestroy() |
| | | Log.i(TAG , "onDestroy: ") |
| | | } |
| | | |
| | | abstract fun init() |
| | |
| | | Log.i(TAG,"filePermission ${result}") |
| | | onRequestFileResult(); |
| | | } |
| | | multipleFileLauncher = registerForActivityResult(ActivityResultContracts.OpenMultipleDocuments()) { uris -> |
| | | fileUriList.clear(); |
| | | fileUriList.addAll(uris); |
| | | Log.i(TAG,"multipleFileLauncher ${uris}") |
| | | if(fileUriList.size == 0){ |
| | | requestFileResult?.onChanged(ArrayList()) |
| | | }else{ |
| | | onRequestFileResult(); |
| | | } |
| | | } |
| | | |
| | | //选择文件 |
| | | fileLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult() , object : ActivityResultCallback<ActivityResult?> { |
| | | override fun onActivityResult(result : ActivityResult?) { |
| | |
| | | |
| | | val cR : ContentResolver = getContentResolver() |
| | | val mime = MimeTypeMap.getSingleton() |
| | | var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(0)!!); |
| | | var filePath = FileUtils.getFilePathFromUri(fileUriList.get(0)!!); |
| | | //文件不存在或读写权限受限 |
| | | if(filePath == null){ |
| | | //android 11需要申请权限 //是否有所有问读写权限 |
| | |
| | | }else{ |
| | | var filePathes = ArrayList<String>() |
| | | for (i in 0 until fileUriList.size) { |
| | | var filePath = mViewModel!!.getFilePathFromUri(fileUriList.get(i)!!); |
| | | var filePath = FileUtils.getFilePathFromUri(fileUriList.get(i)!!); |
| | | filePathes.add(filePath!!) |
| | | } |
| | | requestFileResult?.onChanged(filePathes) |
| | | } |
| | | } |
| | | |
| | | fun requestFile(fileType :String,maxCount:Int = 1,fileResult:Observer<List<String>>){ |
| | | @Retention(AnnotationRetention.SOURCE) |
| | | @StringDef(Manifest.permission.READ_MEDIA_VIDEO, Manifest.permission.READ_MEDIA_AUDIO, Manifest.permission.READ_MEDIA_IMAGES) |
| | | annotation class ManifestType |
| | | |
| | | fun requestFile(@ManifestType fileType :String,maxCount:Int = 1,fileResult:Observer<List<String>>){ |
| | | requestFileResult = fileResult; |
| | | var permissions = ""; |
| | | //android 13 权限申请细化类型 |
| | |
| | | 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 ->{ |
| | | Manifest.permission.READ_MEDIA_VIDEO,Manifest.permission.READ_MEDIA_IMAGES ->{ |
| | | var intent = Intent() |
| | | intent.action = MediaStore.ACTION_PICK_IMAGES |
| | | intent.setType("video/*") // 设置文件类型,可以更具体如"application/pdf" |
| | | var type = if(fileType == Manifest.permission.READ_MEDIA_VIDEO) "video/*" else "image/*" |
| | | intent.setType(type) // 设置文件类型,可以更具体如"application/pdf" |
| | | // 设置可多选 |
| | | intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, maxCount > 1); |
| | | if(maxCount > 1){ |
| | | //设置最大数量 |
| | | intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, maxCount); |
| | | } |
| | | fileLauncher!!.launch(intent) |
| | | } |
| | | 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" |
| | | var intent = Intent(Intent.ACTION_PICK, MediaStore.Audio.Media.EXTERNAL_CONTENT_URI) |
| | | fileLauncher!!.launch(intent) |
| | | //multipleFileLauncher!!.launch(arrayOf("audio/*" |
| | | // "audio/mp3", // MP3 |
| | | // "audio/m4a", // M4A |
| | | // "audio/aac", // AAC |
| | | // "audio/ogg", // OGG |
| | | // "audio/wav" // WAV |
| | | // )) |
| | | } |
| | | 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()) |
| | | } |
| | |
| | | return storePath + File.separator + fileName |
| | | } |
| | | |
| | | fun isTabletDevice(): Boolean { |
| | | val uiModeManager = getSystemService(Context.UI_MODE_SERVICE) as UiModeManager |
| | | return (uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION).not() && |
| | | (resources.configuration.screenLayout and Configuration.SCREENLAYOUT_SIZE_MASK >= Configuration.SCREENLAYOUT_SIZE_LARGE) |
| | | } |
| | | |
| | | //=========================================== |
| | | //以下为preferences操作 |
| | | fun getBooleanUserPrefrence(key : String) : Boolean { |