从 Gallery 或 Camera 返回后不调用 onActivityResult

onActivityResult is not called after returning from Gallery or Camera

我需要打开“相机”或“图库”将照片上传到我的应用程序,然后才能使用它。问题是调用 startActivityForResult() 后,当我拍照并单击 X 或 OK 按钮时,它会 return 我到我的应用程序,但根本没有调用 onActivityResult。它不起作用的任何原因?因为这个机制就像 1 年前一样有效。我从其他项目中重用了它。唯一的区别是我在这个项目中使用 Fragments。我为 MainActivityFragment 实现了 onActivityResult 的覆盖,但是当我从 Gallery/Camera.

回来时调用了这些方法中的 none

代码:

图库:

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")}
        }
}

片段和 MainActivity:

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

更新:

问题是我从 custom made class 调用了 startActivityForResult,这就像 Block 管理照片编辑。我只是在初始化时将 Fragment 对象发送给它的构造函数,并调用了 fragment?.startActivityForResult(),它没有 return 任何东西给 onActivityResult。我必须将函数作为参数发送到那里,并且在该函数中我必须调用 startActivityForResult。从我的角度来看,这完全相同,因为这两个调用都是针对 Fragment 对象的,但看起来您可以从引用的 Fragment 打开新的 activity,但结果不会 return。您必须直接从 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)
    }
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
startActivityForResult(intent, GALLERY_REQUEST_CODE)

片段中:

@Override
  public void onActivityResult(int requestCode, int resultCode, final Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
}

你可以 运行 onactivityresult 方法没有其父 reference.use OnActivityResult 方法中的这段代码:

    super.onActivityResult(requestCode, resultCode, data);