ChooseSystemImageActivity.kt 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package uts.sdk.modules.uniChooseSystemImage
  2. import android.app.Activity
  3. import android.content.Intent
  4. import android.content.pm.ActivityInfo
  5. import android.graphics.Color
  6. import android.net.Uri
  7. import android.os.Build
  8. import android.os.Bundle
  9. import android.provider.MediaStore
  10. import android.text.TextUtils
  11. import android.view.WindowManager
  12. import android.widget.LinearLayout
  13. import androidx.activity.result.PickVisualMediaRequest
  14. import androidx.activity.result.contract.ActivityResultContracts
  15. import androidx.activity.result.contract.ActivityResultContracts.PickVisualMedia.VisualMediaType
  16. import androidx.fragment.app.FragmentActivity
  17. import java.util.Locale
  18. class ChooseSystemImageActivity : FragmentActivity() {
  19. override fun onCreate(savedInstanceState: Bundle?) {
  20. super.onCreate(savedInstanceState)
  21. setStatusBarTransparent(this)
  22. val layout = LinearLayout(this)
  23. layout.setBackgroundColor(Color.TRANSPARENT)
  24. setContentView(layout)
  25. if (intent.hasExtra("page_orientation")) {
  26. requestedOrientation =
  27. intent.getIntExtra("page_orientation", ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
  28. }
  29. val count = intent.getIntExtra("count", 9)
  30. val type = intent.getIntExtra("type", 1)
  31. val mediaType: VisualMediaType = when (type) {
  32. 1 -> {
  33. ActivityResultContracts.PickVisualMedia.ImageOnly
  34. }
  35. 2 -> {
  36. ActivityResultContracts.PickVisualMedia.VideoOnly
  37. }
  38. 3 -> {
  39. ActivityResultContracts.PickVisualMedia.ImageAndVideo
  40. }
  41. else -> {
  42. ActivityResultContracts.PickVisualMedia.ImageOnly
  43. }
  44. }
  45. val pickMultipleMedia = if (count == 1) {
  46. this.registerForActivityResult(ActivityResultContracts.PickVisualMedia()) { uri ->
  47. val intent = Intent()
  48. if (uri != null) {
  49. this.contentResolver.takePersistableUriPermission(
  50. uri,
  51. Intent.FLAG_GRANT_READ_URI_PERMISSION
  52. )
  53. var path = FileUtils.getFilePathByUri(this, uri)
  54. if (TextUtils.isEmpty(path)) {
  55. path = getFilePathFromUri(uri)
  56. }
  57. val mediaT = this.contentResolver.getType(uri)?.lowercase(Locale.ENGLISH)
  58. val m = Media(
  59. if (mediaT?.startsWith("video/") == true) {
  60. 2
  61. } else if (mediaT?.startsWith("image/") == true) {
  62. 1
  63. } else {
  64. 0
  65. }, path
  66. )
  67. intent.putExtra("paths", arrayOf(m))
  68. this.setResult(RESULT_OK, intent)
  69. this.finish()
  70. } else {
  71. this.setResult(RESULT_OK, intent)
  72. this.finish()
  73. }
  74. }
  75. } else
  76. this.registerForActivityResult(
  77. ActivityResultContracts.PickMultipleVisualMedia(count)
  78. ) { result ->
  79. val paths = mutableListOf<Media>()
  80. for (uri in result) {
  81. this.contentResolver.takePersistableUriPermission(
  82. uri,
  83. Intent.FLAG_GRANT_READ_URI_PERMISSION
  84. )
  85. var path = FileUtils.getFilePathByUri(this, uri)
  86. if (TextUtils.isEmpty(path)) {
  87. path = getFilePathFromUri(uri)
  88. }
  89. val mediaT = this.contentResolver.getType(uri)?.lowercase(Locale.ENGLISH)
  90. val m = Media(
  91. if (mediaT?.startsWith("video/") == true) {
  92. 2
  93. } else if (mediaT?.startsWith("image/") == true) {
  94. 1
  95. } else {
  96. 0
  97. }, path
  98. )
  99. paths.add(m)
  100. }
  101. val intent = Intent()
  102. intent.putExtra("paths", paths.toTypedArray())
  103. this.setResult(RESULT_OK, intent)
  104. this.finish()
  105. }
  106. pickMultipleMedia.launch(
  107. PickVisualMediaRequest.Builder()
  108. .setMediaType(mediaType)
  109. .build()
  110. )
  111. }
  112. private fun getFilePathFromUri(uri: Uri): String? {
  113. var filePath: String? = null
  114. if (uri.scheme == "file") {
  115. filePath = uri.path
  116. } else if (uri.scheme == "content") {
  117. val contentResolver = contentResolver
  118. val cursor =
  119. contentResolver.query(uri, arrayOf(MediaStore.Images.Media.DATA), null, null, null)
  120. if (cursor != null && cursor.moveToFirst()) {
  121. val columnIndex = cursor.getColumnIndex("_data")
  122. filePath = cursor.getString(columnIndex)
  123. cursor.close()
  124. }
  125. }
  126. return filePath
  127. }
  128. private fun setStatusBarTransparent(activity: Activity) {
  129. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
  130. val window = activity.window
  131. // 设置透明状态栏标志
  132. window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
  133. } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  134. window.clearFlags(
  135. WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
  136. or WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION
  137. )
  138. window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
  139. window.statusBarColor = Color.TRANSPARENT
  140. }
  141. }
  142. }