kotlin 如何在android 13中访问运行时的后台位置权限?

4c8rllxm  于 2023-10-23  发布在  Kotlin
关注(0)|答案(2)|浏览(228)

如何在android 13中访问运行时的后台位置权限?
这是我的代码。它不显示任何弹出的访问权限从用户。Android新手

fun askForLocationPermission(
activity: BaseActivity,
permissionGranted: (() -> Unit),
permissionDenied: (() -> Unit)? = null
) {

Dexter.withContext(activity)
    .withPermissions(
        Manifest.permission.ACCESS_FINE_LOCATION
        Manifest.permission.ACCESS_BACKGROUND_LOCATION
    )
    .withListener(object : MultiplePermissionsListener {
        override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
            if (report != null) {
                if (report.areAllPermissionsGranted()) {
                    permissionGranted()
                } else {
                    permissionDenied?.invoke()
                }
            } else {
                permissionDenied?.invoke()
            }
        }

        override fun onPermissionRationaleShouldBeShown(
            permissions: MutableList<PermissionRequest>?,
            token: PermissionToken?
        ) {
            token?.continuePermissionRequest()
        }
    }).check()
}
xtupzzrd

xtupzzrd1#

在AndroidManifest.xml文件中声明了ACCESS_BACKGROUND_LOCATION权限。

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

然后

import android.Manifest
import android.app.Activity
import androidx.activity.result.contract.ActivityResultContracts
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat

fun askForLocationPermission(
    activity: Activity,
    permissionGranted: (() -> Unit),
    permissionDenied: (() -> Unit)? = null
) {
    val permissions = arrayOf(
        Manifest.permission.ACCESS_FINE_LOCATION,
        Manifest.permission.ACCESS_BACKGROUND_LOCATION
    )

    val requestPermissionLauncher =
        activity.registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->
            if (isGranted) {
                permissionGranted()
            } else {
                permissionDenied?.invoke()
            }
        }

    if (arePermissionsGranted(activity, permissions)) {
        // Permissions are already granted
        permissionGranted()
    } else {
        // Request permissions
        requestPermissionLauncher.launch(permissions)
    }
}

private fun arePermissionsGranted(activity: Activity, permissions: Array<String>): Boolean {
    return permissions.all {
        ContextCompat.checkSelfPermission(activity, it) == PackageManager.PERMISSION_GRANTED
    }
}
vtwuwzda

vtwuwzda2#

在manifest中,您可以这样声明

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

在Activity中,您必须调用manifest权限,如MAnifest.permissions

val locationPermission = Manifest.permission.ACCESS_FINE_LOCATION // or ACCESS_BACKGROUND_LOCATION
val granted = PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, locationPermission)

if (!granted) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    requestPermissions(arrayOf(locationPermission), YOUR_PERMISSION_REQUEST_CODE)
}
}

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
when (requestCode) {
    YOUR_PERMISSION_REQUEST_CODE -> {
        if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission granted, you can access location
        } else {
            // Permission denied, handle this situation
        }
    }
    else -> super.onRequestPermissionsResult(requestCode, permissions, grantResults)
}
}

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val backgroundPermission = Manifest.permission.ACCESS_BACKGROUND_LOCATION
val granted = PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, backgroundPermission)

if (!granted) {
    requestPermissions(arrayOf(backgroundPermission), YOUR_BACKGROUND_PERMISSION_REQUEST_CODE)
}
}

相关问题