问题描述
我需要打开相机或图库才能将照片上传到我的应用程序中,然后再使用它。问题是,调用 startActivityForResult()
后,当我拍照并单击 X 或 OK 按钮时,它会将我返回到我的应用程序,但根本没有调用 onActivityResult
。它不工作的任何原因?因为这个机制就像 1 年前一样。我从其他项目中重用了它。唯一的区别是我在这个项目中使用了 Fragments
。我为 onActivityResult
和 MainActivity
实现了 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);