从图库或相机返回后不调用 onActivityResult

问题描述

我需要打开相机或图库才能将照片上传到我的应用程序中,然后再使用它。问题是,调用 startActivityForResult() 后,当我拍照并单击 X 或 OK 按钮时,它会将我返回到我的应用程序,但根本没有调用 onActivityResult。它不工作的任何原因?因为这个机制就像 1 年前一样。我从其他项目中重用了它。唯一的区别是我在这个项目中使用了 Fragments。我为 onActivityResultMainActivity 实现了 Fragment 的覆盖,但是当我从画廊/相机回来时,这些方法都没有被调用

代码

图库:

private fun opengallery() {
    val intent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    fragment?.activity?.let{it.startActivityForResult(intent,galLERY_REQUEST_CODE)}?:kotlin.run{App.showToast("Internal Error")}
}

相机:

private fun openCamera() {
        val tempFile = createImageFile()
        photoPath = tempFile.absolutePath
        photoUri = FileProvider.getUriForFile(a,app.packageName + ".fileprovider",tempFile)

        val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        intent.putExtra(MediaStore.EXTRA_OUTPUT,photoUri)
        if (intent.resolveActivity(a.packageManager) != null) {
            fragment?.activity?.let{it.startActivityForResult(intent,CAMERA_REQUEST_CODE)}?:kotlin.run{App.showToast("Internal Error")}
        }
}

Fragment 和 MainActivity:

override fun onActivityResult(requestCode: Int,resultCode: Int,data: Intent?) {
        when(requestCode){
            CAMERA_REQUEST_CODE -> {
                maybeProcessphoto(requestCode,resultCode,data)
            }
            galLERY_REQUEST_CODE -> {
               maybeProcessphoto(requestCode,data)
            }
            else -> super.onActivityResult(requestCode,data)
        }
}

更新:

问题是我从 startActivityForResult 调用custom made class,这就像 Block 管理照片编辑一样。我刚刚在初始化时将 Fragment 对象发送到它的构造函数,并调用fragment?.startActivityForResult(),它没有向 onActivityResult 返回任何内容。我必须将函数作为参数发送到那里,并且在该函数中我必须调用 startActivityForResult。从我的角度来看,这完全相同,因为两个调用都在 Fragment 对象上,但看起来您可以从引用的 Fragment 打开新活动,但结果不会返回。您必须直接从 Fragment 本身调用 startActivityForResult 才能获得结果。

示例:

class CameraBlock(
        private val app: App,private val a: Activity,private val f: Fragment? = null,private val onIntent: (Intent,Int)->Unit
){


  private fun opengallery(){
     val intent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    //DOESNT WORK
    f?.let{it.startActivityForResult(intent,galLERY_REQUEST_CODE)}?:kotlin.run{App.showToast("Internal Error")}
    
    //THIS WORKS
    onIntent.invoke(intent,galLERY_REQUEST_CODE)
  }
}

片段:

override fun onCreateView(li: LayoutInflater,container: ViewGroup?,si: Bundle?): View? {
        return (li.inflate(R.layout.photo_select,container,false) as ViewGroup).apply {
            opengalleryButton = CameraBlock(
                    app = app,a = parentActivity,f = this@PhotoFragment,onIntent = ::openIntent
            )

        }
    }
 
private fun openIntent(int: Intent,code: Int){
        startActivityForResult(int,code)
    }

解决方法

TS2345: Argument of type '"retrieveSelection"' is not assignable to parameter of type '"prototype" | "routesAndHandlersMap" | "getRoutesAndHandlers" | "routesAndHandlers"'.

在片段中:

val intent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent,GALLERY_REQUEST_CODE)
,

你可以在没有父引用的情况下运行 onactivityresult 方法。在 OnActivityResult 方法中使用这段代码:

    super.onActivityResult(requestCode,resultCode,data);