我们在华为手机中第一次安装高德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项目真正被授予权限,需要通过动态授权流程中的verifySelfPermission、canRequestPermission、requestPermissionFromUser等接口来验证合实现。
如果您觉得以上APP授权过程比较复杂,可以到下方评论区进行探讨,让鸿蒙应用开发变得更加简单。
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!