2

我的华为手机上的华为 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);
    }
}

有什么建议吗?

4

2 回答 2

1
  1. 必须始终允许 HMS 权限。否则会报错。

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

在此处输入图像描述

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

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

在此处输入图像描述

  1. 检查您的应用是否启用了位置权限。
于 2021-03-15T01:29:48.243 回答
1

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

请参考HMS 定位指南

第一步:获取SettingsClient的服务API。

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;

                }

            }

        });
于 2021-03-16T01:34:51.140 回答