Android中使用Dexter库时INTERNET权限不弹出授权对话框问题
问题原因与解决方案
核心原因
Android将权限分为两类,这是导致你遇到该现象的关键:
- 正常权限(Normal Permissions):
INTERNET属于这类权限,只要在AndroidManifest.xml中声明,系统就会自动授予,不需要用户手动授权,也不会弹出授权对话框。 - 危险权限(Dangerous Permissions):
ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION属于这类权限,涉及用户隐私,必须通过动态申请触发用户授权弹窗。
所以你看到的INTERNET权限自动显示已授予、仅弹出位置权限对话框是完全正常的系统行为。
代码修正方案
你不需要在Dexter的权限检查列表中加入INTERNET,因为它无需动态校验。修改后的代码如下:
Dexter.withContext(this) .withPermissions( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION ) .withListener(object : MultiplePermissionsListener { override fun onPermissionsChecked(p0: MultiplePermissionsReport?) { p0?.let { if (p0.areAllPermissionsGranted()) { getWeather() getForecast() } } } override fun onPermissionRationaleShouldBeShown( p0: MutableList<PermissionRequest>?, p1: PermissionToken? ) { p1?.continuePermissionRequest() } }).check()
AndroidManifest.xml中的INTERNET权限声明保留即可,它会自动生效:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.INTERNET"/>
额外说明
如果需要确认INTERNET权限状态,可通过Context.checkSelfPermission(Manifest.permission.INTERNET)判断,只要Manifest中已声明,该方法永远返回PackageManager.PERMISSION_GRANTED。
内容的提问来源于stack exchange,提问作者Mohsen Mashkour
相关产品推荐
相关产品推荐

