LocationManager.getProviders() 根据目标 API 级别返回空列表

问题描述

考虑下面的代码,我用它来准备读取位置。

LocationManager locationManager = (LocationManager) context.getSystemService (Context.LOCATION_SERVICE);
List<String> listProviders = locationManager.getProviders (true);

在 Android 清单中使用 <uses-sdk android:minSdkVersion="16" />代码可以完美运行。但是当我将 android:targetSdkVersion="23" 添加到这一行时,每次 listProviders 都是一个空列表。因此我无法访问位置提供程序。我做错了什么?

我已经在三星 galaxy S5 上进行了测试,即 Android 6.0.1(API 级别 23)。

解决方法

  1. 为请求代码声明一个 int 变量。

    Traceback (most recent call last): File "D:\xxxxx\all_the_program.py",line 163,in <module> if audio['TXXX:SERIES'].text[0] is None: File "D:\xxxxx\venv\lib\site-packages\mutagen\_util.py",line 537,in __getitem__ return self.__dict[key] Traceback (most recent call last): File "D:\xxxxx\all_the_program.py",in <module> if not audio['TXXX:SERIES'].text[0]: File "D:\xxxxxx\venv\lib\site-packages\mutagen\_util.py",in __getitem__ return self.__dict[key] KeyError: 'TXXX:SERIES'

  2. 使用您需要的权限名称声明一个字符串。

    private static final int REQUEST_CODE_PERMISSION = 2;

  3. 下一步 检查 onCreate 方法的运行时权限条件,

    String mPermission = Manifest.permission.ACCESS_FINE_LOCATION,
  1. 现在声明 onRequestPermissionsResult 方法来检查请求代码,

    try {
                 if (ActivityCompat.checkSelfPermission(this,mPermission)
                         != MockPackageManager.PERMISSION_GRANTED) {
    
                     ActivityCompat.requestPermissions(this,mPermission,REQUEST_CODE_PERMISSION);
    
                   // If any permission above not allowed by user,this condition will execute every time,else your else part will work
                 } 
             } catch (Exception e) {
                 e.printStackTrace();
             }
    

如果您声明了任何危险权限,并且您的应用安装在运行 Android 6.0(API 级别 23)或更高版本的设备上,则您必须在运行时按照the steps in this guide

请求危险权限