我无法使用 RegisterActivityForResult 发送请求代码
Posted
技术标签:
【中文标题】我无法使用 RegisterActivityForResult 发送请求代码【英文标题】:I Can't send request code with RegisterActivityForResult 【发布时间】:2021-11-06 03:44:33 【问题描述】:我的应用程序的一个片段中有多个 ImageView。我希望用户为每个 imageView 选择一个图像。问题是,我不知道用户为哪个 ImageView 选择了图像。
我想如果我添加一个请求代码,我可以根据收到的代码解决这个问题。
我无法将请求代码添加到我用于让用户选择图像的方法中。
按下按钮时我会先进行权限检查,如果获得权限,我会打开图库。 :
// First ImageView onClick
bind.addQuestionImage.setOnClickListener
if (!checkPermission())
requestSinglePermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery()
// Second ImageView onClick
bind.addAnswerImage.setOnClickListener
if (!checkPermission())
requestSinglePermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery()
我的权限请求方法:
private fun checkPermission() = ContextCompat.checkSelfPermission(
requireContext(),
Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
我监听请求响应的方法:
private val requestSinglePermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()) isGranted ->
if (isGranted)
toaster("Permission Granted.")
else
toaster("Permission Denied.")
如果用户有权限,我会打开图库:
private fun openGallery()
val galleryIntent = Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
getContent.launch(galleryIntent)
我用这个方法获取内容:
// get content
private val getContent =
registerForActivityResult(ActivityResultContracts.StartActivityForResult())
val myUri : Uri? = it.data?.data
// Which ImageView is this incoming uri ?
我该如何解决这个问题?还是有更好的方法?
【问题讨论】:
【参考方案1】:如果你有两个ImageView,你必须创建两个registerForActivityResult
变量,因为没有请求代码
// First ImageView onClick
bind.addQuestionImage.setOnClickListener
if (!checkPermission())
firstPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery()
// Second ImageView onClick
bind.addAnswerImage.setOnClickListener
if (!checkPermission())
secondPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery()
和
private val firstPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()) isGranted ->
if (isGranted)
toaster("Permission Granted.")
else
toaster("Permission Denied.")
private val secondPermissionLauncher =
registerForActivityResult(
ActivityResultContracts.RequestPermission()) isGranted ->
if (isGranted)
toaster("Permission Granted.")
else
toaster("Permission Denied.")
【讨论】:
这对我有用,但我不知道这是否是最佳做法。【参考方案2】:您可以将所需的数据添加到 Intent,如下所示:
private fun openGallery(source: String)
val galleryIntent = Intent(Intent.ACTION_PICK,
MediaStore.Images.Media.EXTERNAL_CONTENT_URI).apply
putExtra(IMAGE_VIEW_SOURCE, source)
getContent.launch(galleryIntent)
然后阅读您的回复:
private val getContent =
registerForActivityResult(ActivityResultContracts.StartActivityForResult())
val intent : Intent? = it.data
val myUri : Uri? = intent?.data
val source = intent?.getStringExtra(IMAGE_VIEW_SOURCE)
source?.let
if(it == ANSWER_BUTTON)
//.. do stuff
else if(it == QUESTION_BUTTON)
//do other stuff
和你的调用代码:
// First ImageView onClick
bind.addQuestionImage.setOnClickListener
if (!checkPermission())
requestSinglePermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery(QUESTION_BUTTON)
// Second ImageView onClick
bind.addAnswerImage.setOnClickListener
if (!checkPermission())
requestSinglePermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE)
else openGallery(ANSWER_BUTTON)
当然QUESTION_BUTTON
、ANSWER_BUTTON
和IMAGE_VIEW_SOURCE
将是您定义的常量
【讨论】:
这不起作用。 IF/ELSE 块未触发。我也试过这个方法:/以上是关于我无法使用 RegisterActivityForResult 发送请求代码的主要内容,如果未能解决你的问题,请参考以下文章
我无法使用 phpunit 进行测试:无法打开文件“autoload.php”