簡體   English   中英

從圖庫或相機返回后不調用 onActivityResult

[英]onActivityResult is not called after returning from Gallery or Camera

我需要打開相機或圖庫將照片上傳到我的應用程序中,然后使用它。 問題是在調用startActivityForResult()之后,當我拍照並單擊 X 或 OK 按鈕時,它會將我返回到我的應用程序,但根本不會調用onActivityResult 它不工作的任何原因? 因為這個機制就像一年前一樣工作。 我從其他項目中重用了它。 唯一的區別是我在這個項目中使用了Fragments 我為MainActivityFragment實現了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM