背景描述:
Android P上
我們通過一下方式插入數據.
// uri: content://media/external/file initialValues 中 mediaType=1
mContext.getContentResolver().insert(uri, initialValues);
發現要插入的數據和插入之後數據庫的數據不一致
mediaType=1 插入之後變成了mediaType=0, 導致新建相冊裏的圖片無法顯示.
目前分析是MediaProvide寫死了FILES類型的meditType=0導致
MediaProvide代碼分析:
packages/providers/MediaProvider/src/com/android/providers/media/MediaProvider.java
Insert()中匹配uri得到match類型:
int match = URI_MATCHER.match(uri);
insertInternal()中根據match進行處理
3161 case FILES:
3162 rowId = insertFile(helper, uri, initialValues,
3163 FileColumns.MEDIA_TYPE_NONE, true, notifyRowIds);//這個常量是0
3164 if (rowId > 0) {
3165 newUri = Files.getContentUri(volumeName, rowId);
3166 }
3167 break;
insertFile()中
2699 if (mimeType != null) {
2700 values.put(FileColumns.MIME_TYPE, mimeType);
2701
2702 // If 'values' contained the media type, then the caller wants us
2703 // to use that exact type, so don't override it based on mimetype
2704 if (!values.containsKey(FileColumns.MEDIA_TYPE) && //這個的判斷導致mediaType異常, O的項目上沒有這個判斷,可以正常創建相冊. 從註釋上看 如果values中有mediaType 則不根據mimetype改變mediaType.
2705 mediaType == FileColumns.MEDIA_TYPE_NONE &&
2706 !MediaScanner.isNoMediaPath(path)) {
2707 int fileType = MediaFile.getFileTypeForMimeType(mimeType);
2708 if (MediaFile.isAudioFileType(fileType)) {
2709 mediaType = FileColumns.MEDIA_TYPE_AUDIO;
2710 } else if (MediaFile.isVideoFileType(fileType)) {
2711 mediaType = FileColumns.MEDIA_TYPE_VIDEO;
2712 } else if (MediaFile.isImageFileType(fileType)) {
2713 mediaType = FileColumns.MEDIA_TYPE_IMAGE;
2714 } else if (MediaFile.isPlayListFileType(fileType)) {
2715 mediaType = FileColumns.MEDIA_TYPE_PLAYLIST;
2716 }
2717 }
2718 }
2719 values.put(FileColumns.MEDIA_TYPE, mediaType); //但是這裏put的mediatype, put的值是傳入的常量FileColumns.MEDIA_TYPE_NONE 而不是values裏的mediaType值
解決方案:
1、插入之後查詢插入數據,發現數值不同,進行update操作更新mediaType
mContext.getContentResolver().update(uri, initialValues, userWhere, whereArgs);
2、針對P上加的判斷,去掉ContentValues中的MediaType值,讓它可以繞過P上新加的判斷
Uri newUri = null;
//使用uri插入數據, content://media/external/file
//mediaprovide中判斷了類型FILES的時候,寫死了MEDIA_TYPE=0,導致在P上新建相冊和圖片不顯示.
//可以刪除media_type類型,風險比較大 initialValues.remove(FileColumns.MEDIA_TYPE);
LOG.D("DEBUG", "[insert] " + uri);
newUri = mContext.getContentResolver().insert(uri, initialValues);
3、使用MediaType對應的uri操作MediaProvide,不要都使用
content://media/external/file
使用對應的uri,例如:
MediaStore.Images.Media.EXTERNAL_CONTENT_URI 圖片
或者直接調用系統api插入圖片
MediaStore.Images.Media.insertImage()