You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中startActivityForResult废弃问题替代方案(已解决)

图片选择上传功能实现说明
  • 更新后的项目地址:https://github.com/DoomedyDoomed/ShareSomePics

编辑说明

下述代码为onActivityResult()的旧版废弃用法,下方已附上修复后可正常运行的实现代码,可实现打开系统图库、选择图片、通过Bitmap存储图片并上传至数据库的完整功能,实现思路采用Android官方推荐的Activity Result API替代方案。

核心替代实现代码片段

fun openSomeActivityForResult() {
    val intent = Intent(this, SomeActivity::class.java)
    resultLauncher.launch(intent)
}

var resultLauncher = registerForActivityResult(StartActivityForResult()) { result ->
    if (result.resultCode == Activity.RESULT_OK) {
        // 无需再自定义requestCode
        val data: Intent? = result.data
        doSomeOperations()
    }
}

废弃的旧版实现代码

class SharePhotograph : AppCompatActivity() {

    private var pickedImage : Uri? = null
    private var pickedBitmap : Bitmap? = null
    private lateinit var storage : FirebaseStorage
    private lateinit var auth : FirebaseAuth
    private lateinit var database : FirebaseFirestore

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_share_photograph)

        val imageSelect = findViewById<ImageView>(R.id.imageView)
        val butShare = findViewById<Button>(R.id.butShare)
        val userCommentText = findViewById<TextView>(R.id.userCommentText)

        storage = FirebaseStorage.getInstance()
        auth = FirebaseAuth.getInstance()
        database = FirebaseFirestore.getInstance()

        imageSelect.setOnClickListener{
            pickImage()
        }

        butShare.setOnClickListener{
            //云存储处理逻辑
            //UUID -> 全局唯一标识符
            val uuid = UUID.randomUUID()
            val imageName = "${uuid}.jpg"

            val reference = storage.reference
            val imageReference = reference.child("images").child(imageName)

            if  (pickedImage != null){
                imageReference.putFile(pickedImage!!).addOnSuccessListener { taskSnapshot ->
                    val uploadedImageReference = FirebaseStorage.getInstance().reference.child("images").child(imageName)
                    uploadedImageReference.downloadUrl.addOnSuccessListener { uri ->
                        val downloadUrl = uri.toString()
                        val currentUserEmail = auth.currentUser!!.email.toString()
                        val userComment = userCommentText.text.toString()
                        val date = Timestamp.now()

                        //数据库写入逻辑
                        val postHashMap = hashMapOf<String, Any>()
                        postHashMap["Image URL"] = downloadUrl
                        postHashMap["User Email"] = currentUserEmail
                        postHashMap["User Comment"] = userComment
                        postHashMap["Post Date"] = date

                        database.collection("Post").add(postHashMap).addOnCompleteListener { task ->
                            if(task.isSuccessful){
                                Toast.makeText(this,"上传成功!",Toast.LENGTH_SHORT).show()
                                finish()
                            }
                        }.addOnFailureListener { exception ->
                            Toast.makeText(applicationContext,exception.localizedMessage,Toast.LENGTH_LONG).show()
                        }
                    }.addOnFailureListener { exception ->
                        Toast.makeText(applicationContext,exception.localizedMessage,Toast.LENGTH_LONG).show()
                    }
                }
            }
        }
    }

    private fun pickImage(){
        if(ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            //未获得存储权限,发起权限申请
            ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE),1)
        }else {
            //已有权限直接打开系统图库
            val galleryIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
            startActivityForResult(galleryIntent,2)
        }
    }

    override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    )   {
        if (requestCode == 1){
            if(grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED){
                val galleryIntent = Intent(Intent.ACTION_PICK,MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
                startActivityForResult(galleryIntent,2)
            }
        }

        super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    }
    
    @Deprecated("Deprecated in Java")
    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        if (requestCode == 2 && resultCode == Activity.RESULT_OK && data != null){

            pickedImage = data.data

            if (pickedImage != null){
                if (Build.VERSION.SDK_INT >= 28)
                {
                    val source = ImageDecoder.createSource(this.contentResolver,pickedImage!!)
                    pickedBitmap = ImageDecoder.decodeBitmap(source)
                    val imageSelect = findViewById<ImageView>(R.id.imageView)
                    imageSelect.setImageBitmap(pickedBitmap)
                }
                else
                {
                    pickedBitmap = MediaStore.Images.Media.getBitmap(this.contentResolver,pickedImage)
                    val imageSelect = findViewById<ImageView>(R.id.imageView)
                    imageSelect.setImageBitmap(pickedBitmap)
                }
            }
        }
        super.onActivityResult(requestCode, resultCode, data)
    }
}

内容的提问来源于stack exchange,提问作者Mecit Yazıcı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:24:14