好天氣APP(天氣預報、空氣品質、生活建議、災害預警、出行建議、城市切換、城市搜尋、世界國家/地區的城市、常用城市、背景更換、應用自動更新)
(運用百度定位、百度地圖與和風天氣API制作)
示範視訊位址
GIF圖

掃描二維碼下載下傳安裝
這個項目初始版本分9篇部落格文章寫完,請陸續閱讀實作。項目的源碼我放在最後一篇部落格的最後了,最後一篇文章也隻是暫時的,會一直按想法來更新下去,代碼和部落格都會有更新,敬請期待。
由于内容實在太多,故按章節來寫,如果你想真的了解,請一篇一篇的看完,并且自己實作,當然源碼我是會貼出來的,你也可以先去下載下傳運作後再做打算。
前言
正所謂天有不測風雲,是以有一個好的天氣是很重要的,在古代,人們看天氣都是查時節看天色,在夏商時代,人們已經開始從事農業生産,靠天吃飯的需求,讓天氣預報成為剛需。不過,當時沒有氣象科學,人們光靠擡頭看天和占蔔來觀測和預報天氣。當然,預報準确率就不得而知了。
在我國最早的詩歌總集《詩經》中,記錄了古人們的看天經驗。
《詩經》中《邶風·北風》:“北風其涼,雨雪其雱。……北風其喈,雨雪其霏。……”雱,雨雪盛大;喈,風疾。霏,雨雪紛飛。意思是說寒冷北風吹到、風大,帶來的雨雪也大。這不是曆史上對冷空氣的最早描述麼?
經驗是古人進行天氣預報的主要依據。遠在漢代,就已經有利用琴弦感應濕度的原理預測晴雨的事例了。元末明初婁元禮在《田家五行》一書中也說:如果品質很好的幹潔弦線忽然自動變松寬了,那是因為琴床潮濕的緣故;出現這種現象,預示着天将陰雨。他還談到,琴瑟的弦線所産生的音調如果調不好,也預兆有陰雨天氣,這也是合乎科學道理的。(PS:上面這段文字很明顯,是我從網上找的,然後Ctrl C + Ctrl V 愛看您就看,不看就往下走。),而現代人靠科技的力量,今天我們就是靠代碼來看天氣了,進入正題。
一、開發準備
1.資料和思維邏輯
天氣APP最重要的就是資料,首先是你的定位資料,怎麼擷取,通過手機自動的GPS定位來擷取詳細的位置,然後通過這個位置來通路天氣API接口,然後接口傳回資料,你将傳回的資料解析出來獲得想要的内容在頁面上進行渲染,同時,也要進行其他城市的天氣資料查詢,這時候你就需要拿到全國省市縣的資料,選擇之後得一個城市,再進行一次天氣查詢,至此我們的APP就完成了,當然還有優化的空間,這個我們在開發過程中慢慢來寫出來。
2.百度開發者賬号申請與應用建立
正所謂工欲善其事必先利其器,巧婦難為無米之炊,古話就說了,做任何事之前做好準備工作,否則開發起來就比較頭疼,不要想到什麼就做什麼,要按照之前指定的思路來一步一步的實作,過程是很繁瑣和枯燥的,但是最終寫完運作成功之後,是很有成就感的,程式員需要成就感這種東西,這能讓你一直保持思維活躍和自信。
百度地圖開放平台
進去之後可以通過QQ、微網誌、微信,快捷登入這樣可以省略注冊這一步,節省時間。我是用的QQ登入的。登入成功之後 進入控制台→應用管理→我的應用→建立應用
這裡需要三個資料,調試版的秘鑰,釋出版的秘鑰,和你的應用包名;
這裡我們一個一個來說明怎麼擷取,
① 擷取應用包名
首先要建立一個項目才行,
File → New → New Project
預設是選擇Empty Activity(空的活動),這裡不用改動,點選Next進入下一步
認真的看一下下圖,根據自己的資訊來填寫資料,沒有問題就Finish建立項目。
項目建立完成之後打開AndroidManifest.xml檔案複制包名,到百度開放平台注冊粘貼上,
這時,先在手機上運作一下,當你看到這個畫面的時候:
就說明你目前的測試環境沒有問題,測試版本也沒有問題,因為通過USB安裝就是屬于調試版本,然後就可以擷取開發版SHA1了
② 擷取開發版SHA1
滑鼠點選右側邊欄的Gradle→ app→Tasks→ android→ 輕按兩下signingReport
當你的AS版本為最新版時,你會發現這裡好像有點不一樣了,找不到signingReport了,這是AS更新之後預設這個功能關掉了,需要去手動打開它。在設定裡面
如下圖這裡預設勾選上了,現在把這根勾選上的去掉,
然後Sync,或者點選這個小圖示。
然後你的項目的右側邊欄就會出現這個熟悉的task了。
我們來看一下詳細的日志
這個地方别找錯啊,否則會出現你意想不到的錯誤,要想後面不出問題,前面的路就要鋪平,不要粗心大意。這裡每個人生成的秘鑰都是唯一的,是以别複制我的上去,用自己生成釋出版SHA1,複制到剛才的建立應用的網頁上。
③ 擷取釋出版SHA1
Build → Generate Signed Bundle or APK
然後選擇APK , Next下一步
這裡是沒有秘鑰的,需要建立一個新的秘鑰,點選 Create New…
先建立項目的jks檔案
命名我就是用的GoodWeather,則生成jks檔案就是GoodWeather.jks,然後點OK,
對于Demo來說你可以把密碼設定的一樣,這樣會減少你的錯誤發生,你設定的密碼最好是有記憶點,否則到時候忘記了再找回就比較麻煩了(PS:我是經曆過這個環節),然後點選OK,會出現一個這樣的提示
這個彈窗的意思就是告訴你,你這樣建立秘鑰已經不符合現在的标準了,但是你依然可以這樣建立,我印象中AS2.X版本的時候這樣建立是沒有問題,點選OK進入下一步。
上面還有一個地方要改一下就是APK生成的位置,我不希望它生成在項目裡面的預設檔案夾,因為找起來不友善,還有一個原因就是clean Project的時候會删除掉你的APK,不管是調試版還是釋出版,點選那個小檔案夾進行路徑修改
可以看到,我放的位置和我剛才生成jks是同一級,然後建立了一個GoodWeather的檔案夾用來存放釋出版的APK檔案。
點選Finish
等進度條跑完就建立完成了。
這個時候你的APK就建立成功了,你可以打開檔案夾看一下這個APK
這個就是你生成的APK所在位址。以你自己前面設定的路徑為準。接下來進入Terminal工具輸入如下圖所示的指令和jks存放路徑
//如果你前面的步驟和我一模一樣的話,這裡你就可以複制粘貼,不一樣的話就修改jks的路徑就可以了
keytool -list -v -keystore E:\APK\GoodWeather.jks
輸入這行指令之後回車會讓你輸入密碼,就是之前建立秘鑰的的那個密碼,輸入的過程中你是看不見密碼的,光标也不會移動,不過不用擔心,輸入無誤後回車就可以了
将釋出版的SHA1複制過去,完成你的應用的建立
送出
3.應用配置
① 下載下傳百度定位SDK
點選 開發文檔 選擇 Androidd定位SDK
點選下載下傳SDK包
選擇基礎定位,然後向下滑動,下載下傳開發包
下載下傳完之後,解壓出來你會看到這樣一些檔案
② 配置百度定位SDK
然後我們來看一下開發指南
現在将解壓出來的檔案複制到你的項目裡面的libs檔案夾下
配置項目的build.gradle檔案,在android{}閉包中設定sourceSets,
sourceSets{
main{
jniLibs.srcDir 'libs'
jni.srcDirs = [] //disable automatic ndk-build
}
}
不明白上面的配置就參考下圖這樣設定(PS:我覺得我的部落格詳細的都有點啰嗦了)
這裡有一點要注意一下,就是不管是工程的配置檔案build.gradle,還是項目的build.gradle,裡面出現改動就需要Sync Now 同步你改動的配置,否則你的改動就是無效,點一下即可,然後就會在下方進度條,完畢之後你的配置就生效了,
這個jar可以展開就說明你的配置生效了,有一些讀者說按照操作來還是沒有展開,是以我在這裡再介紹一種方式,滑鼠右鍵點選這個jar包,點選Add As Library…
點選OK,然後就會添加進去。
接下來就要用這個建立應用時生成的AK了,
在你的AndroidManifest.xml(配置檔案)中放入
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="AK"
這個AK就是之前提到過的,
接下來就是添加服務和權限了,
使用定位SDK,需在AndroidManifest.xml檔案中Application标簽中聲明service元件,每個App擁有自己單獨的定位service,代碼如下:
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"
除添加service元件外,使用定位SDK還需添加如下權限:
android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 這個權限用于通路GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 用于通路wifi網絡資訊,wifi資訊會用于進行網絡定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 擷取營運商資訊,用于支援提供營運商資訊相關的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!-- 這個權限用于擷取wifi的擷取權限,wifi資訊會用來進行網絡定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<!-- 寫入擴充存儲,向擴充卡寫入資料,用于寫入離線定位資料-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 通路網絡,網絡定位需要上網-->
<uses-permission android:name="android.permission.INTERNET"
4.權限管理(簡單了解)
在Android6.0之前權限隻需要靜态配置即可使用,而在6.0之後需要動态申請權限,
Google 在Android 6.0時提出了運作時權限管理機制,在Android 6.0之前,所申請的權限隻需要在AndroidManifest.xml列舉就可以,進而容易導緻一些安全隐患,是以,在Android 6.0 時,Google 為了更好的保護使用者隐私提出了新的權限管理機制,同時将其分為兩大類:
① Normal Permissions (普通權限)
普通權限一般不涉及使用者隐私,是不需要使用者進行授權的,比如手機震動、通路網絡等;
② Dangerous Permissions (危險權限)
危險權限一般是涉及到使用者隐私的,需要使用者進行授權(動态申請),比如讀取SIM卡狀态、通路通訊錄、SD卡讀寫等。同時危險權限又是分成各個權限組的,一個權限組中隻要有一個權限申請通過了,那麼改組的所有權限即被通過(目前是這樣的)。
接下來安裝AS的插件
File → Setting → Plugins 然後輸入Android ButterKnife Zelezny查找這個插件,之後安裝。
配合ButterKnife實作注解,從此不用寫findViewById,想着就爽啊。在Activity,Fragment,Adapter中選中布局xml的資源id自動生成butterknife注解。
安裝完插件之後AS需要重新開機一下,
重新開機之後,開始配置找個插件
在工程的build.gradle裡面加上
build.gradle代碼:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
google()
//新增
mavenCentral()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
//新增
classpath 'com.jakewharton:butterknife-gradle-plugin:10.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
//新增
maven { url "https://jitpack.io" }
//新增
mavenCentral()
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
然後在項目的build.gradle 裡面的
android閉包中加入如下代碼:
compileOptions {//指定使用的JDK1.8
sourceCompatibility = 1.8
targetCompatibility = 1.8
}
dependencies閉包裡面加入如下依賴代碼
//butterknife 綁定視圖依賴BindView,告别findById,不過你還得安裝一個butterknife插件才行
implementation 'com.jakewharton:butterknife:10.1.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
//Google Material控件,以及遷移到AndroidX下一些控件的依賴
implementation 'com.google.android.material:material:1.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
implementation 'androidx.annotation:annotation:1.1.0'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
//RecyclerView最好的擴充卡,讓你的擴充卡一目了然,告别代碼備援
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.30'
//權限請求架構
implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation "io.reactivex.rxjava2:rxjava:2.0.0"
//狀态欄
implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
//支援okhttp
implementation 'com.squareup.okhttp3:okhttp:3.8.1'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
implementation 'com.squareup.okhttp3:logging-interceptor:3.4.1'
然後Sync同步一下
現在基本的準備工作都做完了,開始定位吧!(PS: 你是不是迫不及待了呢?講真的,你看了這麼久,有沒有覺得累呢?反正寫的人是累了)