如何正确使用registerForActivityResult?获取"LifecycleOwners必须在启动前调用注册表“

如何正确使用registerForActivityResult?获取

我使用registerForActivityResult就像这样:

代码语言:javascript复制package com.example.livedata

import android.Manifest

import android.app.Activity

import android.app.AlertDialog

import android.app.Dialog

import android.content.ActivityNotFoundException

import android.content.Intent

import android.graphics.Bitmap

import android.net.Uri

import android.os.Bundle

import android.provider.Settings

import android.view.View

import android.widget.Toast

import androidx.activity.result.contract.ActivityResultContracts

import androidx.appcompat.app.AppCompatActivity

import com.example.livedata.databinding.ActivityAddBinding

import com.example.livedata.databinding.DialogCustomImageSelectionBinding

class AddActivity : AppCompatActivity(), View.OnClickListener {

private lateinit var binding: ActivityAddBinding

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

binding = ActivityAddBinding.inflate(layoutInflater)

setContentView(binding.root)

setupActionBar()

binding.photoAdd.setOnClickListener(this)

}

private fun setupActionBar() {

setSupportActionBar(binding.toolbar)

supportActionBar?.setDisplayHomeAsUpEnabled(true)

binding.toolbar.setNavigationOnClickListener { onBackPressed() }

}

override fun onClick(v: View?) {

if (v != null) {

when (v.id) {

R.id.photo_add -> {

imageDialog()

return

}

}

}

}

private fun imageDialog() {

val dialog = Dialog(this)

val dialogBinding: DialogCustomImageSelectionBinding =

DialogCustomImageSelectionBinding.inflate(layoutInflater)

dialog.setContentView(dialogBinding.root)

dialog.show()

dialogBinding.impCamera.setOnClickListener {

registerForActivityResult(ActivityResultContracts.TakePicturePreview()) {

if (it != null) {

Toast.makeText(this@AddActivity, "TakePicturePreview", Toast.LENGTH_SHORT).show()

}

}.launch(null).apply { arrayOf(

Manifest.permission.READ_EXTERNAL_STORAGE,

Manifest.permission.WRITE_EXTERNAL_STORAGE,

Manifest.permission.CAMERA) }

dialog.dismiss()

}

}

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

super.onActivityResult(requestCode, resultCode, data)

if (requestCode == 1 && resultCode == Activity.RESULT_OK) {

data?.let {

val bp = data.getParcelableExtra("data")

binding.imageView.setImageBitmap(bp)

}

}

}

private fun showPermissions() {

AlertDialog.Builder(this).setMessage("Applay Permissions!")

.setPositiveButton("Go to Settings") { _, _ ->

try {

val intel = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)

val uri = Uri.fromParts("package", packageName, null)

intel.data = uri

startActivity(intel)

} catch (e: ActivityNotFoundException) {

e.printStackTrace()

}

}.setNegativeButton("Cancel") { dialog, _ ->

dialog.dismiss()

}.show()

}

}但是它不能工作并在这里抛出一个异常:

代码语言:javascript复制2021-07-16 15:38:50.472 29885-29885/com.example.livedata E/AndroidRuntime: FATAL EXCEPTION: main

Process: com.example.livedata, PID: 29885

java.lang.IllegalStateException: LifecycleOwner com.example.livedata.AddActivity@9fc53b9 is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED.

at androidx.activity.result.ActivityResultRegistry.register(ActivityResultRegistry.java:123)

at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:659)

at androidx.activity.ComponentActivity.registerForActivityResult(ComponentActivity.java:668)

at com.example.livedata.AddActivity.imageDialog$lambda-3(AddActivity.kt:68)

at com.example.livedata.AddActivity.lambda$N7K_EbTML-ycmUwpA7-i8b_L-Sw(Unknown Source:0)

at com.example.livedata.-$$Lambda$AddActivity$N7K_EbTML-ycmUwpA7-i8b_L-Sw.onClick(Unknown Source:4)

at android.view.View.performClick(View.java:7281)

at android.view.View.performClickInternal(View.java:7255)

at android.view.View.access$3600(View.java:828)

at android.view.View$PerformClick.run(View.java:27925)

at android.os.Handler.handleCallback(Handler.java:900)

at android.os.Handler.dispatchMessage(Handler.java:103)

at android.os.Looper.loop(Looper.java:219)

at android.app.ActivityThread.main(ActivityThread.java:8393)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)

2021-07-16 15:38:50.539 1689-2062/? E/InputDispatcher: channel 'ba7a009 com.example.livedata/com.example.livedata.AddActivity (server)' ~ Channel is unrecoverably broken and will be disposed!如何使用registerForActivityResult而不是过时的方法来完成此任务?所有的帮助都非常感谢。

相关推荐

2019冠状病毒病(COVID
365etb为什么关闭账号

2019冠状病毒病(COVID

📅 09-13 👁️ 7404
Merit SureCross™ 支持导管
365bet手机版APP下载

Merit SureCross™ 支持导管

📅 01-06 👁️ 5713
淘宝模特招聘在哪里找
365篮球直播吧App

淘宝模特招聘在哪里找

📅 09-23 👁️ 1876
什么什么舞爪的成语
365bet手机版APP下载

什么什么舞爪的成语

📅 09-28 👁️ 1358
身份证号码输入指南:正确填写与留空选项全面解析
365bet手机版APP下载

身份证号码输入指南:正确填写与留空选项全面解析

📅 08-17 👁️ 5668
手机测温度的方法和注意事项
365etb为什么关闭账号

手机测温度的方法和注意事项

📅 11-10 👁️ 4623
如何在 Windows 11 中轻松创建本地网络
365etb为什么关闭账号

如何在 Windows 11 中轻松创建本地网络

📅 10-10 👁️ 5523
中国移动流量转赠步骤,流量用不完如何转赠
365篮球直播吧App

中国移动流量转赠步骤,流量用不完如何转赠

📅 10-08 👁️ 6216