从图库或相机返回后不调用 onActivityResult
Posted
技术标签:
【中文标题】从图库或相机返回后不调用 onActivityResult【英文标题】:onActivityResult is not called after returning from Gallery or Camera 【发布时间】:2021-05-26 14:48:54 【问题描述】:我需要打开相机或图库将照片上传到我的应用程序中,然后使用它。问题是在调用startActivityForResult()
后,当我拍照并单击X 或确定按钮时,它会将我返回到我的应用程序,但根本没有调用onActivityResult
。它不工作的任何原因?因为这个机制就像一年前一样工作。我从其他项目中重用了它。唯一的区别是我在这个项目中使用了Fragments
。我为MainActivity
和Fragment
实现了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的主要内容,如果未能解决你的问题,请参考以下文章