Android11解决insert 插入数据库时,产生两条数据,与代码中返回的id不同,ContentResolver查询SD卡中特定的文件

用法:通过getContentResolver()得到ContentResolver对象
然后调用它的query(uri,projection, selection, selectionArgs, sortOrder)方法来查询,其实感觉和查询数据库操作差不多
首先uri代表你要查找文件的uri,
比如音频(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI)
视频(MediaStore.Video.Media.EXTERNAL_CONTENT_URI)
通讯录(ContactsContract.Contacts.CONTENT_URI)

原因:Android11公共存储为:Movies,如果想要存放的路径为:Pictures目录下的话,就会发生insert插入两条数据,原因是:Movies是公共的,而Pictures目录为私有的。

首先看下我之前直接insert插入时,数据库里生成两条数据的代码,生成insert后 如果进行update更新的话,直能治标不治本,更新的话,数据库里会生成一条,但是你会发现,insert后生成的uri的id与数据库的id不是一个id:
try {
int videoHeight = ZUKScreenRecorderUtils.getHeightOfVideo(mContext);
int videoWidth = ZUKScreenRecorderUtils.getWidthOfVideo(mContext);
ContentValues values = new ContentValues();
ContentResolver resolver = mContext.getContentResolver();
values.put(MediaStore.Video.VideoColumns.MIME_TYPE, “video/mp4”);
values.put(MediaStore.Video.VideoColumns.TITLE, videoName);
values.put(MediaStore.Video.VideoColumns.DISPLAY_NAME, videoName);
values.put(MediaStore.Video.VideoColumns.WIDTH, videoWidth);
values.put(MediaStore.Video.VideoColumns.HEIGHT, videoHeight);
values.put(MediaStore.Video.VideoColumns.DURATION, mScreenVideoTime);
values.put(MediaStore.Video.VideoColumns.SIZE, new File(videoPath).length());
values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis());
Uri external = resolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values);
//如果不update,查询数据库,会显示两条数据,一条数据是无效数据
mContext.getContentResolver().update(external, values, null, null);
//如果update,查询数据库是有一条数据,但是次数据的id与return的 “external” uri的id是不用的;
return external;
} catch (Exception e) {
Log.e(TAG, “insertScreenRecordToMediaStore failed”);
return null;
}

先拿查询指定路径下的视频为例,如果直接insert的话,数据库里会生成两条数据,两条数据的id不同,所以这块我不insert,直接扫描文件,然后生成的uri就是当前数据库里数据的uri,此时数据库里的数据的id,跟这个uri中的带有的id相同,如果这个时候要是点击这个视频,跳转到图库,则直接传入uri即可:

//延迟刷新
new Thread(new Runnable() {
public void run() {
Log.d(TAG, “stopMediaMuxerRunnable”);
try {
Thread.sleep(500);
} catch (Exception e) {
}
//扫描文件,扫描生成uri
MediaScannerConnection.scanFile(mContext, new String[]{savedFilePath}, null, new MediaScannerConnection.OnScanCompletedListener() {
@Override
public void onScanCompleted(String path, Uri uri) {
mInsertMediaVideoUri = uri;
insertScreenRecordToZUIMediaStore(uri, savedFilePath);
}
});

            try {
                Thread.sleep(300);
            } catch (Exception e) {
            }
            }

//根据生成的uri,跳转到图库。
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = null;
intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(mInsertMediaVideoUri, “video/mp4”);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}, 0);

以上代码可以生成一条数据,并且点击视频可以跳转到相应的图库或者文件内,

查询数据库:
Cursor cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI,
new String[] {
MediaStore.Video.Media.DATA,
MediaStore.Video.Media._ID,
MediaStore.Video.Media.MIME_TYPE,
MediaStore.Video.Media.RELATIVE_PATH
},
MediaStore.Video.Media.RELATIVE_PATH + “=?”, new String[]{“Pictures/screenrecorder/”}, null);

String string = cursor.getString(0);
String string1 = cursor.getString(1);
String string2 = cursor.getString(2);
String string3 = cursor.getString(3);

你可能感兴趣的:(ContentResolver,Android11,java,android)