从 Gallery 或 Camera 返回后不调用 onActivityResult
onActivityResult is not called after returning from Gallery or Camera
我需要打开“相机”或“图库”将照片上传到我的应用程序,然后才能使用它。问题是调用 startActivityForResult()
后,当我拍照并单击 X 或 OK 按钮时,它会 return 我到我的应用程序,但根本没有调用 onActivityResult
。它不起作用的任何原因?因为这个机制就像 1 年前一样有效。我从其他项目中重用了它。唯一的区别是我在这个项目中使用 Fragments
。我为 MainActivity
和 Fragment
实现了 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);
我需要打开“相机”或“图库”将照片上传到我的应用程序,然后才能使用它。问题是调用 startActivityForResult()
后,当我拍照并单击 X 或 OK 按钮时,它会 return 我到我的应用程序,但根本没有调用 onActivityResult
。它不起作用的任何原因?因为这个机制就像 1 年前一样有效。我从其他项目中重用了它。唯一的区别是我在这个项目中使用 Fragments
。我为 MainActivity
和 Fragment
实现了 onActivityResult
的覆盖,但是当我从 Gallery/Camera.
代码:
图库:
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);