Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现
緣起
??之前在玩一款 VR 游戲:一起來捉妖。這款游戲是使用地圖進行游戲的。無奈網上找了各種工具,要么付費,要么不好使。想想自己就是個程序猿,于是乎決定自己開發一個。現在游戲基本放棄了,但是為了游戲而學到的技術不能丟,現在直接開源:https://gitee.com/zcshou/gogogo
代碼我會一直維護(趁機多學習學習),遇到的問題我也會不斷更新在這篇文章中。
??其實,這篇文章很早就在博客的草稿箱中,不知為何 CSDN 一直審核不過。提交審核也沒有顯示審核不過的具體原因!文章就是一個分享我的一個安卓開發經歷,沒有啥違規吧!?怪哉,怪哉!
初識 Android Studio
??作為一名嵌入式軟件工程師,對于移動開發可以說知之甚少,于是乎各種 Google 搜索補課。經過了解,Android 開發最開始使用 Eclipse + ADT,后來在 Android 官網找到一篇博客說,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 SDK
??要使用 Android Studio 進行 APP 的開發,必須先下載對應的 Android SDK 及配套的 SDK 工具。具體方法是:File -> Settings,如下圖所示的位置選擇需要的 SDK 及工具:
Gradle
??Android Studio 構建 APP 時,還需要使用 Gradle。大體了解了一下,就是一個構建工具。估計和 CMake 之類的類似吧!但是不知道為啥,這個玩意下載也是賊慢!解決方法可以直接從網上自己下載,然后放到 Android Studio 對應的下載目錄下。 但是需要注意對應的文件夾名字!
??Gradle 不止下載慢的一批,編譯一個 APP 也是夠慢的!而且每次升級 Android 版本都要同步更新 Gradle 插件版本以及 Gradle 版本。下圖是 Google 官方給出的兩者的對應關系:
其實不止上面他倆有版本的對應關系,他倆與 Android Studio 的版本也有對應關系。
頭腦風暴: Gradle、Cmake、Xmake、Makelist 這些有啥區別和聯系。
Android Studio 的項目
??學習的第一步當然是建立一個默認的項目,看看它是怎么管理項目的。打開 Android Studio 建立第一個項目,主界面菜單內容是真多,看的眼花繚亂。
??接下來就是是各種 Google 搜索,了解 Android Studio 基本的使用方法。經過了解 Android Studio 中項目的基本結構大體就是下面這樣了:
其中還有好多內容,后面慢慢了解。
說實話,百度的搜索結果真是一言難盡。Google 的第一個大多數就是解決方法,百度卻是廣告等一堆沒用的。
Java SDK
??根據我的了解,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 官網下載 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
原理
大體了解了一下定位 APP 的開發原理。無非就是以下四個:
四種方法的難易程度也是依次降低的!
- 第一種:一般人就別想了,不一般人也別想了!
- 第二種:現在最新的 Android 手機廠商都已經限制 ROOT 權限了,難度越來越大!
- 第三種:VirtualAPP 目前由開源轉為了收發模式,原來的開源版不再支持最新的 Android 10。收費版倒是很不錯!太極修改定位仍然需要 ROOT 權限
- 第四種:難度最簡單
頭腦風暴: 最近有網友分析了最新版的 VirtualAPP 源代碼,已經可以支持 Android 11 了,是時候再去好一波羊毛了。用不用先不管,先把分析的源碼保存到自己的倉庫再說。
??知道了上面的實現原理接下來就是開始搞了。從頭開始貌似有些難啊!抓緊去開源社區找了找。發現了不少大佬開源了一些實現方法,只是功能都不完善,僅僅是介紹了如何使用而已!在此,先感謝下面的這個幾個網友:
示例不僅僅以上幾個,還有很多這里就不列舉了。參照以上的示例,新建工程,開始一點點寫代碼內容!
頭腦風暴: 國內基本搜不到相關示例,再去國外找幾個抄一抄吧!
百度地圖
??開發初期,糾結到底是使用百度地圖,還是高德地圖,還是騰訊地圖,在參考了各種示例之后,絕對采用百度地圖。使用百度地圖開發,開發者在使用 SDK 之前需要獲取百度地圖移動版開發密鑰(AK),該 AK 與百度賬戶相關聯。百度官網有詳細的步驟:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak。參照步驟一步一步來即可。其中有個比較麻煩的就是要獲取簽名信息!Android APP 必須要有簽名才可以發布。這個得專門一個章節來說。
頭腦風暴: 百度地圖會不會自動給我彈出廣告,讓我去莆田系看病!要不要競價才能使用地圖的全部功能?
頭腦風暴: 我的 APP 的秘鑰指紋都在百度登記了,我的位置不就是直接暴露給它了?它會不會拿我的位置做大數據分析,然后有針對性的推送廣告?
頭腦風暴: 得去了解一下高德和騰訊是不是也是同樣的使用套路
初始化百度地圖
??從權限的配置開始,到地圖的初始化,官網有很詳細的步驟:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/showmap,我就是按照這個步驟來搞的。
初始化定位
??剛開始比較納悶,百度地圖 SDK 和 百度定位 SDK 不是一個東西么?后來經過了解才知道,百度地圖是由地圖和定位兩部分組成的,地圖負責呈現我們看到的地圖,定位負責是地圖上顯示的位置。
??定位 SDK 的初始化配置,官網也有詳細步驟:https://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-map/location,安裝這個步驟操作即可。
搖桿的實現
??關于游戲搖桿,網上有很多網友搞了示例,有的設置做成了庫,以供大家使用。我當初也搜集了很多搖桿的實現,但是沒有一個是符合我需求的。無奈只能參考各位網友的代碼,自己實現了一個:
搖桿由兩部分組成:方向控制部分 + 功能按鈕部分。其中的方向控制部分我目前實現了兩種:按鈕和圓形,。可以根據喜好選擇使用哪一種來使用(APP 設置中添加了一個設置項)。
??按鍵方向控制使用了 layout 布局來搞,圓形方向控制則直接使用代碼來繪制的,目前還不會(也不知道能不能)直接通過 layout 布局來實現。
??最開始,我先實現了一個按鈕方向控制,因為這種比較簡單,每個按鈕一個點擊事件,負責處理方向。在實際使用中,發現方向的控制不夠靈活,只能固定的方向,而后有搞了后面這個圓形的方向控制,方向根據角度自動計算,這樣就可以靈活的處理各種方向了。
??最后再用一個類處理這兩種類型的方向控制以及搖桿的功能按鈕就可以了。這個類就用到了 Android 的懸浮窗的設置。同時,要使用懸浮窗必須還要請求權限。
LOG 記錄
??第一次寫 Android APP,問題一大堆,總是時不時有崩潰!最開始,在我的華為手機上用的好好的,結果后來換了個小米,安裝、打開、閃退。。。一上來就涼涼崩潰了。。。一搜索才知道,國內這些手機廠商推出的安卓都是自己瞎胡搞的,APP 需要適配各家的手機系統!!!我就一個摔壞的華為,一個屌絲小米。。。
??在了解的過程中,發現有許多現成的日志庫,可以實時記錄 APP 的運行狀態,如果出現了問題,就可以從日志中查找原因。于是又是各種 Google,發現還真不少:Logger、xlog、微信Mars-xlog、Klog 等等。
??直接查看各個日志庫的手冊,看看哪個用起來最簡單,哪個更新比較活躍。最終經過一份對比,我選擇了 xlog 來記錄 APP 中的各種信息。配置一下就可以直接在所有文件中直接調用了:
??其實最開始我看好多人分享的代碼中,經常有 log.i、log.e、log.d 等這些東西,后來經過了解才知道,這個其實是 Android 官方提供的 Log 庫,我們可以用它來輸出很多調試信息。只不過,這個有些簡陋,很多人就搞了一些功能更強大的日志庫。
文件分享
??在添加完日志之后,緊接著就是要實現分享。因為文件是放在 APP 的安裝目錄中的,用戶一般沒有權限看到這個目錄,也因此不能獲取到這個文件。而且如果讓用戶來主動找文件發送給作者,也太麻煩了!
??在 Android 官網搜了一下,Android 原生就有分享功能,直接使用原生的分享非常簡單,官方教程:https://developer.android.google.cn/training/secure-file-sharing?hl=zh_cn 。按照官網的實現之后就是下面這樣了:
方向傳感器
??百度地圖+定位配置完成后,發現定位的指針不會隨著方向變化而變化。經過搜索才知道需要添加對于方向傳感器的靜態操作。找了很多網友分享的方法,基本都是下面這樣的:
...省略... 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 官網傳感器介紹(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。
未完待續…
參考
互聯網
總結
以上是生活随笔為你收集整理的Android 之一 Android Studio 安装、配置等新手入门 + 百度地图定位 + 移动摇杆 的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华大 MCU 之六 SEGGER Emb
- 下一篇: STM32 之十六 深入了解 ADC 工