【问题标题】:How to resolve the location permission error for Apps on Huawei device?如何解决华为设备上的应用程序位置权限错误?
【发布时间】:2021-03-13 21:14:23
【问题描述】:

我的华为手机上的华为 HMS 核心没有默认权限,我正在使用 HMS 定位工具包编写我的应用程序,并且总是收到定位工具包的权限错误。我按照他们的开发指南在 Manifest 文件中设置了位置权限。

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

并遵循他们的代码示例:

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
    Log.i(TAG, "sdk < 28 Q");
    if (ActivityCompat.checkSelfPermission(this,
        Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        || ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        String[] strings =
            {Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
        ActivityCompat.requestPermissions(this, strings, 1);
    }
} else {
    if (ActivityCompat.checkSelfPermission(this,
        Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
        || ActivityCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
        || ActivityCompat.checkSelfPermission(this,
            "android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
        String[] strings = {android.Manifest.permission.ACCESS_FINE_LOCATION,
            android.Manifest.permission.ACCESS_COARSE_LOCATION,
            "android.permission.ACCESS_BACKGROUND_LOCATION"};
        ActivityCompat.requestPermissions(this, strings, 2);
    }
}

有什么建议吗?

【问题讨论】:

    标签: geolocation huawei-mobile-services huawei-location-kit


    【解决方案1】:
    1. 必须始终允许 HMS 权限。否则会报错。

      确保已将位置权限分配给 HMS Core (APK)。为此,请转到设置 > 应用程序 > 应用程序并找到HMS Core。 (菜单路径可能因操作系统版本而异。如果没有找到HMS Core,请点击应用程序右上角的菜单图标,然后点击显示系统进程。)然后,点击 HMS Core (APK) 图标,转到应用信息 > 权限 > 位置,并验证位置权限是否已分配给 HMS Core。在运行 EMUI 10.0 或更高版本的设备上,对于 HMS CoreLocation 必须设置为 Always

    1. 确保下拉通知栏中的位置信息开关已打开。

    2. 模拟位置需要模拟权限。否则会报error权限错误。

    1. 检查您的应用是否启用了位置权限。

    【讨论】:

      【解决方案2】:

      Shirley 的回答涵盖了 HMS 定位权限的设备端。为覆盖所有EMUI版本较低且HMS Core默认没有定位权限的用户的此类场景,可以使用API​​“settingsClient.checkLocationSettings(…)”获取设备定位权限。之后,即使HMS Core App的位置权限被禁用,你的应用也能一键提示用户开启相关权限。

      请参考HMS Location guide

      第一步:获取SettingsClient的服务接口。

      SettingsClient settingsClient = LocationServices.getSettingsClient(this);
      

      第 2 步:调用 checkLocationSettings() 检查设备设置。

      LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
      
      mLocationRequest = new LocationRequest();
      
      builder.addLocationRequest(mLocationRequest);
      
      LocationSettingsRequest locationSettingsRequest = builder.build();
      
      //check Location Settings
      
      settingsClient.checkLocationSettings(locationSettingsRequest)
      
              .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() {
      
                  @Override
      
                  public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
      
                      //Have permissions, send requests
      
                      fusedLocationProviderClient
      
                              .requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper())
      
                              .addOnSuccessListener(new OnSuccessListener<Void>() {
      
                                  @Override
      
                                  public void onSuccess(Void aVoid) {
      
                                      //Interface call successfully processed
      
                                  }
      
                              });
      
                  }
      
              })
      
              .addOnFailureListener(new OnFailureListener() {
      
                  @Override
      
                  public void onFailure(Exception e) {
      
                      //Settings do not meet targeting criteria
      
                      int statusCode = ((ApiException) e).getStatusCode();
      
                      switch (statusCode) {
      
                          case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
      
                              try {
      
                                  ResolvableApiException rae = (ResolvableApiException) e;
      
                                  //Calling startResolutionForResult can pop up a window to prompt the user to open the corresponding permissions
      
                                  rae.startResolutionForResult(MainActivity.this, 0);
      
                              } catch (IntentSender.SendIntentException sie) {
      
                                  //…
      
                              }
      
                              break;
      
                      }
      
                  }
      
              });
      

      【讨论】:

        猜你喜欢
        • 2023-03-15
        • 2014-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-14
        • 2022-10-17
        • 1970-01-01
        • 2011-12-04
        相关资源
        最近更新 更多