在调试时授予位置权限,但在 android 系统上未授予

Posted

技术标签:

【中文标题】在调试时授予位置权限,但在 android 系统上未授予【英文标题】:Permission for location is granted while debugging however not granted on android system 【发布时间】:2017-05-30 20:26:57 【问题描述】:

这是ACCESS_FINE_LOCATION权限检查的调试结果,表示ACCESS_FINE_LOCATION权限已经被授予

现在当我尝试使用定位服务时,我没有得到任何结果,所以我在调试后检查了android系统本身,发现在调试时已经授予权限后没有授予该位置的权限.

可能是什么问题?

【问题讨论】:

您在哪个版本的 Android 上进行测试? @Code-Apprentice 6.0.1 MMB29M 对话框是否出现请求权限? 附注您应该在此处复制并粘贴代码,而不是屏幕截图。 @Code-Apprentice no 【参考方案1】:

我过去在尝试向现有应用程序添加运行时权限时遇到了同样的问题(无法显示请求对话框......)。代码看起来不错,但无法在真实设备上获取对话框。

我的问题是我的目标 SDK 低于 Android 6.0(API 级别 23)。您需要至少定位 API 级别 23 才能使用运行时权限(在this article 的第一部分中指定)。

不确定您的问题是否相同,但我希望它可以帮助:)

【讨论】:

感谢您的回复,但我在遇到此问题时已经针对 API 级别 25 您是否也在清单文件中声明了它们?即使您使用运行时权限,这也是必需的【参考方案2】:

使用这个库https://github.com/ParkSangGwon/TedPermission

很有用!!!

【讨论】:

感谢您的回答,我已经找到了,但我正在尝试找出问题所在。【参考方案3】:

对于Android Version >= M,您必须同时询问Permission - ACCESS_FINE_LOCATION and ACCESS_COARSE_LOCATION 以获得定位服务。一般Runtime Permission求码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 

    if (ActivityCompat.checkSelfPermission
            (this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            &&
            ActivityCompat.checkSelfPermission
                    (this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
    
        requestPermissions(new String[]
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION
        , 1); // 1 is requestCode
        return;

    
    else
         //permission already granted enable your location here
    

处理请求:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) 
switch (requestCode) 

    case 1:
        if (grantResults[0] != PackageManager.PERMISSION_GRANTED)
            Toast.makeText(your_activity.this,"PERMISSION_DENIED",Toast.LENGTH_SHORT).show();
          
          else 
                Toast.makeText(your_activity.this,"PERMISSION_GRANTED",Toast.LENGTH_SHORT).show();
               // permission granted do something
          
       break;
   

【讨论】:

感谢您的回复,如您在第一张图片中看到的那样,对精细位置的权限检查意味着该位置已被授予权限,而该位置尚未在系统中,所以通过运行您的代码,我将运行 if 条件的第二部分“//已经授予的权限在此处启用您的位置”,这不会解决主要问题 如果说权限已授予但系统中没有,你必须检查你在onRequestPermissionsResult中处理的请求,可能是你没有正确处理。如果可能,更新有问题的代码。【参考方案4】:

我的问题已经解决了但是我仍然不知道问题出在哪里,如果有人知道请告诉我,解决方案是我使用了一个名为 https://github.com/hotchemi/PermissionsDispatcher 的库,它成功请求了权限,它也使用简化代码的注释。

【讨论】:

以上是关于在调试时授予位置权限,但在 android 系统上未授予的主要内容,如果未能解决你的问题,请参考以下文章

如何调试Android App以授予特权权限?

如何调试/重置 Android 6.0 权限?

Android 11后台位置权限“仅在使用应用程序时允许”不授予权限

在我的 PostGres 表上授予所有权限,但在尝试插入/选择时仍然收到“权限被拒绝”错误

Android Gradle Plugin 4.1.0 自动授予位置权限

关于Android6.0权限的学习