我无法使用 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_BUTTONANSWER_BUTTONIMAGE_VIEW_SOURCE 将是您定义的常量

【讨论】:

这不起作用。 IF/ELSE 块未触发。我也试过这个方法:/

以上是关于我无法使用 RegisterActivityForResult 发送请求代码的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法使用 DirectInput 获取键盘?

为啥我无法使用 CAGradientLayer 的掩码

我无法使用 phpunit 进行测试:无法打开文件“autoload.php”

我无法使用本地 Mongodb 使用 Prisma 启动项目

我无法使用断点进行调试

无法使用 Maven 构建应用程序,我可以在本地运行代码,但无法在 heroku 上部署