Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拍照时,MediaStore contentResolver.insert()创建副本而不是替换现有文件(Android Q:29)_Android_Android 10.0 - Fatal编程技术网

拍照时,MediaStore contentResolver.insert()创建副本而不是替换现有文件(Android Q:29)

拍照时,MediaStore contentResolver.insert()创建副本而不是替换现有文件(Android Q:29),android,android-10.0,Android,Android 10.0,我正在尝试使用以下代码保存从相机拍摄的图像: @RequiresApi(Build.VERSION_CODES.Q) private fun setImageUri(): Uri { val resolver = contentResolver val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, "house2.jpg") put

我正在尝试使用以下代码保存从相机拍摄的图像:

@RequiresApi(Build.VERSION_CODES.Q)
private fun setImageUri(): Uri {
    val resolver = contentResolver
    val contentValues = ContentValues().apply {
        put(MediaStore.MediaColumns.DISPLAY_NAME, "house2.jpg")
        put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
        put(MediaStore.MediaColumns.RELATIVE_PATH, "Pictures/OLArt")
    }

    imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)

    return imageUri!!
}
该函数首次运行良好。但是,当映像(house2.jpg)已经存在时,系统将创建另一个名为“house2(1.jpg)”、“house2(2.jpg”等文件(而不是替换旧文件)

我是否可以在contentValues中设置任何内容来强制冲突解决程序替换该文件,而不是创建其副本

以下是拍摄意图的代码

 Intent(MediaStore.ACTION_IMAGE_CAPTURE).also { takePictureIntent ->

     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, setImageUri()) //<- i paste in the imageUri here

     // Ensure that there's a camera activity to handle the intent
     takePictureIntent.resolveActivity(packageManager)?.also {

         startActivityForResult(takePictureIntent, 102)
     }
  }
Intent(MediaStore.ACTION\u IMAGE\u CAPTURE)。另外{takePictureContent->
takePictureContent.putExtra(MediaStore.EXTRA\u输出,setImageUri())/您尝试过使用吗


检查它是否在没有任何文件的情况下创建了一个新文件,如果它不起作用,则根据文件是否已创建,使用insert或update。

这是正确的预期行为。之所以会看到不同的计算后缀,可能是因为您正在将文件保存在同一文件夹中,因此Android必须创建一个唯一的名称以便允许文件存在于同一位置

该方法旨在创建始终新的记录。它返回的Uri始终是新插入的记录。但是,如果该文件保存在一个文件夹中,其中已经有另一个同名文件,则该文件名必须不同,Android将附加数值

如果希望替换现有记录,则必须首先找到其Uri,然后通过调用ContentResolver方法来使用它


如果您正在保存相机应用程序中的照片,则可以使用当前时间作为名称,包括毫秒,以确保其唯一性。

@commonware的评论有帮助

我们的想法是

  • 查询是否已存在带有解析器的文件。Query()
  • 如果是,则从光标中提取contentUri
  • 否则,请使用resolver.insert()
  • 创建查询选择时需要注意的一点是,MediaStore.MediaColumns.RELATIVE_路径需要终止“/”


    i、 e.“Pictures/OLArt/”Angel Koh的回答是正确的

    我只是用Java发布它:

    @RequiresApi(Build.VERSION_CODES.Q)
    public static Uri CheckIfUriExistOnPublicDirectory(Context c ,String[] projection, String selection){
    
        ContentResolver resolver = c.getContentResolver();
        Cursor cur = resolver.query(MediaStore.Downloads.EXTERNAL_CONTENT_URI, projection, selection , null, null);
    
        if (cur != null) {
    
            if(cur.getCount()>0){
    
                if (cur.moveToFirst()) {
                    String filePath = cur.getString(0);
                    long id = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.MediaColumns._ID));
                    String displayName = cur.getString(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME) );
                    String relativePath = cur.getString(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.RELATIVE_PATH) );
                    long z = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED) );
    
                    return imageUri = ContentUris.withAppendedId(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  id);
    
                } else {
                    // Uri was ok but no entry found.
                }
    
            }else{
                // content Uri was invalid or some other error occurred
            }
            cur.close();
        } else {
            // content Uri was invalid or some other error occurred
        }
    
        return null;
    }
    
    方法的定义和用法:

    String[] projection = {MediaStore.MediaColumns._ID,
                    MediaStore.MediaColumns.DISPLAY_NAME,
                    MediaStore.MediaColumns.RELATIVE_PATH,
                    MediaStore.MediaColumns.DATE_MODIFIED
            };
    
            String selection = MediaStore.MediaColumns.RELATIVE_PATH + "='" + Environment.DIRECTORY_DOWNLOADS + File.separator + folderName + File.separator + "' AND "
                    + MediaStore.MediaColumns.DISPLAY_NAME+"='" + fileName + "'";
    
            uri = CheckIfUriExistOnPublicDirectory(context,projection,selection);
            if(uri != null){
                // file already exist
            }else{
                // file not exist, insert
            }
    

    另见:上帝保佑你。
    @RequiresApi(Build.VERSION_CODES.Q)
    private fun setImageUriQ(): Uri {
    
        val resolver = contentResolver
    
        imageUri = getExistingImageUriOrNullQ() //try to retrieve existing uri (if any)
        if (imageUri == null) {
    
           //=========================
           // existing codes for resolver.insert
           //(SNIPPED)
           //=========================
        }
        return imageUri!!
    }
    
    @RequiresApi(Build.VERSION_CODES.Q)
    public static Uri CheckIfUriExistOnPublicDirectory(Context c ,String[] projection, String selection){
    
        ContentResolver resolver = c.getContentResolver();
        Cursor cur = resolver.query(MediaStore.Downloads.EXTERNAL_CONTENT_URI, projection, selection , null, null);
    
        if (cur != null) {
    
            if(cur.getCount()>0){
    
                if (cur.moveToFirst()) {
                    String filePath = cur.getString(0);
                    long id = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.MediaColumns._ID));
                    String displayName = cur.getString(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.DISPLAY_NAME) );
                    String relativePath = cur.getString(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.RELATIVE_PATH) );
                    long z = cur.getLong(cur.getColumnIndexOrThrow(MediaStore.MediaColumns.DATE_MODIFIED) );
    
                    return imageUri = ContentUris.withAppendedId(
                            MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  id);
    
                } else {
                    // Uri was ok but no entry found.
                }
    
            }else{
                // content Uri was invalid or some other error occurred
            }
            cur.close();
        } else {
            // content Uri was invalid or some other error occurred
        }
    
        return null;
    }
    
    String[] projection = {MediaStore.MediaColumns._ID,
                    MediaStore.MediaColumns.DISPLAY_NAME,
                    MediaStore.MediaColumns.RELATIVE_PATH,
                    MediaStore.MediaColumns.DATE_MODIFIED
            };
    
            String selection = MediaStore.MediaColumns.RELATIVE_PATH + "='" + Environment.DIRECTORY_DOWNLOADS + File.separator + folderName + File.separator + "' AND "
                    + MediaStore.MediaColumns.DISPLAY_NAME+"='" + fileName + "'";
    
            uri = CheckIfUriExistOnPublicDirectory(context,projection,selection);
            if(uri != null){
                // file already exist
            }else{
                // file not exist, insert
            }