Android 从Gallery或Camera返回后不会调用onActivityResult
我需要打开相机或图库将照片上传到我的应用程序中,然后使用它。问题是,在调用Android 从Gallery或Camera返回后不会调用onActivityResult,android,android-fragments,android-camera,android-gallery,android-camera-intent,Android,Android Fragments,Android Camera,Android Gallery,Android Camera Intent,我需要打开相机或图库将照片上传到我的应用程序中,然后使用它。问题是,在调用startActivityForResult()后,当我拍摄照片并单击X或“确定”按钮时,它会将我返回到我的应用程序,但根本不会调用ActivityResult。有什么原因不能工作吗?因为这个机制像一年前一样有效。我从其他项目中重复使用了它。唯一的区别是我在这个项目中使用了片段。我为main活动和Fragment实现了对活动结果的覆盖,但当我从画廊/摄像机回来时,这些方法都没有被调用 代码: 画廊: private fun
startActivityForResult()
后,当我拍摄照片并单击X或“确定”按钮时,它会将我返回到我的应用程序,但根本不会调用ActivityResult。有什么原因不能工作吗?因为这个机制像一年前一样有效。我从其他项目中重复使用了它。唯一的区别是我在这个项目中使用了片段。我为main活动
和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")}
}
}
片段和主要活动:
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)
}
}
更新:
问题是我从定制类
调用了startActivityForResult
,这类似于块管理照片编辑。我只是在初始化时将Fragment
对象发送给它的构造函数,并调用了Fragment?.startActivityForResult()
,它没有向activityresult
返回任何内容。我必须将函数作为参数发送到那里,在该函数中我必须调用startActivityForResult
。从我的观点来看,这是完全相同的,因为两个调用都是对片段对象的,但看起来您可以从引用的片段打开新活动,但结果不会返回。您必须直接从片段本身调用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)
}
片段:
@Override
public void onActivityResult(int requestCode, int resultCode, final Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
您可以在不使用其父引用的情况下运行onactivityresult方法。请在onactivityresult方法中使用以下代码:
super.onActivityResult(requestCode, resultCode, data);
您必须直接从活动中启动图库和相机的意图,而不是片段。要在片段和活动之间进行通信,可以在活动实现的片段中使用接口。此界面包含两种方法,一种用于打开相机,另一种用于打开多媒体资料。尝试了此方法,但仍然相同。没有结果。请查看我的编辑,它在Java中为我的更新添加了一些解释。这是一种奇怪的行为,但它是有效的
super.onActivityResult(requestCode, resultCode, data);