我需要将图像保存到camera文件夹,但是由于不建议使用Android Q getExternalStoragePublicDirectory,因此我以另一种方式进行操作。我所拥有的(此方法接收位图及其名称):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ContentResolver resolver = mContext.getContentResolver(); ContentValues cOntentValues= new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + IMAGES_FOLDER_NAME); Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); OutputStream fos = resolver.openOutputStream(imageUri); saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } else { String imagesDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM).toString() + File.separator + IMAGES_FOLDER_NAME; File file = new File(imagesDir); if (!file.exists()) { file.mkdir(); } File image = new File( imagesDir, name + ".png" ); final long fileHashCode = image.hashCode(); Logger.d(TAG, "saveImage, saving image file, hashCode = " + fileHashCode); FileOutputStream fos = new FileOutputStream(image); saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); }
这对于所有所需的OS版本都是完美的,但是它看起来不准确,我想找到一种更通用的方法。我尝试使用内容值或尝试一些与Q相似的方法,但是它不起作用。我在这里看到了很多问题,但是没有一个可以帮助我。
问题是如何针对低于Q的操作系统优化保存?
我能写的最通用的版本是:
private void saveImage(Bitmap bitmap, @NonNull String name) throws IOException { boolean saved; OutputStream fos; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { ContentResolver resolver = mContext.getContentResolver(); ContentValues cOntentValues= new ContentValues(); contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, name); contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/png"); contentValues.put(MediaStore.MediaColumns.RELATIVE_PATH, "DCIM/" + IMAGES_FOLDER_NAME); Uri imageUri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues); fos = resolver.openOutputStream(imageUri); } else { String imagesDir = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DCIM).toString() + File.separator + IMAGES_FOLDER_NAME; File file = new File(imagesDir); if (!file.exists()) { file.mkdir(); } File image = new File(imagesDir, name + ".png"); fos = new FileOutputStream(image) } saved = bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); }
如果您找到了更好的方法,请在此处发布,我将其标记为答案。