Не удается сохранить изображение во внешнем хранилище в Android Oreo - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу сохранить изображение во внешнем хранилище. Моя функция работает на Android 5, но не работает на Android 8.

У меня есть android.permission.WRITE_EXTERNAL_STORAGE в манифесте.

private fun saveImageToExternalStorage(finalBitmap: Bitmap) {

         val root =
           Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString()
       val myDir = File("$root/saved_images_1")
       myDir.mkdirs()
       val generator = Random()
       var n = 10000
       n = generator.nextInt(n)
       val fName = "Image-$n.jpg"
       val file = File(myDir, fName)
       if (file.exists())
           file.delete()
       try {
           val out = FileOutputStream(file)
           finalBitmap.compress(Bitmap.CompressFormat.JPEG, 90, out)
           out.flush()
           out.close()
       } catch (e: Exception) {
           e.printStackTrace()
       }

       MediaScannerConnection.scanFile(this, arrayOf(file.toString()), null,
           object : MediaScannerConnection.OnScanCompletedListener {
               override fun onScanCompleted(path: String, uri: Uri) {
                   Log.i("ExternalStorage", "Scanned $path:")
                   Log.i("ExternalStorage", "-> uri=$uri")
               }
           })
   }

Хотел изменить его на context.contentResolver, но не могу :( Надеюсь, вы поможете!

1 Ответ

0 голосов
/ 03 октября 2019

В SDK версии выше 23 вам нужно добавить что-нибудь для доступа к URI. Расширьте класс приложения и внутри метода onCreate (), поместив код ниже,

    StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
    StrictMode.setVmPolicy(builder.build());
    if (Build.VERSION.SDK_INT > 23) {
        builder.detectFileUriExposure();
    }

И в Manifest.xml измените

 <application
    android:name=".YOUR_APPLICATION_CLASS"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Надеюсь, это решит вашу проблему.

...