鸿蒙开发版高德地图SDK-手机定位(一):获取手机的权限

我们在华为手机中第一次安装高德APP软件时,刚打开界面,会弹出相关需要开启的权限弹窗,比如高德地图APP在打开首页时需要获得设备位置权限设备资源权限设备通讯权限,如下图所示:

获取设备位置权限

获取设备资源权限

获取设备通讯权限

这些设备权限虽然在高德地图中有不同的应用场景,但是这些权限的实现原理和流程都一样。下面,我就以设备位置权限为主要的案例,详细讲解一下“如何获取并开通手机设备的位置权限”。

一.在鸿蒙APP项目中的config.json文件中,添加【位置权限】相关的字段内容。

首先,找到项目中的config.json文件;

在自己的项目文件路径中,找到config.json文件

在config.json文件中,配置手机的位置权限信息,如ohos.permission.LOCATION
ohos.permission.LOCATION_IN_BACKGROUND
config.json文件中的配置如下:

{  "module": {  	"reqPermissions": [      {       "usedScene": {           "ability": [             "com.example.gaodetest.MainAbility"           ],           "when": "always"        },        "name": "ohos.permission.INTERNET"      },      {       "usedScene": {          "ability": [            "com.example.gaodetest.MainAbility"          ],          "when": "always"        },        "name": "ohos.permission.LOCATION_IN_BACKGROUND"      }  	]  }}

鸿蒙开发过程中,其位置权限可分为前台位置权限后台位置权限,前台是ohos.permission.LOCATION,后台是
ohos.permission.LOCATION_IN_BACKGROUND
,这两种权限都要同时进行申请,才能完整的得到位置权限。

位置权限

二.根据相应的权限授予查询接口,在项目的AbilitySlice文件中可以动态的实现权限申请流程。

想要让config.json文件中的ohos.permission.LOCATION
ohos.permission.LOCATION_IN_BACKGROUND
这两个位置权限能被真正授予权限,必须要通过相应的权限申请流程来逐步实现,具体流程如下:

(1).首先,需要通过
ohos.app.Context.verifySelfPermission
接口查询自己开发的鸿蒙APP是否已开通相应的位置权限;

(2).其次,若自己的鸿蒙APP项目没有被授予位置权限,可通过canRequestPermission查询是否可以动态申请。

(3).最后,如果能进行动态弹窗申请,可以使用requestPermissionFromUser去申请权限。

我们熟悉上面的流程之后,可以在自己的AbilitySlice文件进行编写,代码块如下:

import com.amap.api.maps.AMap;import com.amap.api.maps.MapView;import com.example.gaodetest.ResourceTable;import ohos.aafwk.ability.AbilitySlice;import ohos.aafwk.content.Intent;import ohos.agp.components.DirectionalLayout;import ohos.agp.window.dialog.ToastDialog;import ohos.bundle.IBundleManager;import ohos.location.Location;public class MainAbilitySlice extends AbilitySlice {	  private MapView mapView;    //此值随意,主要是为后面的onRequestPermissionsFromUserResult方法中的条件进行条件配对	public static final int MY_LOCATION_PERMISSION = 6;  @Override  public void onStart(Intent intent) {  	super.onStart(intent);    super.setUIContent(ResourceTable.Layout_ability_main);		//显示地图首页    initMapView();  }  //显示地图  private void initMapView() {  	//1.地图UI加载    mapView = new MapView(this);		mapView.onCreate(null);    mapView.onResume();    DirectionalLayout.LayoutConfig config = new DirectionalLayout.LayoutConfig(            DirectionalLayout.LayoutConfig.MATCH_PARENT, DirectionalLayout.LayoutConfig.MATCH_PARENT);    mapView.setLayoutConfig(config);    super.setUIContent(mapView);		    //2.申请定位权限    requestLocationPermission();    //3.生成地图当前对象    AMap aMap = mapView.getMap();	  //4.初始化时,显示手机设备当前位置    aMap.setOnMyLocationChangeListener(new AMap.OnMyLocationChangeListener(){			 @Override       public void onMyLocationChange(Location location) {            }        });	}    // 申请手机"位置"权限的动态流程  public void requestLocationPermission(){       if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED){            if (canRequestPermission("ohos.permission.LOCATION")){                //是否可以申请"位置"的动态弹框授权(首次申请或者用户未选择禁止且不再提示)                requestPermissionsFromUser(                   new String[]{"ohos.permission.LOCATION","ohos.permission.LOCATION_IN_BACKGROUND"}, MY_LOCATION_PERMISSION                );            }else{                //提示用户进入设置界面进行授权                new ToastDialog(getContext()).setText("请进入手机系统【设置】中,重新开启应用的定位权限").show();            }        }else{            //此鸿蒙地图APP应用已被授予“位置”权限            new ToastDialog(getContext()).setText("此应用已授权,可进行【定位】功能的初始化").show();        }  }    @Override  protected void onStop() {      super.onStop();        if (mapView != null) {            mapView.onDestroy();        } }}

三.点击弹窗中相应的权限申请选项,可通过自己的Ability文件添加回调函数,授予位置权限的获取结果。

为了能让手机能够获得位置权限,上面的操作中可以通过requestPermissionFromUser这个接口让APP可以首次获得位置权限相关的弹窗,真机测试显示如下:

requestPermissionFromUser,会首次弹出位置权限申请的弹窗

根据弹窗提供的“仅使用期间允许”、“始终允许”、“禁止”这三个按钮,我们选择并点击其中一个,其点击事件会根据
onRequestPermissionsFromUserResult
这个回调函数来接收位置权限授予的结果。

关于回调函数
onRequestPermissionsFromUserResult
,它必须要在我们自己项目中的Ability文件中进行编写,代码块如下:

import com.example.gaodetest.slice.MainAbilitySlice;import ohos.aafwk.ability.Ability;import ohos.aafwk.content.Intent;import ohos.agp.window.dialog.ToastDialog;import ohos.bundle.IBundleManager;public class MainAbility extends Ability {    public static final int LOCATION_PEEMISSION_CODE = MainAbilitySlice.MY_LOCATION_PERMISSION;    @Override    public void onStart(Intent intent) {        super.onStart(intent);        super.setMainRoute(MainAbilitySlice.class.getName());    }    //调用requestPermissionsFromUser后的权限申请应答    @Override    public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {        switch (requestCode){            case LOCATION_PEEMISSION_CODE: {                if (grantResults.length > 0 && grantResults[0] == IBundleManager.PERMISSION_GRANTED){                    new ToastDialog(getContext()).setText("此应用已授权,可进行定位功能的初始化").show();                }else{                    new ToastDialog(getContext()).setText("权限被拒绝").show();                }                return;            }        }    }}

最后,我们再进行真机测试,会在手机中的地图下方反馈详细的结果,如下图:

回调函数onRequestPermissionsFromUserResult,会接收授权结果

结语:

鸿蒙开发的APP,在首次开启时需要获得的设备位置、设备资源、设备通讯等数量较多的权限,我们可以按照官方相应的动态权限申请流程来进行处理。

因为有些权限即便能在config.json文件进行配置,也并不一定会让APP项目真正被授予权限,需要通过动态授权流程中的verifySelfPermissioncanRequestPermissionrequestPermissionFromUser等接口来验证合实现。

如果您觉得以上APP授权过程比较复杂,可以到下方评论区进行探讨,让鸿蒙应用开发变得更加简单。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年7月10日
下一篇 2021年7月11日

相关推荐