当前位置:首页 >焦点 >HarmonyOS手表Demo—定位套件之二 ​​想了解更多内容

HarmonyOS手表Demo—定位套件之二 ​​想了解更多内容

2024-06-30 21:55:23 [百科] 来源:避面尹邢网

HarmonyOS手表Demo—定位套件之二

作者:木棉花小蓝 系统 OpenHarmony 在正式开发应用前,位套我们需要在Gradle文件中设置AppGallery Connect的位套Gradle插件以及AppGallery Connect SDK基础包,以及将Location SDK集成到开发环境中,位套这些都是位套上期内容中未完成的步骤。

​​想了解更多内容,位套请访问:​​

HarmonyOS手表Demo—定位套件之二 ​​想了解更多内容

​​51CTO和华为官方合作共建的位套鸿蒙技术社区​​

HarmonyOS手表Demo—定位套件之二 ​​想了解更多内容

​​https://ost.51cto.com​​

HarmonyOS手表Demo—定位套件之二 ​​想了解更多内容

正文

在上期的内容中,我们完成了开发定位服务Demo的位套基本准备。而在这期内容中,位套笔者会将剩下的位套开发工作做完。

为项目集成SDK

在正式开发应用前,位套我们需要在Gradle文件中设置AppGallery Connect的位套Gradle插件以及AppGallery Connect SDK基础包,以及将Location SDK集成到开发环境中,位套这些都是位套上期内容中未完成的步骤。

首先,位套我们需要下载agconnect-services.json文件。位套

下载完成后,将此agconnect-services.json文件复制到剪切板中,然后打开DevEco Studio中的项目,再打开entry>src,将agconnect-services.json文件粘贴到src的目录中。

接着,打开项目级的build.gradle:

并在dependencies中添加相关代码:

dependencies { 
...
classpath 'com.huawei.agconnect:agcp-harmony:1.0.0.300'
}

之后,打开模块级的build.gradle。

首先,在dependencies中添加相关代码:

dependencies { 
...
implementation 'com.huawei.hms:location-harmony:6.3.0.300'
implementation 'com.huawei.agconnect:agconnect-core-harmony:1.3.0.300'
}

之后,在模块级build.gradle文件的顶部添加相关代码。

apply plugin: 'com.huawei.ohos.hap'
...
apply plugin: 'com.huawei.agconnect' //添加此行代码
...

完成上述操作后,点击右上角的sync now,即可完成脚本文件的同步。

添加应用权限

打开entry>src>main>config.json,在module模块中添加获取网络状态的权限,定位权限以及后台定位权限:

"module": {   
...
"reqPermissions": [
{
"name": "ohos.permission.GET_NETWORK_INFO",
"reason": "Allows programs to obtain network information status."
},
{
"name": "ohos.permission.LOCATION",
"reason": "Allows applications to obtain location information when running in the foreground."
},
{
"name": "ohos.permission.LOCATION_IN_BACKGROUND",
"reason": "Allows applications to obtain location information when running in the background."
}
],
...
}

完成上述操作后,点击右上角的sync now,即可完成脚本文件的同步。

配置混淆脚本

编译APP前,我们需要配置混淆配置文件,这样可以避免混淆SDK导致功能异常。

打开entry>src>proguard-rules.pro,加入排除HMS Core SDK的混淆配置。

-ignorewarnings
-repackageclasses
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keep public class com.huawei.hms.location.harmony.* { *;}
-keep public class com.huawei.hms.location.harmony.base.* { *;}
-keep class com.huawei.hmf.tasks.* { *;}

设置交互逻辑

完成前文的基础操作后,我们便可以开始写入定位服务Demo的交互逻辑了。

第一个要做的是一完成页面跳转,即从MainAbilitySlice跳转至GetLastLocationAbilitySlice。前者用于提供Demo的初始界面,类似于一个屏幕保护壁纸,而后者则提供带有定位业务的界面,它是这个Demo的核心页面。

打开entry>src>main>Java>com.example.location_hms>slice>MainAbilitySlice,在onStart回调中加入如下代码,实现不同Page Ability间页面导航的功能。

@Override
public void onStart(Intent intent) {
...
Button button1=(Button) findComponentById(ResourceTable.Id_bn1); //获取Button组件对象
button1.setClickedListener(new Component.ClickedListener() { //为此Button设置点击监听器
@Override
public void onClick(Component component) { //设置Click事件
Intent intent1=new Intent(); //创建Intent对象
Operation operation=new Intent.OperationBuilder() //创建Operation对象
.withDeviceId("")
.withBundleName("com.example.location_hms")
.withAbilityName("com.example.location_hms.GetLastLocationAbility") //设置需要跳转的目标Page Ability
.build();
intent1.setOperation(operation); //设置Intent对象的operation属性
startAbility(intent1); //添加启动Ability的指令
}
});
}

第二个需要实践的是—在代码中动态申请相关定位权限。

在前面的步骤中,我们已经将定位权限和后台定位权限(即“ohos.permission.LOCATION ”和“ohos.permission.LOCATION_IN_BACKGROUND”)添加到config.json中了,但这两个权限属于敏感权限,需要用户手动进行动态申请。

所以,我们新建一个AbilitySlice,并将其命名为RequestAbilitySlice。

创建完成后,在RequestAbilitySlice中添加如下代码,以创建一个动态申请相关定位权限的线程。

public class RequestAbilitySlice extends AbilitySlice { 
private static final String TAG = "RequestAbilitySlice";
private static final int DOMAIN = 0xD001100;
private static final int REQUEST_CODE = 0x1001;
private static Map<String, HiLogLabel> logLabelMap = new HashMap<>();
public FusedLocationClient fusedLocationClient;
@Override
protected void onStart(Intent intent) {
super.onStart(intent);
fusedLocationClient = new FusedLocationClient(this);
}
@Override
protected void onActive() {
super.onActive();
}
public void checkSelfPermission() {
if (verifySelfPermission("ohos.permission.LOCATION") != IBundleManager.PERMISSION_GRANTED) {
printLog(HiLog.INFO, TAG, "Self: LOCATION permission not granted!");
if (canRequestPermission("ohos.permission.LOCATION")) {
printLog(HiLog.INFO, TAG, "Self: can request permission here");
requestPermissionsFromUser(
new String[]{ "ohos.permission.LOCATION"}, REQUEST_CODE);
} else {
printLog(HiLog.WARN, TAG, "Self: enter settings to set permission");
}
} else {
printLog(HiLog.INFO, TAG, "Self: LOCATION permission granted!");
}

if (verifySelfPermission("ohos.permission.LOCATION_IN_BACKGROUND") != IBundleManager.PERMISSION_GRANTED) {
printLog(HiLog.INFO, TAG, "Self: LOCATION_IN_BACKGROUND permission not granted!");
if (canRequestPermission("ohos.permission.LOCATION_IN_BACKGROUND")) {
printLog(HiLog.INFO, TAG, "Self: can request permission here");
requestPermissionsFromUser(
new String[]{ "ohos.permission.LOCATION_IN_BACKGROUND"}, REQUEST_CODE);
} else {
printLog(HiLog.WARN, TAG, "Self: enter settings to set permission");
}
} else {
printLog(HiLog.INFO, TAG, "Self: LOCATION_IN_BACKGROUND permission granted!");
}
}
public void printLog(int level, String tag, String message) {
HiLogLabel hiLogLabel = getLogLabel(tag);
switch (level) {
case HiLog.INFO:
HiLog.info(hiLogLabel, message);
break;
case HiLog.WARN:
HiLog.warn(hiLogLabel, message);
break;
case HiLog.ERROR:
HiLog.error(hiLogLabel, message);
break;
default:
HiLog.debug(hiLogLabel, message);
break;
}
}
private HiLogLabel getLogLabel(String tag) {
HiLogLabel label;
String tagStr;

if (tag == null || tag.isEmpty()) {
tagStr = "TAG";
} else {
tagStr = tag;
}
if (logLabelMap.containsKey(tagStr)) {
label = logLabelMap.getOrDefault(tagStr, new HiLogLabel(HiLog.LOG_APP, DOMAIN, "TAG"));
} else {
label = new HiLogLabel(HiLog.LOG_APP, DOMAIN, tagStr);
logLabelMap.put(tagStr, label);
}
return label;
}
public void printScreenLog(Text showLocation, String msg) {
StringBuilder outputBuilder = new StringBuilder();
SimpleDateFormat formatter = new SimpleDateFormat("HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());
String dateStr = formatter.format(curDate);
outputBuilder.append(dateStr);
outputBuilder.append(" ");
outputBuilder.append(msg);
outputBuilder.append(System.lineSeparator());
showLocation.setMultipleLine(true);
showLocation.append(outputBuilder.toString());
}
}

并且,我们希望打开应用时,系统就能推送关于申请权限的消息,故我们需要在MainAbility中进行相关设置。

打开entry>src>main>Java>com.example.location_hms>MainAbility,添加如下代码:

public class MainAbility extends Ability { 
private static final int REQUEST_CODE = 0x1000;
private static final int DOMAIN = 0xD001100;
private HiLogLabel hiLogLabel = new HiLogLabel(HiLog.LOG_APP, DOMAIN, "TAG");
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setMainRoute(MainAbilitySlice.class.getName());
String[] strings = { "ohos.permission.LOCATION", "ohos.permission.LOCATION_IN_BACKGROUND"};
requestPermissionsFromUser(strings, REQUEST_CODE);
}
@Override
public void onRequestPermissionsFromUserResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsFromUserResult(requestCode, permissions, grantResults);
HiLog.info(hiLogLabel, "MainAbility onRequestPermissionsFromUserResult :" + Arrays.toString(grantResults));
if (requestCode == REQUEST_CODE) {
HiLog.info(hiLogLabel, "MainAbility request permission success.");
}
}
}

第三个需要做的则是一在GetLocationAbilitySlice中写入的就是定位服务的功能逻辑了。

我们在之前创建了一个用于动态申请相关权限的RequestAbilitySlice,不过它只是作为一个基类Slice,相当于一个模板,在Demo中并不被当作具体页面向用户展示。而这个RequestAbilitySlice的用处则是被GetLastLocationAbilitySlice所继承,这样做不仅能将两种不同作用的代码分隔开来,以免混淆,而且想在这个Demo中扩展其他定位功能时,也可以让新建的AbilitySlice直接继承这个基类slice,避免重复写同一种代码。

打开GetLastLocationAbilitySlice,将它extend的对象改为RequestAbilitySlice,并加入相应代码:

public class GetLastLocationAbilitySlice extends RequestAbilitySlice implements Component.ClickedListener {    //继承RequestAbilitySlice
private static final String TAG = "GetLastLocationSlice";
private Text showLocation;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_get_last_location);
checkSelfPermission();
findComponentById(ResourceTable.Id_btn_getLastLocationWithAddress).setClickedListener(this);
showLocation = (Text) findComponentById(ResourceTable.Id_show_location); //获取文本组件的对象
}
@Override
public void onClick(Component component) {
switch (component.getId()) {
case ResourceTable.Id_btn_getLastLocationWithAddress:
getLastLocationWithAddress();
break;
default:
break;
}
}
private void getLastLocationWithAddress() {
fusedLocationClient.getLastLocationWithAddress(buildLocationRequest()) //获取fusedLocationClient对象
.addOnSuccessListener(location -> {
if (null == location) {
printLog(HiLog.INFO, TAG, "[new]getLastLocationWithAddress onSuccess: hwLocation is null");
return;
}
String result = "[--已获得您的位置--]" +" "
+"[国家-省份-城市-城区-具体位置]:"
+ location.getCountryName() + ">"
+ location.getState() + ">" + location.getCity() + ">"
+ location.getCounty() + ">" + location.getFeatureName()+""; //定义需要输出到文本组件的字符串(获取位置成功时)
printLog(HiLog.INFO, TAG, result);
printScreenLog(showLocation, result);
})
.addOnFailureListener(e -> {
printLog(HiLog.INFO, TAG, "无法获取您的位置 " + e.getMessage());
printScreenLog(showLocation, "无法获取您的位置 " + e.getMessage()); //定义需要输出到文本组件的字符串(获取位置失败时)
});
}
private LocationRequest buildLocationRequest() {
LocationRequest locationRequest = new LocationRequest();
locationRequest.setNeedAddress(true);
locationRequest.setLanguage("zh");
locationRequest.setCountryCode("CN");
return locationRequest;
}
}

完成上述操作后,定位套件的制作就大功告成了。

效果图如下:

结尾

本期的分享到这里就结束了。

​​想了解更多内容,请访问:​​

​​51CTO和华为官方合作共建的鸿蒙技术社区​​

​​https://ost.51cto.com​​

责任编辑:jianghua 来源: 鸿蒙社区 HarmonyOS手表Demo操作系统

(责任编辑:焦点)

    推荐文章
    • 汇率变动对股价的影响的有哪些 主要表现是什么?

      汇率变动对股价的影响的有哪些  主要表现是什么?外汇行情与股价有密切的联系。一般来说,如果一国的货币是实行升值的基本方针,股价便会上涨,一旦其货币贬值,股价即随之下跌。所以外汇的行情会带给股市以很大的影响。在当代国际贸易迅速发展的潮流中,汇率对一国 ...[详细]
    • 知乎的“野心与终局”

      知乎的“野心与终局”雷锋网按:近日,科技圈的新闻可谓此起彼伏,知乎获得D轮融资;陆奇加盟百度;继AlphaGo之后,百度小度继续挑战人类的“最强大脑”……对于这些事件,业内的行家会有怎样的麻辣点评?小编怀着依依不舍的心情 ...[详细]
    • 《漫威蜘蛛侠2》的地图是前作的两倍大

      《漫威蜘蛛侠2》的地图是前作的两倍大虽然《漫威蜘蛛侠》因出色的故事获得了好评,但我们也不应该忘记该作庞大的世界规模。曼哈顿有许多活动、收集品和支线任务可供完成。好消息是,续作《漫威蜘蛛侠2》中的地图将会更大。在接受Famitsu采访时, ...[详细]
    • 极窄边框+人脸识别?iPhone 8 部分功能曝光?

      极窄边框+人脸识别?iPhone 8 部分功能曝光?雷锋网此前曾报道,消息人士称,鸿海正在为 2017 年发布的新一代 iPhone 开发无线充电模块,不过,新款的所有型号iPhone 届时是否会都使用这项技术还要看鸿海最终测试的良品率而定。与此同时, ...[详细]
    • TCL科技(000100.SZ)公布消息:近日增持中环股份股票共5855.2778万股

      TCL科技(000100.SZ)公布消息:近日增持中环股份股票共5855.2778万股TCL科技(000100.SZ)公布,公司长期看好新能源和半导体产业发展前景,以及中国在半导体光伏领域已经建立的竞争优势和半导体材料领域面临的发展机遇。公司收购天津中环半导体股份有限公司(股票代码:0 ...[详细]
    • 芯片制造多元化!英伟达未来可能选择英特尔代工

      芯片制造多元化!英伟达未来可能选择英特尔代工过去一段时间,许多半导体企业受到宏观经济环境恶化等因素影响,营收方面承受了很大的压力。不过也有个别企业逆势而上,比如英伟达,最近可谓是春风得意,得益于AI热潮,不但营收预期远远超过预期,而且市值大幅度 ...[详细]
    • 本月作为私酒贩违反禁令以赚取额外收入

      本月作为私酒贩违反禁令以赚取额外收入警察迫切希望取缔整个边境的非法酒类流动,但当地人的渴望是无止境的。本月在 Red Dead 在线模式中,在平原上酿私酒和走私您的烈酒,将为愿意与执法部门发生冲突的人带来额外奖励。三倍 RDO 游戏币和 ...[详细]
    • 微信新规:赞赏限额由单日5万调整至10万

      微信新规:赞赏限额由单日5万调整至10万罗玉凤在今日凌晨的一文中透露其11号发布的文章累积获得了20.48万的赞赏额度。据雷锋网所知,出于风险规避到需要,微信单日赞赏限额5万,而罗玉凤的文章发布刚刚4天确切地说,截止罗玉凤截图撰文时可能是3 ...[详细]
    • 股指期货是什么意思?股指期货合约的最后交易日是什么时候?

      股指期货是什么意思?股指期货合约的最后交易日是什么时候?股指期货是什么意思?股票指数期货是指以股票价格指数作为标的物的金融期货合约,在具体交易时,股票指数期货合约的价值是用指数的点数乘以事先规定的单位金额来加以计算的。股指期货可以进行双向操作,存在保证金制 ...[详细]
    • 《暗黑不朽》资料片“毁灭新生”联动《暗黑4》 莉莉丝降临

      《暗黑不朽》资料片“毁灭新生”联动《暗黑4》 莉莉丝降临6月8日《暗黑破坏神:不朽》首个年度资料片“毁灭新生”将与冒险者共同开启2.0大版本的全新冒险。与《暗黑破坏神4》的强强联动,将作为资料片第一幕重磅来袭!强大的BOSS阿煞巴限时登场,为庇护之地带来全 ...[详细]
    热点阅读