我们在华为手机中第一次安装高德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授权过程比较复杂,可以到下方评论区进行阐述,让鸿蒙应用开发显得愈发简单。
下一篇:没有了