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ı
相关产品推荐
相关产品推荐

