| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- package uts.sdk.modules.uniChooseSystemImage
- import android.content.ContentResolver
- import android.content.ContentUris
- import android.content.Context
- import android.database.Cursor
- import android.net.Uri
- import android.os.Build
- import android.os.Environment
- import android.provider.DocumentsContract
- import android.provider.MediaStore
- object FileUtils {
- fun getFilePathByUri(context: Context, uri: Uri): String? {
- var path: String? = null
- // 以 file:// 开头的
- if (ContentResolver.SCHEME_FILE == uri.scheme) {
- path = uri.path
- return path
- }
- // 以 content:// 开头的,比如 content://media/extenral/images/media/17766
- if (ContentResolver.SCHEME_CONTENT == uri.scheme && Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
- val cursor = context.contentResolver.query(
- uri,
- arrayOf(MediaStore.Images.Media.DATA),
- null,
- null,
- null
- )
- if (cursor != null) {
- if (cursor.moveToFirst()) {
- val columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA)
- if (columnIndex > -1) {
- path = cursor.getString(columnIndex)
- }
- }
- cursor.close()
- }
- return path
- }
- // 4.4及之后的 是以 content:// 开头的,比如 content://com.android.providers.media.documents/document/image%3A235700
- if (ContentResolver.SCHEME_CONTENT == uri.scheme && Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
- if (DocumentsContract.isDocumentUri(context, uri)) {
- if (isExternalStorageDocument(uri)) {
- // ExternalStorageProvider
- val docId = DocumentsContract.getDocumentId(uri)
- val split =
- docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
- val type = split[0]
- if ("primary".equals(type, ignoreCase = true)) {
- path = Environment.getExternalStorageDirectory().toString() + "/" + split[1]
- return path
- }
- } else if (isDownloadsDocument(uri)) {
- // DownloadsProvider
- val id = DocumentsContract.getDocumentId(uri)
- val contentUri = ContentUris.withAppendedId(
- Uri.parse("content://downloads/public_downloads"),
- id.toLong()
- )
- path = getDataColumn(context, contentUri, null, null)
- return path
- } else if (isMediaDocument(uri)) {
- // MediaProvider
- val docId = DocumentsContract.getDocumentId(uri)
- val split =
- docId.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
- val type = split[0]
- var contentUri: Uri? = null
- if ("image" == type) {
- contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI
- } else if ("video" == type) {
- contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI
- } else if ("audio" == type) {
- contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
- }
- val selection = "_id=?"
- val selectionArgs = arrayOf(split[1])
- path = getDataColumn(context, contentUri, selection, selectionArgs)
- return path
- }
- }
- }
- return null
- }
- private fun getDataColumn(
- context: Context,
- uri: Uri?,
- selection: String?,
- selectionArgs: Array<String>?,
- ): String? {
- var cursor: Cursor? = null
- val column = "_data"
- val projection = arrayOf(column)
- try {
- cursor =
- context.contentResolver.query(uri!!, projection, selection, selectionArgs, null)
- if (cursor != null && cursor.moveToFirst()) {
- val column_index = cursor.getColumnIndexOrThrow(column)
- return cursor.getString(column_index)
- }
- } finally {
- cursor?.close()
- }
- return null
- }
- private fun isExternalStorageDocument(uri: Uri): Boolean {
- return "com.android.externalstorage.documents" == uri.authority
- }
- private fun isDownloadsDocument(uri: Uri): Boolean {
- return "com.android.providers.downloads.documents" == uri.authority
- }
- private fun isMediaDocument(uri: Uri): Boolean {
- return "com.android.providers.media.documents" == uri.authority
- }
- }
|