提问人:Alperen Avan 提问时间:9/20/2023 最后编辑:JayAlperen Avan 更新时间:9/20/2023 访问量:19
从权限崩溃
Crash from Permission
问:
我正在尝试使用用户选择的库中的另一张图像更改 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)'
我试图制作一个 imageView,它可以在获得许可的情况下从用户照片库中更改,但是当我尝试获得许可并运行应用程序时,它崩溃了。
答: 暂无答案
评论
chooseImage()
Activity
Fragment