Я хочу сделать снимок из arsceneview и открыть в галерее, если пользователь хочет - PullRequest
0 голосов
/ 03 октября 2019

Я могу сделать снимок. Он сохраняется в галерее, но я не могу открыть его, когда пользователь нажимает кнопку.

Этот метод принимает изображение arsceneview.

private fun takePhoto() {

    val filename = File("100MilArvores/"+System.currentTimeMillis()+".png")
    Log.i("TESTE", "$filename")
    val view = arSceneView

    val bitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
    val handlerThread = HandlerThread("PixelCopier")
    handlerThread.start()
    var path: String? = null
    PixelCopy.request(view, bitmap, { copyResult ->
        if (copyResult == PixelCopy.SUCCESS) {
            try {
                Log.i("TESTE", "isHere")
                path = saveBitmapToDisk(bitmap, filename)
            } catch (e: IOException) {
                val toast = Toast.makeText(this@AugmentedRealityActivity, e.toString(),
                        Toast.LENGTH_LONG)
                toast.show()
                return@request
            }
            val photoURI = FileProvider.getUriForFile(this,
                    BuildConfig.APPLICATION_ID + ".provider", File(path!!))

            val intent = Intent(Intent.ACTION_VIEW, photoURI)
            intent.setDataAndType(photoURI, "images/*")
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            startActivity(intent)
            val snackbar = Snackbar.make(findViewById(android.R.id.content),
                    "Photo saved", Snackbar.LENGTH_LONG)
            snackbar.setAction("Open in Photos") { v ->

                val photoURI = FileProvider.getUriForFile(this,
                        BuildConfig.APPLICATION_ID + ".provider", File(path!!))

                val intent = Intent(Intent.ACTION_VIEW, photoURI)
                intent.setDataAndType(photoURI, "images/*")
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
                startActivity(intent)
            }
            snackbar.show()

        } else {
            val toast = Toast.makeText(this@AugmentedRealityActivity,
                    "Failed to copyPixels: $copyResult", Toast.LENGTH_LONG)
            toast.show()
        }
        handlerThread.quitSafely()
    }, Handler(handlerThread.looper))
}

Этот метод сохраняет изображения на диске. : I / TESTE: content: // media / external / images / media / 124157

private fun saveBitmapToDisk(bitmap: Bitmap, filename: File): String {
    val file = MediaStore.Images.Media.insertImage(contentResolver, bitmap, filename.absolutePath, "Image")
    Log.i("TESTE", "$file")
    return file
}

В этой части кода

val photoURI = FileProvider.getUriForFile(this,
                    BuildConfig.APPLICATION_ID + ".provider", File("storage/emulated/0/Pitures/*"))

            val intent = Intent(Intent.ACTION_VIEW, photoURI)
            intent.setDataAndType(photoURI, "images/*")
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
            startActivity(intent)

Я получаю эту ошибку

E/AndroidRuntime: FATAL EXCEPTION: PixelCopier
Process: br.com.cem_mil_arvores, PID: 4642
java.lang.IllegalArgumentException: Failed to find configured root that contains /content:/media/external/images/media/124158
    at androidx.core.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:744)
    at androidx.core.content.FileProvider.getUriForFile(FileProvider.java:418)
    at myPackageName.augmented_reality.activities.AugmentedRealityActivity$takePhoto$1.onPixelCopyFinished(AugmentedRealityActivity.kt:339)
    at android.view.PixelCopy$1.run(PixelCopy.java:191)
    at android.os.Handler.handleCallback(Handler.java:790)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:164)
    at android.os.HandlerThread.run(HandlerThread.java:65)

Как я передаю путь, по которому мое изображение должно быть открыто в намерении.

Я настроил тег провайдера в Manifest и provider_path.xml в ресурсах xml.

Вотссылка, где я получил часть кода. Метод TakePhoto

Есть ли кто-нибудь, кто может помочь мне решить эту проблему?

...