Растровый файл декодирования() по пути к файлу отображает пустое

#android #kotlin

Вопрос:

Я новичок в разработке Android с использованием Kotlin. Я пытаюсь практиковать загрузку изображения с мобильного телефона в свое приложение, используя некоторые методы, указанные в приведенном ниже коде. все работает просто отлично с некоторыми процессами, такими как я могу выбрать в окне просмотра изображений, а затем во всплывающем окне, которое позволяет мне выбрать изображение в моем телефоне. к сожалению, после выбора изображения оно отображается пустым/пустым, ничего не отображается в приложении. Я пытался обратиться за помощью, но у меня ничего не вышло. Надеюсь, я смогу помочь здесь. заранее спасибо!

Код деятельности

 package student

import android.content.Intent
import android.content.pm.PackageManager
import android.graphics.BitmapFactory
import android.os.Build
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Toast
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import com.example.amazontutoringcenter.databinding.ActivityMainBinding
import com.example.amazontutoringcenter.databinding.ActivityStudentClassroomBinding
import com.squareup.picasso.Picasso



class StudentClassroomActivity: AppCompatActivity() {

    private lateinit var binding: ActivityMainBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        val view = binding.root
        setContentView(view)

        binding.imageView.setOnClickListener {
            checkPermission()

        }

    }

    val READ_IMAGE:Int=338
    private fun checkPermission(){

        if(Build.VERSION.SDK_INT>=23){
            if(ActivityCompat.checkSelfPermission(this,
                    android.Manifest.permission.READ_EXTERNAL_STORAGE)!=
                PackageManager.PERMISSION_GRANTED){

                requestPermissions(arrayOf( android.Manifest.permission.READ_EXTERNAL_STORAGE),READ_IMAGE)
                return
            }
        }

        loadImage()
    }

    override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {

        when(requestCode){
            READ_IMAGE->{
                if(grantResults[0]==PackageManager.PERMISSION_GRANTED){
                    loadImage()
                }else{
                    Toast.makeText(applicationContext,"Cannot access your images",Toast.LENGTH_LONG).show()
                }
            }
            else-> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
        }


    }

    val PICK_IMAGE_CODE=123
    private fun loadImage(){

        var intent=Intent(Intent.ACTION_PICK,
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
        startActivityForResult(intent,PICK_IMAGE_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)

        if(requestCode==PICK_IMAGE_CODE  amp;amp; data!=null amp;amp; resultCode == RESULT_OK){

            val selectedImage=data.data
            val filePathColum= arrayOf(MediaStore.Images.Media.DATA)
            val cursor= contentResolver.query(selectedImage!!,filePathColum,null,null,null)
            cursor!!.moveToFirst()
            val coulomIndex=cursor!!.getColumnIndex(filePathColum[0])
            val picturePath=cursor!!.getString(coulomIndex)
            cursor!!.close()
            //.load(picturePath).into(binding.imageStudentProfile)
            //Picasso.get().load(picturePath).fit().into(binding.imageStudentProfile)
            binding.imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath))



        }

    }

} 

XML-файл

 <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    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"
    tools:context=".MainActivity">

    <TextView
        android:id="@ id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Test Layout"
        android:layout_marginTop="50dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <ImageView
        android:id="@ id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@ id/textView2"
        android:src="@drawable/ic_attendant"/>
</androidx.constraintlayout.widget.ConstraintLayout> 

Комментарии:

1. Удалите код, в onActivityResult() котором запрашивается MediaStore . Просто перейдите Uri в свою любимую библиотеку загрузки изображений (Glide, Coil, Picasso и т.д.).

2. Чувак, теперь это работает

Ответ №1:

В ImageView есть элемент для загрузки изображения из uri.

И у вас есть uri data.data .

Так что используй это.

Комментарии:

1. Я ничего не понял. не могли бы вы упростить еще больше, пожалуйста?

2. Что-то вроде ImageView.setImageUri(данные.данные).

3. Чувак, теперь это работает