我正在调用startActivityForResult并发现未调用onActivityResult

时间:2019-04-30 14:25:14

标签: android kotlin

我正在尝试从图库中选择图像,并将其应用于文本视图。

我已经调用了startActivityForResult()函数并重写了onActivityResult()函数,但是在测试中我发现没有调用onActivityResult()。这是什么原因?

它具有super.onActivityResult(requestCode,resultCode,data)


var intent: Intent = Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
               startActivityForResult(intent, IMG_RESULT)


            }


        }

    }


    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
//I made this toast to see if the program arrived to onActivityResult but it never showed
        Toast.makeText(this, "Success", Toast.LENGTH_SHORT).show()

        if (resultCode == Activity.RESULT_OK)
            if (data != null) {
                val contentURI = data!!.data
                try {

                    val bitmap = MediaStore.Images.Media.getBitmap(this.contentResolver, contentURI)
                    val path = saveImage(bitmap)
                    Toast.makeText(this@MainActivity, "Image Saved!", Toast.LENGTH_SHORT).show()
                    image_blank!!.setImageBitmap(bitmap)

                } catch (e: IOException) {
                    e.printStackTrace()
                    Toast.makeText(this@MainActivity, "Failed!", Toast.LENGTH_SHORT).show()
                }


            }


    }

    fun saveImage(myBitmap: Bitmap): String {

3 个答案:

答案 0 :(得分:0)

使用android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI时,不能保证用户会选择图像。

以下解决方案将限制用户选择图像,并且不指定要从哪个位置进行操作-用户可以自由导航并选择所需的内容。

 val intent = Intent(Intent.ACTION_GET_CONTENT)
 intent.type = "image/*"
 intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("image/jpeg", "image/png", "image/bmp"))
 startActivityForResult(intent, IMG_RESULT)

这种确切的解决方案适用于我的项目,对您来说也应该是开箱即用的。

答案 1 :(得分:0)

两种可能性:

    如果您的活动将noHistory设置为true,则永远不会调用
  1. onActivityResult。

    android:noHistory =“ true”

  

如果您的活动将noHistory设置为true,则永远不会调用此方法。   https://developer.android.com/reference/android/app/Activity.html#startActivityForResult

  1. 请求代码<0,将不会触发onActivityResult(找不到记录在任何地方,但是根据许多其他开发人员的评论)。
  

requestCode int:如果> = 0,则将在以下位置返回此代码   活动退出时的onActivityResult(),如   startActivityForResult(Intent,int)。

答案 2 :(得分:0)

如果要从startActivityForResult调用fragment,请确保父活动将传播结果。

在您的活动中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case A_REQUEST_CODE_USED_IN_YOUR_ACTIVITY:
            ...
            break;
        case ANOTHER_REQUEST_CODE_USED_IN_YOUR_ACTIVITY:
            ...
            break;
        default:
            // this will propagate the result to your Fragment
            super.onActivityResult(requestCode, resultCode, data);
    }
}

在您的片段中

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case IMG_RESULT:
            if (resultCode = RESULT_OK) {
                // put here your code
                ...
            }
            break;
        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}
相关问题