首页 > 解决方案 > Kotlin - 互联网和位置权限问题

问题描述

我正在编写一个同时使用位置和互联网连接权限的 android 应用程序,我正在我的平板电脑上运行它。如您所见,我已将两者都包含在清单文件中。问题是,当在 MainActivity.kt 中调用 OnConnected() 函数时,如果计算结果true,我无法在函数中继续进行。如果不相关,您能否给我一些提示以提供更多代码

AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

MainActivity.kt

override fun onConnected(p0: Bundle?) {
    if(ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this,Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    {
        return;
    }
//some code 
}

标签: androidkotlinpermissionslocation

解决方案


从 Android 6.0 开始需要请求权限,最好的方法是创建一个权限管理器类来处理它,然后如果用户接受了权限,则检查您的活动:

 class PermissionManager private constructor() {

   fun checkPermission(
    activity: Activity,
    permissionRequests: Array<String>?,
    requestCode: Int
): Boolean {

    permissionRequests?.let {
        it.firstOrNull {
            ContextCompat.checkSelfPermission(
                activity,
                it
            ) != PackageManager.PERMISSION_GRANTED
        }?.apply {
            ActivityCompat.requestPermissions(
                activity,
                permissionRequests,
                requestCode
            )
            return false
        }
    }
    return true
}

companion object {
    val instance by lazy { PermissionManager() }
    const val CAMERA_PERMISSION = 1
}

}

然后在您的活动中检查权限结果:

   class MainActivity : AppCompatActivity() {
       override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_ar)
    //If the user has the permission accepted the next times
        if (PermissionManager.instance.checkPermission(
            this, arrayOf(
                Manifest.permission.CAMERA
            ), PermissionManager.CAMERA_PERMISSION
        )
        ) {
            initLogic()
        }
    }
    override fun onRequestPermissionsResult(
    requestCode: Int,
    permissions: Array<out String>,
    grantResults: IntArray
) {
    when (requestCode) {
        PermissionManager.CAMERA_PERMISSION -> {
            if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                initLogic()
            } else {
                return
            }
        }
    }
 }
}

推荐阅读