Android 百度离线地图及存储权限申请

news/2024/11/29 6:54:01/

Android 百度离线地图及存储权限申请

前言

  项目需要在无网络环境下访问百度地图,于是想到了使用百度的离线地图,特将使用过程中遇到的问题记录下来。安卓设备为华为平板,版本Android12.0 API31.

离线地图的使用

  参考官方的离线地图使用说明,主要使用MKOfflineMap 进行离线地图的下载及维护,首先初始化离线地图,注意init函数中需要传入listener方法,需要自定义实现MKOfflineMapListener,我是在MainActivity声明时直接implements MKOfflineMapListener了,所以填this就行。

 MKOfflineMap  mkOfflineMap = new MKOfflineMap();mkOfflineMap.init(this);

  根据城市编码调用MKOfflineMap的start方法下载离线地图,可以通过MKOfflineMap类的searchCity方法根据城市名查找cityId,如下所示,我是在下载该城市地图前,判断了下是否已下载过该城市地图

ArrayList<MKOLUpdateElement> localMapList = mkOfflineMap.getAllUpdateInfo();     //存储已下载的离线地图列表if (localMapList != null){String[] hasDownLoad = new String[localMapList.size()];for (int i = 0; i < localMapList.size(); i++){hasDownLoad[i] = localMapList.get(i).cityName;}for (int j = 0; j < cityNames.length; j++){if (containsCity(hasDownLoad, cityNames[j]))Log.i("OfflineMap", cityNames[j]);else{ArrayList<MKOLSearchRecord> records = mkOfflineMap.searchCity(cityNames[j]);if (records != null && records.size() == 1) {cityId = records.get(0).cityID;}mkOfflineMap.start(cityId);Toast.makeText(this, "开始下载离线地图. cityid: " + cityId, Toast.LENGTH_SHORT).show();}}}

  可以通过onGetOfflineMapState的回调信息,查看更新进度、新离线地图安装、版本更新提示,在implements MKOfflineMapListener后,该函数会自动生成,可以在相应的case下编写自己的代码。

@Overridepublic void onGetOfflineMapState(int type, int state) {switch (type) {case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:MKOLUpdateElement update = mkOfflineMap.getUpdateInfo(state);// 处理下载进度更新提示if (update != null) {Log.i("offlineDownLoad", String.format("%s : %d%%", update.cityName, update.ratio));}break;case MKOfflineMap.TYPE_NEW_OFFLINE:// 有新离线地图安装Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));break;case MKOfflineMap.TYPE_VER_UPDATE:// 版本更新提示// MKOLUpdateElement e = mOffline.getUpdateInfo(state);break;default:break;}}

  至此已完成了离线地图的下载,但是在测试过程中发现离线地图并没被加载,同时回调函数中也没有下载进度的更新提示,一开始是怀疑自己的离线地图加载有问题,怀疑并不是自动加载的,而是需要调用什么set之类的函数才能加载离线地图,后来找了半天,也没发现什么解决方法,而且官方文档上的说明是在有离线地图的情况下,地图SDK会优先加载离线地图,于是换了个思路,突然想到是不是离线地图根本没下载成功,这也是回调函数中没有提示的原因,运行过程中APP有网络连接,所以可能是存储访问权限的问题,于是检查自己的存储权限申请,尝试随便在外部存储中创建个文件夹,显示not permit,果然问题出现在这了。

存储权限的申请

  之前不知道在哪看的是要申请MANAGE_EXTERNAL_STORAGE权限,但是没申请成功,不过我在在应用管理上手动打开了所有权限,就以为授权OK了,其实不然,对于Android12应该按照如下申请存储的权限:
  1、在 AndroidManifest.xml 文件中添加存储权限声明:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  2、在Activity中检查是否已获得存储权限,若未获得则进行申请。注意下方的MY_PERMISSIONS_REQUEST_STORAGE请替换为自己的request code,以方便在回调函数中进行区分处理。

if (ContextCompat.checkSelfPermission(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},MY_PERMISSIONS_REQUEST_STORAGE);}

  3、在请求权限之前,也可以使用 ActivityCompat.shouldShowRequestPermissionRationale() 方法检查是否需要向用户解释为什么需要该权限。如果需要解释,可以向用户显示一个对话框或提示,以便说明权限的用途。我这里就不需要了。
  4、在Activity中重写onRequestPermissionsResult方法,以接收权限请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == requestCode) {if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {// 权限已授予,执行访问存储的操作} else {// 权限被拒绝}}
}

  在正确请求存储权限后,离线地图得以正常显示了,这里也额外说明下MANAGE_EXTERNAL_STORAGE权限:MANAGE_EXTERNAL_STORAGE 权限是一项特殊权限,需要在应用的 AndroidManifest.xml 文件中声明,并且还需要进行特殊的审核和授予过程,通常适用于需要管理存储空间的系统级应用程序。对于大多数常规应用程序来说,并不需要直接申请 MANAGE_EXTERNAL_STORAGE 权限。如果只需要在应用中访问应用专属目录、公共存储目录或使用 Android 官方 API 访问存储,通常只需申请 WRITE_EXTERNAL_STORAGE 权限即可。


http://www.ppmy.cn/news/243775.html

相关文章

私募证券基金动态-23年5月报

成交量&#xff1a;5月日均11,342.95亿元 2023年5月A股两市日均成交9,284.12亿元&#xff0c;环比下降18.15%、同比上升10.56%。5月整体20个交易日&#xff0c;仅有月初5个交易日单日成交金额过万亿。 管理人&#xff1a;新提交备案6家&#xff0c;备案通过0家 2023年5月新提…

浅拷贝 深拷贝

数据类型 数据分为基本数据类型(String, Number, Boolean, Null, Undefined&#xff0c;Symbol) 和 对象数据类型 基本数据类型的特点&#xff1a;直接存储在栈(stack)中的数据 引用数据类型的特点&#xff1a;存储的是该对象在栈中引用&#xff0c;真实的数据存放在 堆内存…

sm3与sm4

介绍&#xff1a; 国密即国家密码局认定的国产密码算法。主要有SM1&#xff0c;SM2&#xff0c;SM3&#xff0c;SM4。密钥长度和分组长度均为128位。 1. SM1 为对称加密。其加密强度与AES相当。该算法不公开&#xff0c;调用该算法时&#xff0c;需要通过加密芯片的接口进行调…

卡奥斯开源社区六月创作之星挑战赛开始啦!

活动须知 发布优质文章争榜&#xff0c;获取专属勋章、流量扶持及奖励&#xff01; 活动时间&#xff1a;6 月 1 日- 6 月 30 日 奖品发放&#xff1a;7月10日 参与方式 完成认证发布优质文章&#xff0c;选中相关活动标签&#xff0c;文章默认参与活动 文章要求 文章符合…

okta/sf平台实现saml2.0单点登录集成实战(详细步骤+完整代码)

目录 第一步&#xff1a;注册okta账号 第二步&#xff1a;配置okta应用信息 第三步&#xff1a;下载Idp.xml文件 第四步&#xff1a;okta特定配置 第五步&#xff1a;集成测试 基于SuccessFactors的单点登录实现 Github工程代码链接 小结 笔者以前写过一篇关于saml2.0单…

【无标题】-自用

rad表示弧度radian&#xff0c;deg表示角度degree&#xff1b; 1. 用基于轮廓的模版匹配&#xff0c;匹配到之后&#xff0c;会有一个参数输出目标与原模版相比旋转的角度。 2. 原图的左上角点和右下角点连线&#xff0c;再把旋转之后图的上角与下角连线&#xff0c;测量两条线…

使用mongo遇到一些需要查询的符合要求的数据,写sql

1.修改符合条件的数据 如果一个值在A数组中存在,那么修改该数据中B数组,只保留B数组中xxx db.user.find({account:"csbj"}).pretty() {"_id" : ObjectId("6139680bde8bcd0001beb194"),"id" : 813,"account" : "csb…

ubuntu

#关于win10下linux的启动记录; 惠普&#xff08;暗影精灵&#xff09;BIOS里BOOT Option 里选择OS BOOT manager &#xff0c;Enter键选择windows或者ubuntu的启动顺序&#xff0c;将ubuntu设为第一&#xff0c;F10保存即可在启动后&#xff0c;提供windows或者ubuntu的系统选项…