天天看點

Android 天氣APP(一)開發準備

好天氣APP(天氣預報、空氣品質、生活建議、災害預警、出行建議、城市切換、城市搜尋、世界國家/地區的城市、常用城市、背景更換、應用自動更新)

(運用百度定位、百度地圖與和風天氣API制作)

​​示範視訊位址​​

GIF圖

Android 天氣APP(一)開發準備

掃描二維碼下載下傳安裝

  這個項目初始版本分9篇部落格文章寫完,請陸續閱讀實作。項目的源碼我放在最後一篇部落格的最後了,最後一篇文章也隻是暫時的,會一直按想法來更新下去,代碼和部落格都會有更新,敬請期待。

由于内容實在太多,故按章節來寫,如果你想真的了解,請一篇一篇的看完,并且自己實作,當然源碼我是會貼出來的,你也可以先去下載下傳運作後再做打算。

前言

  正所謂天有不測風雲,是以有一個好的天氣是很重要的,在古代,人們看天氣都是查時節看天色,在夏商時代,人們已經開始從事農業生産,靠天吃飯的需求,讓天氣預報成為剛需。不過,當時沒有氣象科學,人們光靠擡頭看天和占蔔來觀測和預報天氣。當然,預報準确率就不得而知了。

在我國最早的詩歌總集《詩經》中,記錄了古人們的看天經驗。

《詩經》中《邶風·北風》:“北風其涼,雨雪其雱。……北風其喈,雨雪其霏。……”雱,雨雪盛大;喈,風疾。霏,雨雪紛飛。意思是說寒冷北風吹到、風大,帶來的雨雪也大。這不是曆史上對冷空氣的最早描述麼?

  經驗是古人進行天氣預報的主要依據。遠在漢代,就已經有利用琴弦感應濕度的原理預測晴雨的事例了。元末明初婁元禮在《田家五行》一書中也說:如果品質很好的幹潔弦線忽然自動變松寬了,那是因為琴床潮濕的緣故;出現這種現象,預示着天将陰雨。他還談到,琴瑟的弦線所産生的音調如果調不好,也預兆有陰雨天氣,這也是合乎科學道理的。(PS:上面這段文字很明顯,是我從網上找的,然後Ctrl C + Ctrl V 愛看您就看,不看就往下走。),而現代人靠科技的力量,今天我們就是靠代碼來看天氣了,進入正題。

一、開發準備

1.資料和思維邏輯

  天氣APP最重要的就是資料,首先是你的定位資料,怎麼擷取,通過手機自動的GPS定位來擷取詳細的位置,然後通過這個位置來通路天氣API接口,然後接口傳回資料,你将傳回的資料解析出來獲得想要的内容在頁面上進行渲染,同時,也要進行其他城市的天氣資料查詢,這時候你就需要拿到全國省市縣的資料,選擇之後得一個城市,再進行一次天氣查詢,至此我們的APP就完成了,當然還有優化的空間,這個我們在開發過程中慢慢來寫出來。

2.百度開發者賬号申請與應用建立

  正所謂工欲善其事必先利其器,巧婦難為無米之炊,古話就說了,做任何事之前做好準備工作,否則開發起來就比較頭疼,不要想到什麼就做什麼,要按照之前指定的思路來一步一步的實作,過程是很繁瑣和枯燥的,但是最終寫完運作成功之後,是很有成就感的,程式員需要成就感這種東西,這能讓你一直保持思維活躍和自信。

​​百度地圖開放平台​​

Android 天氣APP(一)開發準備

進去之後可以通過QQ、微網誌、微信,快捷登入這樣可以省略注冊這一步,節省時間。我是用的QQ登入的。登入成功之後 進入控制台→應用管理→我的應用→建立應用

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

這裡需要三個資料,調試版的秘鑰,釋出版的秘鑰,和你的應用包名;

這裡我們一個一個來說明怎麼擷取,

① 擷取應用包名

首先要建立一個項目才行,

File → New → New Project

Android 天氣APP(一)開發準備

預設是選擇Empty Activity(空的活動),這裡不用改動,點選Next進入下一步

Android 天氣APP(一)開發準備

認真的看一下下圖,根據自己的資訊來填寫資料,沒有問題就Finish建立項目。

Android 天氣APP(一)開發準備

項目建立完成之後打開AndroidManifest.xml檔案複制包名,到百度開放平台注冊粘貼上,

Android 天氣APP(一)開發準備

這時,先在手機上運作一下,當你看到這個畫面的時候:

Android 天氣APP(一)開發準備

就說明你目前的測試環境沒有問題,測試版本也沒有問題,因為通過USB安裝就是屬于調試版本,然後就可以擷取開發版SHA1了

② 擷取開發版SHA1

滑鼠點選右側邊欄的Gradle→ app→Tasks→ android→ 輕按兩下signingReport

Android 天氣APP(一)開發準備

當你的AS版本為最新版時,你會發現這裡好像有點不一樣了,找不到signingReport了,這是AS更新之後預設這個功能關掉了,需要去手動打開它。在設定裡面

Android 天氣APP(一)開發準備

如下圖這裡預設勾選上了,現在把這根勾選上的去掉,

Android 天氣APP(一)開發準備

然後Sync,或者點選這個小圖示。

Android 天氣APP(一)開發準備

然後你的項目的右側邊欄就會出現這個熟悉的task了。

我們來看一下詳細的日志

Android 天氣APP(一)開發準備

這個地方别找錯啊,否則會出現你意想不到的錯誤,要想後面不出問題,前面的路就要鋪平,不要粗心大意。這裡每個人生成的秘鑰都是唯一的,是以别複制我的上去,用自己生成釋出版SHA1,複制到剛才的建立應用的網頁上。

③ 擷取釋出版SHA1

Build → Generate Signed Bundle or APK

Android 天氣APP(一)開發準備

然後選擇APK , Next下一步

Android 天氣APP(一)開發準備

這裡是沒有秘鑰的,需要建立一個新的秘鑰,點選 Create New…

Android 天氣APP(一)開發準備

先建立項目的jks檔案

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

命名我就是用的GoodWeather,則生成jks檔案就是GoodWeather.jks,然後點OK,

Android 天氣APP(一)開發準備

對于Demo來說你可以把密碼設定的一樣,這樣會減少你的錯誤發生,你設定的密碼最好是有記憶點,否則到時候忘記了再找回就比較麻煩了(PS:我是經曆過這個環節),然後點選OK,會出現一個這樣的提示

Android 天氣APP(一)開發準備

這個彈窗的意思就是告訴你,你這樣建立秘鑰已經不符合現在的标準了,但是你依然可以這樣建立,我印象中AS2.X版本的時候這樣建立是沒有問題,點選OK進入下一步。

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

上面還有一個地方要改一下就是APK生成的位置,我不希望它生成在項目裡面的預設檔案夾,因為找起來不友善,還有一個原因就是clean Project的時候會删除掉你的APK,不管是調試版還是釋出版,點選那個小檔案夾進行路徑修改

Android 天氣APP(一)開發準備

可以看到,我放的位置和我剛才生成jks是同一級,然後建立了一個GoodWeather的檔案夾用來存放釋出版的APK檔案。

Android 天氣APP(一)開發準備

點選Finish

Android 天氣APP(一)開發準備

等進度條跑完就建立完成了。

Android 天氣APP(一)開發準備

這個時候你的APK就建立成功了,你可以打開檔案夾看一下這個APK

Android 天氣APP(一)開發準備

這個就是你生成的APK所在位址。以你自己前面設定的路徑為準。接下來進入Terminal工具輸入如下圖所示的指令和jks存放路徑

Android 天氣APP(一)開發準備
//如果你前面的步驟和我一模一樣的話,這裡你就可以複制粘貼,不一樣的話就修改jks的路徑就可以了
keytool -list -v -keystore E:\APK\GoodWeather.jks      

輸入這行指令之後回車會讓你輸入密碼,就是之前建立秘鑰的的那個密碼,輸入的過程中你是看不見密碼的,光标也不會移動,不過不用擔心,輸入無誤後回車就可以了

Android 天氣APP(一)開發準備

将釋出版的SHA1複制過去,完成你的應用的建立

Android 天氣APP(一)開發準備

送出

3.應用配置

① 下載下傳百度定位SDK

Android 天氣APP(一)開發準備

點選 開發文檔 選擇 Androidd定位SDK

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

點選下載下傳SDK包

Android 天氣APP(一)開發準備

選擇基礎定位,然後向下滑動,下載下傳開發包

Android 天氣APP(一)開發準備

下載下傳完之後,解壓出來你會看到這樣一些檔案

Android 天氣APP(一)開發準備

② 配置百度定位SDK

然後我們來看一下開發指南

Android 天氣APP(一)開發準備

現在将解壓出來的檔案複制到你的項目裡面的libs檔案夾下

Android 天氣APP(一)開發準備

配置項目的build.gradle檔案,在android{}閉包中設定sourceSets,

sourceSets{
        main{
                 jniLibs.srcDir 'libs'
                 jni.srcDirs = []    //disable automatic ndk-build
         }
}      

不明白上面的配置就參考下圖這樣設定(PS:我覺得我的部落格詳細的都有點啰嗦了)

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

這裡有一點要注意一下,就是不管是工程的配置檔案build.gradle,還是項目的build.gradle,裡面出現改動就需要Sync Now 同步你改動的配置,否則你的改動就是無效,點一下即可,然後就會在下方進度條,完畢之後你的配置就生效了,

Android 天氣APP(一)開發準備

這個jar可以展開就說明你的配置生效了,有一些讀者說按照操作來還是沒有展開,是以我在這裡再介紹一種方式,滑鼠右鍵點選這個jar包,點選Add As Library…

Android 天氣APP(一)開發準備

點選OK,然後就會添加進去。

Android 天氣APP(一)開發準備

接下來就要用這個建立應用時生成的AK了,

在你的AndroidManifest.xml(配置檔案)中放入

<meta-data
    android:name="com.baidu.lbsapi.API_KEY"
    android:value="AK"      

這個AK就是之前提到過的,

Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

接下來就是添加服務和權限了,

使用定位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"      
Android 天氣APP(一)開發準備
Android 天氣APP(一)開發準備

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注解。

Android 天氣APP(一)開發準備

安裝完插件之後AS需要重新開機一下,

Android 天氣APP(一)開發準備

重新開機之後,開始配置找個插件

在工程的build.gradle裡面加上

Android 天氣APP(一)開發準備

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: 你是不是迫不及待了呢?講真的,你看了這麼久,有沒有覺得累呢?反正寫的人是累了)