Android P90 MediaProvide插入文件不顯示圖片

背景描述:

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()

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章