从权限崩溃

Crash from Permission

提问人:Alperen Avan 提问时间:9/20/2023 最后编辑:JayAlperen Avan 更新时间:9/20/2023 访问量:19

问:

我正在尝试使用用户选择的库中的另一张图像更改 imageView 的权限。因此,我将 RecipesFragment 与 MainActivity 与 NavHostFragment 连接起来,但是当我尝试运行该应用程序时,它会崩溃并关闭。您可以看到代码,来自logcat的崩溃以及问题。(imageView2 的 onclick Id 是 chooseImage from xml)

class RecipesFragment : Fragment() {

    private lateinit var binding: FragmentRecipesBinding

    var choosenPicture : Uri? = null
    var choosenBitmap : Bitmap? = null


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    }

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

        binding = FragmentRecipesBinding.inflate(inflater, container, false)

        // Inflate the layout for this fragment
        return binding.root
    }

    fun chooseImage(view: View) {


        activity.let {

            if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
                //There is no permission already so we need to take permission
                requestPermissions(arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE), 1)
                //If it doesnt work use READ_EXTERNAL_STORAGE

            }else{
                //There is already permission so, there is no need to take permission again
                val galleryIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                startActivityForResult(galleryIntent,2)

            }

        }
    }

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

            if(grantResults.size > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                //We have permission now
                val galleryIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                startActivityForResult(galleryIntent,2)
            }
        }


        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }

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

        if(requestCode == 2 && resultCode == Activity.RESULT_OK && data != null){

            choosenPicture = data.data

        }

        try{

            context?.let {
                if(choosenPicture != null){
                    if(Build.VERSION.SDK_INT >= 28){
                        val source = ImageDecoder.createSource(it.contentResolver,choosenPicture!!)
                        choosenBitmap = ImageDecoder.decodeBitmap(source)
                        binding.imageView2.setImageBitmap(choosenBitmap)

                    }else{
                        choosenBitmap = MediaStore.Images.Media.getBitmap(it.contentResolver,choosenPicture)
                        binding.imageView2.setImageBitmap(choosenBitmap)
                    }
                }
            }
        }catch (e: Exception){
            e.printStackTrace()
        }

        super.onActivityResult(requestCode, resultCode, data)
    }

E 致命异常:主 进程:com.alperenavan.recipes,PID:9811 java.lang.IllegalStateException:在父级或上级上下文中找不到方法 chooseImage(View) 在视图类 androidx.appcompat.widget.AppCompatImageView 上定义的属性,ID 为“imageView2” 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.resolveMethod(AppCompatViewInflater.java:506) 在 androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:464) 在 android.view.View.performClick(View.java:7506) 在 android.view.View.performClickInternal(View.java:7483) 在 android.view.View.-$$Nest$mperformClickInternal(未知来源:0) 在 android.view.View$PerformClick.run(View.java:29334) 在 android.os.Handler.handleCallback(Handler.java:942) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7872) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)'

Problems

我试图制作一个 imageView,它可以在获得许可的情况下从用户照片库中更改,但是当我尝试获得许可并运行应用程序时,它崩溃了。

Android Kotlin android-fragments android-imageview android-permissions

评论

3赞 Omar Hezi 9/20/2023
我建议您在 Fragment 的 Kotlin 代码中使用 setOnClickListener,而不是在 xml 中设置点击侦听器,您将拥有更多控制权,可以访问视图,并且 xml 中的 onClick 无论如何都会在后台创建一个点击侦听器。
1赞 David Wasser 9/20/2023
查看 stackoverflow.com/questions/67944233/...
1赞 David Wasser 9/20/2023
我很确定它正试图在你的 ,而不是在你的 ,这就是它崩溃的原因。参见 stackoverflow.com/questions/4153517/...chooseImage()ActivityFragment

答: 暂无答案