【问题标题】:Type mismatch: inferred type is <no name provided> but Context was expected类型不匹配:推断类型为 <未提供名称> 但预期为 Context
【发布时间】:2021-03-02 16:34:23
【问题描述】:

我通过创建一个应用程序来通知您,我尝试验证它是否有权从片段中保存文件 this 但它在上下文 (this) 的声明中给我一个错误,错误消息为 Type不匹配:推断的类型是但预期的 Context。

衷心感谢任何帮助

我的代码

override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        downloadButton.setOnClickListener(object : View.OnClickListener {

            // here I would like to move to FormActivity
            override fun onClick(v: View?) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(
                            this,
                            android.Manifest.permission.WRITE_EXTERNAL_STORAGE
                        ) != PackageManager.PERMISSION_GRANTED
                    ) {
                        ActivityCompat.requestPermissions(
                            this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),
                            100
                        )

                    } else {
                        saveImageToStore()
                    }
                } else {
                    saveImageToStore()
                }
            }

        })
    }

override fun onRequestPermissionsResult(
        requestCode: Int,
        permissions: Array<out String>,
        grantResults: IntArray
    ) {
        if (requestCode == 100) {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                saveImageToStore()
            } else {
                Toast.makeText(this, "ASDASDA", Toast.LENGTH_SHORT).show()

            }
        }
    }

【问题讨论】:

    标签: android kotlin fragment


    【解决方案1】:

    使用requireContext() 代替this。片段不是上下文。您需要使用requireContext() 而不仅仅是context,因为context 是可以为空的Context?。在onActivityCreated() 函数中使用不可为空的requireContext() 是安全的。

    【讨论】:

      【解决方案2】:

      你需要更换:

      ContextCompat.checkSelfPermission(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE)

      ContextCompat.checkSelfPermission(requireContext(),android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
      

      ActivityCompat.requestPermissions(
          this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),100)  
      

      通过

       ActivityCompat.requestPermissions(
              requireActivity(), arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE),100)
      

      ContextCompat.checkSelfPermission() 需要上下文引用作为第一个参数,并且您正在使用“this”传递片段引用

      ActivityCompat.requestPermissions() 需要一个活动引用作为第一个参数,并且您也使用“this”传递一个片段引用

      您应该尝试使用registerForActivityResult(RequestPermission()) 在运行时请求权限的新方法 https://developer.android.com/training/permissions/requesting#request-permission

      【讨论】:

      • 您能否将答案标记为已接受?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 1970-01-01
      相关资源
      最近更新 更多