【问题标题】:Is using getExternalStoragePublicDirectory() below android 29 safe?使用低于 android 29 的 getExternalStoragePublicDirectory() 安全吗?
【发布时间】:2020-08-09 22:09:56
【问题描述】:

所以基本上我正在尝试将图像存储到手机存储中。为此,我编写了一个实用程序方法。 (folder是要创建的目录名)

public static void saveBitmapToGallery(Context context, Bitmap bitmap, String folder) {

        if (Build.VERSION.SDK_INT >= 29) {

            ContentValues contentValues = new ContentValues();

            contentValues.put(MediaStore.Images.Media.IS_PENDING, true);

            contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");

            contentValues.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis());

            contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, UUID.randomUUID() + ".jpg");

            contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + "/" + folder);

            Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);

            if (uri != null) {

                try {

                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, context.getContentResolver().openOutputStream(uri));

                    contentValues.put(MediaStore.Images.Media.IS_PENDING, false);

                    context.getContentResolver().update(uri, contentValues, null, null);

                } catch (FileNotFoundException e) {

                    e.printStackTrace();

                }

            }

        } else {

            // Is it safe to use deprecated method or there some alternative exist?

            File directory = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/" + folder);

            boolean isDirectoryExisted = directory.exists();

            if (!isDirectoryExisted) {

                isDirectoryExisted = directory.mkdir();

            }

            if (isDirectoryExisted) {

                File imageFile = new File(directory + "/" + UUID.randomUUID().toString() + ".jpg");

                try {

                    FileOutputStream fileOutputStream = new FileOutputStream(imageFile);

                    bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fileOutputStream);

                    fileOutputStream.flush();

                    fileOutputStream.close();

                } catch (Exception e) {

                    e.printStackTrace();

                }

                Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);

                mediaScanIntent.setData(Uri.fromFile(imageFile));

                context.sendBroadcast(mediaScanIntent);

            }

        }

    }

在上述场景中使用此方法 getExternalStoragePublicDirectory() 是否安全,因为它已被弃用。还是有其他替代方案存在?

【问题讨论】:

    标签: java android android-gallery


    【解决方案1】:

    从 API 级别 29 开始不推荐使用此方法。在旧设备上使用它是完全可以的,但要遵守外部存储的标准规则(例如,您需要 WRITE_EXTERNAL_STORAGE 权限,包括在 Android 上运行时请求它6.0)。

    【讨论】:

      猜你喜欢
      • 2015-12-26
      • 2021-01-24
      • 2019-10-21
      • 1970-01-01
      • 2016-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多