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

你可能感兴趣的:(其它,android,java,开发语言)