[英]onCreate called after onActivityResult when I pick picture from gallery
[英]onActivityResult is not called after returning from Gallery or Camera
我需要打開相機或圖庫將照片上傳到我的應用程序中,然后使用它。 問題是在調用startActivityForResult()
之后,當我拍照並單擊 X 或 OK 按鈕時,它會將我返回到我的應用程序,但根本不會調用onActivityResult
。 它不工作的任何原因? 因為這個機制就像一年前一樣工作。 我從其他項目中重用了它。 唯一的區別是我在這個項目中使用了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
,這就像塊管理照片編輯。 我剛剛在初始化時將Fragment
object 發送到其構造函數並調用了fragment?.startActivityForResult()
,它沒有返回任何內容到onActivityResult
。 我不得不將 function 作為參數發送到那里,並且在那個 function 中我不得不調用startActivityForResult
。 從我的角度來看,這完全一樣,因為這兩個調用都是在 Fragment object 上進行的,但看起來您可以從引用的 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)
}
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 方法。在 OnActivityResult 方法中使用這段代碼:
super.onActivityResult(requestCode, resultCode, data);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.