有没有办法检查是否可以编写uri?因此,需要一种方法来检查文件是否存在,即使它是挂起的或不属于我的应用程序包名称?
如果你这样做:
Cursor cursor = resolver.query(mediaUri, Column, MediaStore.MediaColumns.DISPLAY_NAME + "=?", new String[]{fileFullName}, null);
问题是,如果该文件处于挂起状态或不属于您的程序包,则答案是该文件不存在。然后,如果您使用resolver.insert,它将失败,因为该文件存在,但处于挂起状态或其他原因。
如果您在查询中添加语法错误,您可以看到:
near ".": syntax error (code 1 SQLITE_ERROR): , while compiling: SELECT _id, _display_name FROM images WHERE ((owner_package_name IN ( 'xxxxx' )) AND (is_pending=0) AND (is_trashed=0) AND (volume_name IN ( 'external_primary' , '0ff0-0909' ))) AND (_display_name=.?)
因此,在引擎盖下,会自动添加((owner_package_name IN('xxxxx'((AND(is_pending=0(。
那么,我们如何检查我们想要创建的文件是否可用,而不需要在循环中插入,直到它没有失败?
ps:我创建了一个文件";文件.png";。然后,当我创建第二个时,用户可以决定覆盖或创建新的-->file(1(.png(在文件名中自动添加(1((
所以我有一个未知的可能的文件(xxx(.png我查询并找到最后一个加+1的数字。只要文件不挂起并且属于我的应用程序,它就可以工作。但是,由于该文件可能处于挂起状态,或者不属于我的包,所以它不是99.9%,我有最后一个文件,我需要循环并插入util it not failed。。。。
希望,我成功地让自己明白;(
因此开始解决方案:
添加并请求此权限:android.permission.READ_EXTERNAL_STORAGE
一旦您获得了权限,查询就不会自动添加到引擎盖下(owner_package_name IN('xxxxx'(,因此无论包是什么,您都会得到一个所有内容的列表。
但是仍然有添加到您的查询中(is_pending=0(。我仍然没有找到如何在挂起状态下进行查询,以检查可用的文件名。