Android MediaStore can't get inserted image da

2019-08-20 02:19发布

问题:

I have image editing app with image export function. Previously I tryed to export it directly by passing file path uri to ACTION_SEND intent. Something like:

Intent shareIntent = new Intent();
                shareIntent.setAction(Intent.ACTION_SEND);
                shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(file));
                shareIntent.setType("image/*");
                shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                startActivity(Intent.createChooser(shareIntent, getString(R.string.export)));

But not all apps can correctly parse such intent. So now I first prepare uri by adding image to android's MediaStore:

shareUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),
                            file.getAbsolutePath(), file.getName(), projectName));

...and then passing shareUri to intent. Now all apps can correctly process this intent, but one problem appear - each time when user exports image its copy added to android MediaStore(even if image path and name the same).

I trying to determine is image already added to mediastore by following code:

Cursor c = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, MediaStore.Images.Media.DATA + "=?",
                    new String[] { filePath }, null);
if (c.getCount() > 0 && c.moveToFirst()) {
  shareUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                        "" + c.getInt(c.getColumnIndex(MediaStore.Images.Media._ID)));
                c.close();
} else {
  shareUri = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),
                            file.getAbsolutePath(), file.getName(), projectName));
}

...but c.getCount() always == 0. Even if I copy saved uri from MediaStore.Images.Media.insertImage and query it directly by

Cursor c = getContentResolver().query(savedUri, null, null, null);

How I can detect is image file already in MediaStore?

回答1:

Found solution: not using MediaStore.Images.Media.insertImage to add file to gallery but doing similar by MediaScannerConnection:

MediaScannerConnection.scanFile(
                      getApplicationContext(), 
                      new String[]{file.getAbsolutePath()}, 
                      new String[]{"image/*"}, 
                      new OnScanCompletedListener() {
                         @Override
                         public void onScanCompleted(String path, Uri uri) {
                             Intent shareIntent = new Intent();
                            shareIntent.setAction(Intent.ACTION_SEND);
                            shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
                            shareIntent.setType("image/*");
                            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                            startActivity(Intent.createChooser(shareIntent, getString(R.string.export)));
                         }
                      });