首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >android.permission.ACCESS_FINE_LOCATION还允许android.permission.ACCESS_COARSE_LOCATION

android.permission.ACCESS_FINE_LOCATION还允许android.permission.ACCESS_COARSE_LOCATION
EN

Stack Overflow用户
提问于 2022-10-24 23:24:36
回答 1查看 38关注 0票数 2

我正在测试摄像头和位置的android权限。令我惊讶的是,我了解到,当我访问好的位置时,系统也会允许粗定位。这是正常的吗?我第一次向Toasts查询以查看已批准的访问。当我只给予粗访问权时,它显示出精细位置权限被拒绝,这是正常的。但是当我访问精细的地址时,它也允许使用粗地址。这是正常的吗?

代码语言:javascript
运行
复制
class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private var cameraResultLauncher: ActivityResultLauncher<String> =
        registerForActivityResult(
        ActivityResultContracts.RequestPermission()){
            isGranted ->
            if (isGranted){
                Toast.makeText(this, "Permission granted", Toast.LENGTH_LONG).show()
            }else{
                Toast.makeText(this, "Permission denied", Toast.LENGTH_LONG).show()
            }
        }

    //This time we create the Activity result launcher of type Array<String>
    private var cameraAndLocationResultLauncher: ActivityResultLauncher<Array<String>> =
        registerForActivityResult(
            ActivityResultContracts.RequestMultiplePermissions()){
            permissions ->
            /**
            Here it returns a Map of permission name as key with boolean as value
            Loop through the map to get the value we need which is the boolean
            value
             */
            permissions.entries.forEach{
                val permissionName = it.key
                val isGranted = it.value
                println(permissionName)
                println(isGranted)
                if (isGranted){
                    if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION){
                        Toast.makeText(this, "Permission granted for fine location", Toast.LENGTH_LONG).show()

                    }else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION){
                        Toast.makeText(this, "Permission granted for coarse location", Toast.LENGTH_LONG).show()

                    }else{
                        Toast.makeText(this, "Permission granted for Camera", Toast.LENGTH_LONG).show()
                    }
                }else{
                    if (permissionName == Manifest.permission.ACCESS_FINE_LOCATION){
                        Toast.makeText(this, "Permission denied for fine location", Toast.LENGTH_LONG).show()

                    }else if(permissionName == Manifest.permission.ACCESS_COARSE_LOCATION){
                        Toast.makeText(this, "Permission denied for coarse location", Toast.LENGTH_LONG).show()

                    }else{
                        Toast.makeText(this, "Permission denied for Camera", Toast.LENGTH_LONG).show()
                    }
                }
            }
        }


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val btnCameraPermission: Button = binding.btnCameraPermission
        btnCameraPermission.setOnClickListener {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && shouldShowRequestPermissionRationale(
                    Manifest.permission.CAMERA)){
                showRationaleDialog("Permission Demo requires camera access", "Camera cannot be used because Camera access is denied")
            }else{
                // You can directly ask for the permission.
                // The registered ActivityResultCallback gets the result of this request.

//                cameraResultLauncher.launch(Manifest.permission.CAMERA)  this for only camera permission
                cameraAndLocationResultLauncher.launch(arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
            }
        }
    }

    private fun showRationaleDialog(
        title: String,
        message: String,
    ){
        val builder: AlertDialog.Builder = AlertDialog.Builder(this)
        builder.setTitle(title)
            .setMessage(message)
            .setPositiveButton("Cancel"){
                    dialog, _-> dialog.dismiss()
            }
        builder.create().show()
    }

}

I/System.out: android.permission.ACCESS_FINE_LOCATION
I/System.out: true
I/System.out: android.permission.ACCESS_COARSE_LOCATION
I/System.out: true
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 23:34:48

这是正常的吗?

是。大多数权限不是以这种方式设置的,但这对权限是这样设置的。毕竟,如果您可以测量几十米内的位置(ACCESS_FINE_LOCATION),那么根据定义,您可以测量更大半径(ACCESS_COARSE_LOCATION)内的位置。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74187738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档