Android P上
我们通过一下方式插入数据.
// uri: content://media/external/file initialValues 中 mediaType=1
mContext.getContentResolver().insert(uri, initialValues);
发现要插入的数据和插入之后数据库的数据不一致
mediaType=1 插入之后变成了mediaType=0, 导致新建相册里的图片无法显示.
目前分析是MediaProvide写死了FILES类型的meditType=0导致
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()