移动感知终端软件发布过程中遇到的问题以及解决方案

news2024/11/14 22:03:37

一.软件发布

软件的效果展示在文章:

网络图谱构建系统目前已实现的功能-CSDN博客

在android studio编写完程序之后,要打包并发布软件,供其他用户使用,以下几篇文章给出了方法:

Android Studio使用签名打包发布APP(安卓生成apk文件)_generate signed bundle or apk-CSDN博客

Android Studio 打包APK(详细版)_as打包apk-CSDN博客

二.安装后初次打开设备信息显示不全

软件在手机安装之后,首先询问权限,当权限全部允许之后,点击顶部菜单栏按钮,在滑动菜单中

并没有显示全设备信息,博主查看了该部分代码:

 //设备信息与网络信息提取
    private void getDeviceInfo() {
        // 设备运营商名称
        networkOperatorName = telephonyManager.getNetworkOperatorName();


        // 设备品牌
        deviceBrand = android.os.Build.BRAND;


        // 设备型号
        deviceModel = android.os.Build.MODEL;

        // SIM卡国别
        simCountry = telephonyManager.getSimCountryIso();


        // SIM卡当前状态
        deviceStatus = telephonyManager.getSimState() == TelephonyManager.SIM_STATE_READY ? "Ready" : "Not Ready";
   

     // 网络类型
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }


        NetworkType = telephonyManager.getNetworkType();
        switch (NetworkType) {
            case TelephonyManager.NETWORK_TYPE_GPRS:
            case TelephonyManager.NETWORK_TYPE_EDGE:
            case TelephonyManager.NETWORK_TYPE_CDMA:
            case TelephonyManager.NETWORK_TYPE_1xRTT:
            case TelephonyManager.NETWORK_TYPE_IDEN:
                networkType = "2G";
                break;
            case TelephonyManager.NETWORK_TYPE_UMTS:
            case TelephonyManager.NETWORK_TYPE_EVDO_0:
            case TelephonyManager.NETWORK_TYPE_EVDO_A:
            case TelephonyManager.NETWORK_TYPE_HSDPA:
            case TelephonyManager.NETWORK_TYPE_HSUPA:
            case TelephonyManager.NETWORK_TYPE_HSPA:
            case TelephonyManager.NETWORK_TYPE_EVDO_B:
            case TelephonyManager.NETWORK_TYPE_EHRPD:
            case TelephonyManager.NETWORK_TYPE_HSPAP:
                networkType = "3G";
                break;
            case TelephonyManager.NETWORK_TYPE_LTE:
                networkType = "4G";
                break;
            case TelephonyManager.NETWORK_TYPE_NR:
                networkType = "5G";
            default:
                networkType = "未知";
                break;
        }

}

发现只有网络类型没有显示出来,又去onCreate中查看了权限询问代码和显示设备信息的代码:


        //判断单个权限是否已经允许
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);

        }

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_PHONE_STATE);
        }

//        NetworkType = telephonyManager.getNetworkType();

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        }

        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACTIVITY_RECOGNITION) != PackageManager.PERMISSION_GRANTED) {
            permissionList.add(Manifest.permission.ACTIVITY_RECOGNITION);
        }

        if (!permissionList.isEmpty()) {
            String[] permissions = permissionList.toArray(new String[permissionList.size()]);
            ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);

        } else {
            requestLocation();      //请求位置信息
        }



    //获取设备信息
        getDeviceInfo();



        //刷新设备信息
        ShowEquipMessage.setText("运营商名称: " + networkOperatorName + '\n' + "设备品牌名称: " + deviceBrand + '\n' + "设备型号: " + deviceModel
                + '\n' + "网络类型: " + networkType + '\n' + "SIM卡国别: " + simCountry + '\n' + "SIM卡当前状态: " + deviceStatus);

按照代码中调用的顺序,感觉很合理,首先询问权限,然后获取设备信息,最后打印在控件中,但是就是没有显示网络类型,博主猜测可能与获取网络类型信息之前的权限验证有关,如何解决这个问题呢,博主在网络上看到有文章提到在询问权限的弹窗出来之后,活动实际上已经失去焦点,进入Pause状态,当通过所有权限,弹窗消失之后,活动调用onResume函数恢复焦点。

那么如果在onResume()中再次刷新一次设备信息,也就是让权限询问结束后再刷新一次设备信息,是否就能让网络类型显示出来呢?

    @Override
    protected void onResume() {
        super.onResume();
        //获取设备信息
        getDeviceInfo();

        //刷新设备信息
        ShowEquipMessage.setText("运营商名称: " + networkOperatorName + '\n' + "设备品牌名称: " + deviceBrand + '\n' + "设备型号: " + deviceModel
                + '\n' + "网络类型: " + networkType + '\n' + "SIM卡国别: " + simCountry + '\n' + "SIM卡当前状态: " + deviceStatus);
     

        mMapView.onResume();
    }

运行之后果然网络类型可以显示出来了。

三.启动软件后定位到经纬度都是0的地区

软件安装到手机之后,通过各种权限后,发现定位到了几内亚湾,也就是经纬度都是0的地方,卡片上显示的经纬度都是0,也就是没获取到正确地理坐标,但是过一会之后,正确的地理坐标就传过来了,这中间的时间有长有短,如图:

作者以为是软件启动后获取到定位信息比较慢,可能是编写定位函数时忘写了什么,导致百度地图SDK没有被及时调用。但是无论怎样修改代码也还是这个问题。

在最开始编写百度地图定位功能时,为了测试结果,博主让定位结果返回码打印到日志中:

     int locType = location.getLocType();
     Log.d("定位结果返回码", String.valueOf(locType));

博主偶然看到定位结果返回码在软件刚启动时返回的是505,然后过一会才是61。

按照百度地图提供的表:

返回值定位类型详细说明
61卫星定位结果卫星定位成功
62定位失败无法获取有效定位依据,请检查运营商网络或者WiFi网络是否正常开启,尝试重新请求定位
63网络异常没有成功向服务器发起请求,请确认当前测试手机网络是否通畅,尝试重新请求定位
66离线定位结果通过requestOfflineLocaiton调用时对应的返回结果
67离线定位失败
161网络定位结果网络定位成功
162请求串密文解析失败一般是由于客户端SO文件加载失败造成,请严格参照开发指南或demo开发,放入对应SO文件
167服务端定位失败请您检查是否禁用获取位置信息权限,尝试重新请求定位
505AK不存在或者非法请按照说明文档重新申请AK
69定位开关未打开定位失败,请检查定位服务开关是否打开
70无定位权限定位失败,请检查是否授予定位权限
71定位开关未打开且无定位权限定位失败,请检查定位服务开关是否打开,以及是否授予定位权限

发现505是AK的问题,但是我已经申请过了AK,忽然想到申请AK时,填写的SHA1分为开发版SHA1和发布版SHA1 ,当时两个填写的都一样,我现在打包成发布版软件,应该是发布版的SHA1出了问题,按照文章:

Android Studio获取开发版SHA1和发布版SHA1_如何在android studio获取开发版sha1-CSDN博客的指引获取到了发布版SHA1,重新填到AK配置中,再次运行软件,启动后就定位成功。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1486847.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

day09_商品管理订单管理SpringTaskEcharts

文章目录 1 商品管理1.1 添加功能1.1.1 需求说明1.1.2 核心概念SPUSKU 1.1.3 加载品牌数据CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加载商品单元数据ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

Qt 简约美观的动画 摆钟风格 第十季

&#x1f60a; 今天给大家分享一个摆钟风格的加载动画 &#x1f60a; 效果如下: 最近工作忙起来了 , 后续再分享其他有趣的加载动画吧. 一共三个文件 , 可以直接编译运行 //main.cpp #include "LoadingAnimWidget.h" #include <QApplication> #include <Q…

构建安全的REST API:OAuth2和JWT实践

引言 大家好&#xff0c;我是小黑&#xff0c;小黑在这里跟咱们聊聊&#xff0c;为什么REST API这么重要&#xff0c;同时&#xff0c;为何OAuth2和JWT在构建安全的REST API中扮演着不可或缺的角色。 想象一下&#xff0c;咱们每天都在使用的社交媒体、在线购物、银行服务等等…

Spring框架精髓:带你手写IoC

个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢AI编程&#x1f38b; &#x1f43b;‍❄️个人主页&#x1f947;&#xff1a;落798. &#x1f43c;个人WeChat&#xff1a;hmmwx53 &#x1f54a;️系列专栏&#xff1a;&#x1f5bc;️…

C语言之OJ刷题

今天刷一下题 刷的不多 第一道 链表的回文结构 仔细看这个题它是有限制条件的 首先是时间复杂度和空间复杂度 所以我们并不是用数组去做 但怎么做呢&#xff1f; 思路 既然是判断是否是回文结构&#xff0c;那么我们就找一下他的中间节点 然后将后半段倒置 进行比较…

【简说八股】Redisson的守护线程是怎么实现的

Redisson Redisson 是一个 Java 语言实现的 Redis SDK 客户端&#xff0c;在使用分布式锁时&#xff0c;它就采用了「自动续期」的方案来避免锁过期&#xff0c;这个守护线程我们一般也把它叫做「看门狗」线程。 Redission是一个在Java环境中使用的开源的分布式缓存和分布式锁实…

C2远控Loader红队技巧

inlineHook技术(钩子技术) MessageBoxA C自带弹窗函数 test_MessageBoxA 代码中自定义函数 InlineHook技术&#xff1a;testA原本插入jmp指令跳转到testB&#xff0c;实现testB自定义的函数 实现方式&#xff1a;X86&#xff1a; // 方式一&#xff0c;使用jmp相对地址跳转…

基于springboot音乐翻唱与分享平台源码和论文

1.1研究背景 随着网络不断的普及发展&#xff0c;音乐网站与分享平台依靠网络技术的支持得到了快速的发展&#xff0c;首先要从用户的实际需求出发&#xff0c;通过了解用户的需求开发出具有针对性的首页、音乐资讯、音乐翻唱、在线听歌、留言反馈、个人中心、后台管理、客服功…

ABAP - SALV教程16 合计、小计

虽然ALV的标准状态栏功能就能实现合计、小计、平均值、最大值等这些功能&#xff0c;但用户更希望一进去ALV就希望ALV已经对数量&#xff0c;金额的字段进行合计&#xff0c;小计。SALV实现合计&#xff0c;调用CL_SALV_AGGREGATIONS的ADD_AGGREGATION即可 DATA(lo_aggrs) …

[数据结构]链表OJ--环形链表判断是否有环(快慢指针法)

141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 这里我采用的是快慢指针法,这是我认为最容易理解的方法,这个方法的思路是这样的. 我们可以定义两个指针一个快一个慢,如果这个链表有环,则快慢指针一定会相遇. 这里我画图举个例子: 我们很明显的可以看出,有环链表,快指…

成功解决git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af

成功解决git clone遇到的error: RPC failed; curl 16 Error in the HTTP2 framing layer fatal: expected flush af 问题描述解决方案 问题描述 用git的时候可能会遇到这个问题&#xff1a; (base) zhouzikang7443-8x4090-120:~/project$ git clone https://github.com/123/12…

Outlook邮箱IMAP密码怎么填写?账户设置?

Outlook邮箱IMAP密码是什么&#xff1f;Outlook如何设置IMAP&#xff1f; 许多用户会选择通过IMAP协议将邮箱与各种邮件客户端进行连接。而在设置过程中&#xff0c;填写IMAP密码是必不可少的一步。那么&#xff0c;Outlook邮箱的IMAP密码应该如何填写呢&#xff1f;接下来&am…

Matlab 最小二乘插值(曲线拟合)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 在多项式插值时,当数据点个数较多时,插值会导致多项式曲线阶数过高,带来不稳定因素。因此我们可以通过固定幂基函数的最高次数 m(m < n),来对我们要拟合的曲线进行降阶。之前的函数形式就可以变为: 二、实现…

【硬件工程师面经整理13_电容电阻电感等效电路】

1 电容/电阻/电感的等效电路 ①电容的等效电路是由一个电容和一个电阻组成的&#xff0c;其中电阻称为ESR&#xff08;Equivalent Series Resistance&#xff0c;等效串联电阻&#xff09;。在真实情况下&#xff0c;一个电容会被表示成由“一个电容一个电阻一个电感”组合而成…

冒泡排序 和 qsort排序

目录 冒泡排序 冒泡排序部分 输出函数部分 主函数部分 总代码 控制台输出显示 总代码解释 冒泡排序优化 冒泡排序 主函数 总代码 代码优化解释 qsort 排序 qsort 的介绍 使用qsort排序整型数据 使用qsort排序结构数据 冒泡排序 首先&#xff0c;我先介绍我的冒泡…

解决虚拟机启动报错:“End kernel panic - not syncing: attempted to kill the idle task”

原本能正常运行的虚拟机&#xff0c;很长一段时间没用后&#xff0c;今天再次启动&#xff0c;然后就出现下面的问题&#xff1a; 然后走了一些弯路&#xff0c;比如说删除该虚拟机然后新建一个虚拟机&#xff08;问题未解决&#xff09;、直接删除VitualBox重新安装&#xff0…

wordpress外贸独立站

WordPress外贸电商主题 简洁实用的wordpress外贸电商主题&#xff0c;适合做外贸跨境的电商公司官网使用。 https://www.jianzhanpress.com/?p5025 华强北面3C数码WordPress外贸模板 电脑周边、3C数码产品行业的官方网站使用&#xff0c;用WordPress外贸模板快速搭建外贸网…

计算机指令、指令跳转原理

文章目录 前言存储程序型计算机代码怎么变成机器码&#xff1f;解析指令和机器码CPU 是如何执行指令的&#xff1f;CPU中的寄存器 if…else 来看程序的执行和跳转分析 通过 if…else 和 goto 来实现循环 前言 大家好我是jiantaoyab&#xff0c;这是我所总结作为学习的笔记第三篇…

最新版风车IM通讯iosapph5三端源码及视频教程

最新版风车IM通讯iosapph5三端源码及视频教程 1.宝塔环境如下: Nginx 1.20 Tomcat 8 MySQL 8.0 Redis 7 2.放行端口如下&#xff1a; 666 6600 6700 7000&#xff08;用作前端&#xff09; 7001&#xff08;用作后端&#xff09; 3.宝塔数据库添加数据库旁边有个ro…

【大厂AI课学习笔记NO.62】模型的部署

我们历尽千辛万苦&#xff0c;总算要部署模型了。这个系列也写到62篇&#xff0c;不要着急&#xff0c;后面还有很多。 这周偷懒了&#xff0c;一天放出太多的文章&#xff0c;大家可能有些吃不消&#xff0c;从下周开始&#xff0c;本系列将正常更新。 这套大厂AI课&#xf…