android 之一 android studio 安装、配置等新手入门 百度地图定位 移动摇杆 的实现 -ag凯发k8国际
之前在玩一款 vr 游戏:一起来捉妖。这款游戏是使用地图进行游戏的。无奈网上找了各种工具,要么付费,要么不好使。想想自己就是个程序猿,于是乎决定自己开发一个。现在游戏基本放弃了,但是为了游戏而学到的技术不能丢,现在直接开源:https://gitee.com/zcshou/gogogo
代码我会一直维护(趁机多学习学习),遇到的问题我也会不断更新在这篇文章中。
其实,这篇文章很早就在博客的草稿箱中,不知为何 csdn 一直审核不过。提交审核也没有显示审核不过的具体原因!文章就是一个分享我的一个安卓开发经历,没有啥违规吧!?怪哉,怪哉!
作为一名嵌入式软件工程师,对于移动开发可以说知之甚少,于是乎各种 google 搜索补课。经过了解,android 开发最开始使用 eclipse adt,后来在 android ag凯发k8国际官网找到一篇博客说,google 将结束对 eclipse adt 的开发以及停止支持,把重心完全转移到android studio。那我就从 android studio。
其实,在 android studio 刚发布的时候,我就了解过这个 ide。当初听说谷歌发布了新的开发工具,出于好奇就下载了看了看。只是本人并不是做安卓开发的,安装后还要从谷歌下载一堆东西,感觉好麻烦也就没有做太多的了解。如今还是得继续学习一下。
由于我也是个移动开发的外行,因此本文并不会系统说明如何进行 android 开发,当然,我也没有这个能力。所以,以下文章就是记录我第一次搞 app 的一些记录。记录一下我遇到的问题及处理方法。还有就是,由于是初学,往往是一旦有问题就需要各种头脑风暴,一不留神就跑没影了!!!
头脑风暴: 头脑风暴这个方法是怎么来的?谁创建的?
头脑风暴: google 最近又搞了一个 fuchsia os,目前用途还不详,先去了解一下!
安装很简单,下载安装包,直接一路下一步即可!貌似 windows 的一个最大的优点就是软件安装可以一路下一步,很少要考虑各种使用命令行从各种软件仓库进行安装!
根据我这段时间的使用,android 每次更新都可能出现一些列的问题,我们很有必要重点关注以下地址的内容:https://developer.android.google.cn/studio/releases
头脑风暴: python 软件仓库?node.js 软件仓库?nuget 软件仓库?linux 发行版的软件仓库?
这里所谓的配置主要是指更改 android studio 下载的各种文件的位置。如果我们不进行配置,android studio 会把我们需要的各种文件都放到系统盘的用户目录下。其中很多内容都会占用大量存储空间,而我之前装系统时分配的系统盘只有 100g,目前空间比较紧张(现在的开发工具是真的占空间,visual studio、android studio 就占了好几个 g,还没算他们下载的各种 sdk 和 工具),因此我选择将这些下载的内容放到一个指定的目录下。
.android:这个文件夹里会有模拟(avd,android virtual device manager)的相关文件,空间还是很大的。
这个需要直接建立环境变量,如下图所示:
.androidstudio:这个文件夹是 android studio 的配置文件夹,主要存放一些androidstudio设置和插件和项目的缓存信息
这里的修改需要直接修改 android studio 安装目录下的配置文件:idea.properties,如下图所示:
注意: 在后续 android studio 版本升级时,默认会覆盖该文件,所以,升级后需要重新修改该文件!!否则,导致 android studio 在升级后的第一次启动会提示找不到相关文件。
.gradle:这个文件夹是构建工具 gradle 的配置文件夹,也会存储一些项目的构建缓存信息,如下所示:
打开 android studio,菜单:file->settings,如下图所示的对话框中进行修改
2. 修改下载的 android sdk 的位置。这个直接在下载 sdk 时指定位置即可。
要使用 android studio 进行 app 的开发,必须先下载对应的 android sdk 及配套的 sdk 工具。具体方法是:file -> settings,如下图所示的位置选择需要的 sdk 及工具:
android studio 构建 app 时,还需要使用 gradle。大体了解了一下,就是一个构建工具。估计和 cmake 之类的类似吧!但是不知道为啥,这个玩意下载也是贼慢!解决方法可以直接从网上自己下载,然后放到 android studio 对应的下载目录下。 但是需要注意对应的文件夹名字!
gradle 不止下载慢的一批,编译一个 app 也是够慢的!而且每次升级 android 版本都要同步更新 gradle 插件版本以及 gradle 版本。下图是 google 官方给出的两者的对应关系:
其实不止上面他俩有版本的对应关系,他俩与 android studio 的版本也有对应关系。
头脑风暴: gradle、cmake、xmake、makelist 这些有啥区别和联系。
学习的第一步当然是建立一个默认的项目,看看它是怎么管理项目的。打开 android studio 建立第一个项目,主界面菜单内容是真多,看的眼花缭乱。
接下来就是是各种 google 搜索,了解 android studio 基本的使用方法。经过了解 android studio 中项目的基本结构大体就是下面这样了:
其中还有好多内容,后面慢慢了解。
说实话,百度的搜索结果真是一言难尽。google 的第一个大多数就是解决方法,百度却是广告等一堆没用的。
根据我的了解,android 的开发其实是可以用很多种开发语言的。其中就可以直接使用 c / c 来开发 app,使用 c / c 需要在 android sdk 中下载 ndk,现在叫 ndk(side by side)。但是,网上直接使用 c / c 来开发的示例、介绍文章比较少,无异于增加了我的开发难度,因此果断放弃。
后来,jetbrains 开发了一门兼容 java 的新的开发语言 kotlin。随着 google 和 oracle 的官司不断, google 果断宣布将 kotlin 作为 android 的官方开发语言。但是,虽然说与 java 100% 兼容,但是,好多语法都有变化,对于我来说学起来还是有些费劲的,而且,目前 kotlin 的 app 还不是很多(在我搞这个 app 的时候,kotlin 刚出没多久),因此,放弃使用 kotlin。
最后决定采用 java 进行 app 的开发。android app 开发需要安装 java sdk。同样,我对于 java 并不了解,平时基本只用 c / c ,偶尔会用 c# 或者 qt 开发一些小工具来辅助自己的开发工作。于是乎又是各种 google 搜索 java 与 android 关系的资料。以下 3 点介绍取自于知乎网友(https://zhuanlan.zhihu.com/p/378582001):
头脑风暴: java vm 与 android dalvik 有啥区别与联系
在安装 java sdk 时我也遇到了一个大坑。一开始决定使用 java 之后,就先去 oracle ag凯发k8国际官网下载 java sdk,结果直接下载了最新的 java se 16,然后编译用 android studio 建立的示例程序都是各种错误。。。后来才知道,每一个 android 版本都对应一个 java 版本,必须配合使用。
目前,android app 的开发绝大部分还在使用 java 8,部分开始过度到 java 11。于是又下载了 java 8 安装,为了担心有其他影响,我直接卸载了 java 16,此时,终于可以正常编译一些示例 app 了。后来了解到了一些 java 11 的语法改进感觉挺好,android 开发也开始支持 java 11 了,于是又下载 java se 11 进行了安装(同时保留了java 8),在 app 开发中,指定使用了 java 11。
大体了解了一下定位 app 的开发原理。无非就是以下四个:
四种方法的难易程度也是依次降低的!
- 第一种:一般人就别想了,不一般人也别想了!
- 第二种:现在最新的 android 手机厂商都已经限制 root 权限了,难度越来越大!
- 第三种:virtualapp 目前由开源转为了收发模式,原来的开源版不再支持最新的 android 10。收费版倒是很不错!太极修改定位仍然需要 root 权限
- 第四种:难度最简单
头脑风暴: 最近有网友分析了最新版的 virtualapp 源代码,已经可以支持 android 11 了,是时候再去好一波羊毛了。用不用先不管,先把分析的源码保存到自己的仓库再说。
知道了上面的实现原理接下来就是开始搞了。从头开始貌似有些难啊!抓紧去开源社区找了找。发现了不少大佬开源了一些实现方法,只是功能都不完善,仅仅是介绍了如何使用而已!在此,先感谢下面的这个几个网友:
示例不仅仅以上几个,还有很多这里就不列举了。参照以上的示例,新建工程,开始一点点写代码内容!
头脑风暴: 国内基本搜不到相关示例,再去国外找几个抄一抄吧!
开发初期,纠结到底是使用百度地图,还是高德地图,还是腾讯地图,在参考了各种示例之后,绝对采用百度地图。使用百度地图开发,开发者在使用 sdk 之前需要获取百度地图移动版开发密钥(ak),该 ak 与百度账户相关联。百度ag凯发k8国际官网有详细的步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak。参照步骤一步一步来即可。其中有个比较麻烦的就是要获取签名信息!android app 必须要有签名才可以发布。这个得专门一个章节来说。
头脑风暴: 百度地图会不会自动给我弹出广告,让我去莆田系看病!要不要竞价才能使用地图的全部功能?
头脑风暴: 我的 app 的秘钥指纹都在百度登记了,我的位置不就是直接暴露给它了?它会不会拿我的位置做大数据分析,然后有针对性的推送广告?
头脑风暴: 得去了解一下高德和腾讯是不是也是同样的使用套路
初始化百度地图
从权限的配置开始,到地图的初始化,ag凯发k8国际官网有很详细的步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap,我就是按照这个步骤来搞的。
初始化定位
刚开始比较纳闷,百度地图 sdk 和 百度定位 sdk 不是一个东西么?后来经过了解才知道,百度地图是由地图和定位两部分组成的,地图负责呈现我们看到的地图,定位负责是地图上显示的位置。
定位 sdk 的初始化配置,ag凯发k8国际官网也有详细步骤:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location,安装这个步骤操作即可。
关于游戏摇杆,网上有很多网友搞了示例,有的设置做成了库,以供大家使用。我当初也搜集了很多摇杆的实现,但是没有一个是符合我需求的。无奈只能参考各位网友的代码,自己实现了一个:
摇杆由两部分组成:方向控制部分 功能按钮部分。其中的方向控制部分我目前实现了两种:按钮和圆形,。可以根据喜好选择使用哪一种来使用(app 设置中添加了一个设置项)。
按键方向控制使用了 layout 布局来搞,圆形方向控制则直接使用代码来绘制的,目前还不会(也不知道能不能)直接通过 layout 布局来实现。
最开始,我先实现了一个按钮方向控制,因为这种比较简单,每个按钮一个点击事件,负责处理方向。在实际使用中,发现方向的控制不够灵活,只能固定的方向,而后有搞了后面这个圆形的方向控制,方向根据角度自动计算,这样就可以灵活的处理各种方向了。
最后再用一个类处理这两种类型的方向控制以及摇杆的功能按钮就可以了。这个类就用到了 android 的悬浮窗的设置。同时,要使用悬浮窗必须还要请求权限。
第一次写 android app,问题一大堆,总是时不时有崩溃!最开始,在我的华为手机上用的好好的,结果后来换了个小米,安装、打开、闪退。。。一上来就凉凉崩溃了。。。一搜索才知道,国内这些手机厂商推出的安卓都是自己瞎胡搞的,app 需要适配各家的手机系统!!!我就一个摔坏的华为,一个屌丝小米。。。
在了解的过程中,发现有许多现成的日志库,可以实时记录 app 的运行状态,如果出现了问题,就可以从日志中查找原因。于是又是各种 google,发现还真不少:logger、xlog、微信mars-xlog、klog 等等。
直接查看各个日志库的手册,看看哪个用起来最简单,哪个更新比较活跃。最终经过一份对比,我选择了 xlog 来记录 app 中的各种信息。配置一下就可以直接在所有文件中直接调用了:
其实最开始我看好多人分享的代码中,经常有 log.i、log.e、log.d 等这些东西,后来经过了解才知道,这个其实是 android 官方提供的 log 库,我们可以用它来输出很多调试信息。只不过,这个有些简陋,很多人就搞了一些功能更强大的日志库。
在添加完日志之后,紧接着就是要实现分享。因为文件是放在 app 的安装目录中的,用户一般没有权限看到这个目录,也因此不能获取到这个文件。而且如果让用户来主动找文件发送给作者,也太麻烦了!
在 android ag凯发k8国际官网搜了一下,android 原生就有分享功能,直接使用原生的分享非常简单,官方教程:https://developer.android.google.cn/training/secure-file-sharing?hl=zh_cn 。按照ag凯发k8国际官网的实现之后就是下面这样了:
百度地图 定位配置完成后,发现定位的指针不会随着方向变化而变化。经过搜索才知道需要添加对于方向传感器的静态操作。找了很多网友分享的方法,基本都是下面这样的:
...省略... msensormanager=(sensormanager) context.getsystemservice(context.sensor_service);if(msensormanager!=null){//获得方向传感器msensor=msensormanager.getdefaultsensor(sensor.type_orientation);}if(msensor!=null){msensormanager.registerlistener(this, msensor,sensormanager.sensor_delay_ui);//第三个参数为经度}...省略...@override public void onsensorchanged(sensorevent event) {//如果事件返回的类型是方向传感器if(event.sensor.gettype()==sensor.type_orientation){float x=event.values[sensormanager.data_x];//如果变化大于一度if(math.abs(x-lastx)>1.0){//通知主界面进行回掉if(monorientationlistener!=null){monorientationlistener.onorientationchanged(x);}}lastx=x;} }经过我的测试,根本就无效!!由于 sensor.type_orientation 被 google 标记为 过时,也有的文章中直接将 sensor.type_orientation 换成了 sensor.type_accelerometer,实际也是不行的。
经过我在 android ag凯发k8国际官网传感器介绍(https://developer.android.com/guide/topics/sensors/sensors_overview)中的不断摸索,以及在 google 上不断搜索,最终找到解决方法:需要同时使用 sensor.type_accelerometer 和 sensor.type_magnetic_field 。具体代码如下:
...省略... msensormanager = (sensormanager) getsystemservice(sensor_service);// 获取传感器管理服务 if (msensormanager != null) {msensoraccelerometer = msensormanager.getdefaultsensor(sensor.type_accelerometer);if (msensoraccelerometer != null) {msensormanager.registerlistener(this, msensoraccelerometer, sensormanager.sensor_delay_ui);}msensormagnetic = msensormanager.getdefaultsensor(sensor.type_magnetic_field);if (msensormagnetic != null) {msensormanager.registerlistener(this, msensormagnetic, sensormanager.sensor_delay_ui);} } ...省略... @override public void onsensorchanged(sensorevent sensorevent) {if(sensorevent.sensor.gettype() == sensor.type_accelerometer){maccvalues = sensorevent.values;}else if(sensorevent.sensor.gettype() == sensor.type_magnetic_field){mmagvalues = sensorevent.values;}sensormanager.getrotationmatrix(mr, null, maccvalues, mmagvalues);sensormanager.getorientation(mr, mdirectionvalues);mcurrentdirection = (float) math.todegrees(mdirectionvalues[0]); // 弧度转角度if (mcurrentdirection < 0) { // 由 -180 ~ 180 转为 0 ~ 360mcurrentdirection = 360;} }compatible side by side ndk version was not found.
这个是由于默认没有安装 ndk,android studio 给出的一个提示,项目不使用 ndk 其实没啥影响。强迫症患者,可以考虑安装 ndk。
具体:菜单 tools --> system settings --> sdk manager–> android sdk–> sdk tools–> show package detail -->找到 ndk(side by side) ,下载并安装即可。
ndk was located by using ndk.dir property.
build 的时候提示如下的警告:ndk was located by using ndk.dir property. this method is deprecated and will be removed in a future release. please delete ndk.dir from local.properties and set android.ndkversion to [21.3.6528147] in all native modules in the project. https://developer.android.com/r/studio-ui/ndk-dir。我记得 google 在刚推出 android studio 时, ndk 的结构并不是现在这个样子。后来 google 对 ndk 进行了一次大的更新!这个可以在 android 官方文档中找到。
英文说得很明白,使用 ndk.dir 指定 ndk 的位置的方法过时了,推荐下面的方法:
注意:如果有多个模块(module),则每个模块都需要单独添加!
note: recompile with -xlint:deprecation for details.
在编译项目的时候,总是会出现如下的警告:
上面的这两句话说的很明白,这个问题是由于我们的源码中使用了一些已经过时的api。详细信息可以使用 -xlint:deprecation 参数来查看。那么具体咋么用呢?如下:
在项目的 build.gradle 文件中加入:
allprojects {gradle.projectsevaluated {tasks.withtype(javacompile) {options.compilerargs << "-xlint:unchecked" << "-xlint:deprecation"}} }然后重新编译我们的源码,我们就可以查看到底用了哪些过时的 api 的详细信息
注意:以上的提示在中文系统中是乱码:
解决方法:
no version of ndk matched the requested version 21.0.6113669. versions available locally: 21.3.6528147
最近项目升级了最新的 gradle 插件 classpath 'com.android.tools.build:gradle:4.0.1',在编译项目的的时候出现了如下错误:
项目并没有使用 ndk,不知道是不是与百度地图的 sdk 中的 .so 文件有关系。解决方法:
[cxx1101] ndk at d:\android\android-sdk\ndk\23.0.7599858 did not have a source.properties file
这个问题是由于没有正确安装 23.0.7599858 这个版本的 ndk,直接从 sdk manager 中安装即可!我之所以出现这个问题是由于,我有两台电脑,在其中一台改代码时,顺便更改了程序中 ndk 的版本,换另一台电脑后,git 同步代码之后,就忘了 ndk 这回事,实际我这台电脑并没有安装这个版本的 ndk。
未完待续…
互联网
总结
以上是ag凯发k8国际为你收集整理的android 之一 android studio 安装、配置等新手入门 百度地图定位 移动摇杆 的实现的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 华大 mcu 之六 segger emb
- 下一篇: