#android #kotlin
Вопрос:
Как startActivityForResult
уже упоминалось, я бы предпочел не использовать его для получения абсолютного пути к выбранному изображению из галереи.
Поэтому я попытался обойтись без него, как показано в приведенном ниже коде, однако это не работает. Что я делаю не так?
activity_main.xml
lt;?xml version="1.0" encoding="utf-8"?gt; lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:gravity="center_horizontal" tools:context=".MainActivity"gt; lt;de.hdodenhof.circleimageview.CircleImageView android:id="@ id/img_camera" android:layout_width="200dp" android:layout_height="200dp" android:layout_marginTop="30dp" android:layout_marginBottom="30dp" android:src="@drawable/camera"/gt; lt;TextView android:id="@ id/txt_path" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Path" android:layout_marginTop="30dp"/gt; lt;/LinearLayoutgt;
Основные характеристики.кт
package com.gearsrun.choosephotoapplication import android.content.Context import android.content.ContextWrapper import android.content.Intent import android.graphics.Bitmap import android.graphics.drawable.Drawable import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.provider.MediaStore import android.util.Log import androidx.activity.result.ActivityResultCallback import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.core.graphics.drawable.toBitmap import com.bumptech.glide.Glide import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.engine.DiskCacheStrategy import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.target.Target import com.gearsrun.choosephotoapplication.databinding.ActivityMainBinding import java.io.File import java.io.FileOutputStream import java.io.IOException import java.io.OutputStream import java.util.* class MainActivity : AppCompatActivity() { private lateinit var binding : ActivityMainBinding private var mImagePath = "" private lateinit var activityResultLauncher:ActivityResultLauncherlt;Intentgt; override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val getImage = registerForActivityResult( ActivityResultContracts.GetContent(), ActivityResultCallback { Glide.with(this) .load(it) .centerCrop() .diskCacheStrategy(DiskCacheStrategy.ALL) .listener(object : RequestListenerlt;Drawablegt;{ override fun onLoadFailed( e: GlideException?, model: Any?, target: Targetlt;Drawablegt;?, isFirstResource: Boolean ): Boolean { Log.e("TAG", "Error loading image", e) return false // important to return false so the error placeholder can be placed } override fun onResourceReady( resource: Drawable?, model: Any?, target: Targetlt;Drawablegt;?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { val bitmap: Bitmap = (resource?.toBitmap() ?: null) as Bitmap mImagePath = saveImageToInternalStorage(bitmap) binding.txtPath.text = mImagePath return false } }) } ) binding.imgCamera.setOnClickListener { getImage.launch("image/*") } } private fun saveImageToInternalStorage(bitmap: Bitmap): String { val wrapper = ContextWrapper(applicationContext) var file = wrapper.getDir(IMAGE_DIRECTORY, Context.MODE_PRIVATE) file = File(file,"${UUID.randomUUID()}.jpg") try{ val stream :OutputStream = FileOutputStream(file) bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream) stream.flush() stream.close() }catch (e:IOException){ e.printStackTrace() } return file.absolutePath } companion object { private const val IMAGE_DIRECTORY = "GearsRunImages" } }
Ответ №1:
Я считаю, что проблема возникла при реализации Glide
.
Glide использовался для загрузки изображения, я предполагаю imgCamera
, что он использовался для предварительного просмотра загруженного изображения. Поэтому нужно добавить into(binding.imgCamera)
в свою Glide
реализацию.
Итак, после загрузки изображения сработает onResourceReady()
воля, и ваша логика может работать там.
Я думаю, что обновление getImage
, как в следующем коде, может сработать
val getImage = registerForActivityResult( ActivityResultContracts.GetContent(), ActivityResultCallback { Glide.with(this) .load(it) .centerCrop() .diskCacheStrategy(DiskCacheStrategy.ALL) .listener(object : RequestListenerlt;Drawablegt;{ override fun onLoadFailed( e: GlideException?, model: Any?, target: Targetlt;Drawablegt;?, isFirstResource: Boolean ): Boolean { Log.e("TAG", "Error loading image", e) return false // important to return false so the error placeholder can be placed } override fun onResourceReady( resource: Drawable?, model: Any?, target: Targetlt;Drawablegt;?, dataSource: DataSource?, isFirstResource: Boolean ): Boolean { val bitmap: Bitmap = (resource?.toBitmap() ?: null) as Bitmap mImagePath = saveImageToInternalStorage(bitmap) binding.txtPath.text = mImagePath return false } }) .into(binding.imgCamera) } )
Комментарии:
1. Молодец ,мой друг !!! Большое вам спасибо !
2. Отлично! рад, что это помогло