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

Posted

技术标签:

【中文标题】从图库或相机返回后不调用 onActivityResult【英文标题】:onActivityResult is not called after returning from Gallery or Camera 【发布时间】:2021-05-26 14:48:54 【问题描述】:

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

代码:

画廊:

private fun openGallery() 
    val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
    fragment?.activity?.letit.startActivityForResult(intent, 
    GALLERY_REQUEST_CODE)?:kotlin.runApp.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?.letit.startActivityForResult(intent, CAMERA_REQUEST_CODE)?:kotlin.runApp.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, resultCode, data)
            
            else -> super.onActivityResult(requestCode, resultCode, data)
        

更新:

问题是我从custom made class 调用startActivityForResult,这就像块管理照片编辑。我刚刚在初始化时将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?.letit.startActivityForResult(intent, 
    GALLERY_REQUEST_CODE)?:kotlin.runApp.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)
    

【问题讨论】:

您必须直接从活动而不是片段启动图库和相机的意图。要在您的片段和活动之间进行通信,您可以在活动实现的片段中使用接口。该界面包含两种方法,一种是打开相机,另一种是打开图库。 【参考方案1】:
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);

【讨论】:

试过了,还是一样。没有结果。 为我的更新添加了一些解释。那是奇怪的行为,但它有效【参考方案2】:

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

    super.onActivityResult(requestCode, resultCode, data);

【讨论】:

以上是关于从图库或相机返回后不调用 onActivityResult的主要内容,如果未能解决你的问题,请参考以下文章

Android 相机和图库

Android从图库或相机显示选项中选择图像

data.getData() 在 OnActvityResult 中返回 null,同时从相机和图库中获取/选择图片

Android:在捕获或从图库中挑选后裁剪图像

在 WebView 中从相机或图库上传图像

使用 Phonegap/Cordova 相机插件从相机或图库中选择照片