content://media/external/images/media/296 不允许主目录;允许的目录是 [DCIM,图片]

问题描述

我试图在 android api level > 28 (Pie) 中重命名照片文件获取 java.lang.IllegalArgumentException:主目录 WhatsApp 不允许用于 content://media/external/images/media/296;允许的目录是 [DCIM,Pictures] 例外

下面是从存储中获取图像的代码

private fun getAllImages(): List<ImageModel>? {
    val allImagesUri = getExternalUriForImages()
    val columns = arrayOf(
            MediaStore.Images.Media._ID,MediaStore.Images.Media.disPLAY_NAME,MediaStore.Images.Media.DATE_ADDED,MediaStore.Images.Media.DATE_MODIFIED,MediaStore.Images.Media.HEIGHT,MediaStore.Images.Media.WIDTH)
    val cursor = application.contentResolver.query(allImagesUri,columns,null,null)
    return prepareImageModel(cursor)
}

private fun prepareImageModel(cursor: Cursor?):List<ImageModel>?{
    var images :MutableList<ImageModel>? = null
    if (cursor != null && cursor.count > 0) {
        images = mutablelistof()
        val idColumnIndex = cursor.getColumnIndex(MediaStore.Images.Media._ID)
        val nameIndex = cursor.getColumnIndex(MediaStore.Images.Media.disPLAY_NAME)
        val dateAddedindex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_ADDED)
        val dateModifiedindex = cursor.getColumnIndex(MediaStore.Images.Media.DATE_MODIFIED)

        for (i in 0 until cursor.count) {
            cursor.movetoPosition(i)
            val id = cursor.getLong(idColumnIndex)
            if (id != -1L) {
                val name = cursor.getString(nameIndex)
                val dateAdded = cursor.getString(dateAddedindex)
                val dateModified = cursor.getString(dateModifiedindex)
                val uri = ContentUris.withAppendedId(getExternalUriForImages(),id)
                val imageModel = ImageModel(id,name,dateAdded,dateModified,uri = uri)
                images.add(imageModel)
            }
        }
    }
    return images
}

fun getExternalUriForImages(): Uri {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
        MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL) else {
        MediaStore.Images.Media.EXTERNAL_CONTENT_URI
    }
}

data class ImageModel(var id: Long,var name: String?,var dateAdded: String? = "",var dateModified: String? = "",var resolution: String? = "",var uri: Uri)

下面是重命名文件代码

private fun renameFile(imageModel: ImageModel?) {
    if(imageModel != null){
        try {
            // When performing a single item update,prefer using the ID
            val selection = "${MediaStore.MediaColumns._ID} = ?"
            // By using selection + args we protect against improper escaping of // values.
            val selectionArgs = arrayOf(imageModel.id.toString())
            // Update an existing file.
            val contentValues = ContentValues().apply {
                put(MediaStore.MediaColumns.disPLAY_NAME,"New name ${System.currentTimeMillis()}")
            }

            // Use the individual song's URI to represent the collection that's
            // updated.
            val rowsUpdated = contentResolver.update(imageModel.uri,contentValues,selection,selectionArgs)
            Toast.makeText(this,if(rowsUpdated > 0) "Rename success" else "Rename Failed",Toast.LENGTH_SHORT).show()
        } catch (securityException: SecurityException) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                val recoverableSecurityException = securityException as?
                        RecoverableSecurityException ?:
                throw RuntimeException(securityException.message,securityException)
                val intentSender = recoverableSecurityException.userAction.actionIntent.intentSender
                intentSender?.let {
                    pendingImageModel = imageModel
                    startIntentSenderForResult(intentSender,REQUEST_RENAME_FILE,null)
                }
            } else {
                throw RuntimeException(securityException.message,securityException)
            }
        }
    }
}

AndroidManifest 文件

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:requestLegacyExternalStorage="true"
    android:theme="@style/Theme.SimplePhotoApp">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)