[Android] 新版 Firebase 函式庫

今年五月,Google 推出新版 Firebase 函式庫,這是 Firebase 合併到 Google 之後最大的改版,新版 Firebase 函式庫最大的特色是,以既有的雲端平台來蒐集 APP 的分析資料,進而增進 Admob 廣告收益。Firebase 被 Google 定位為 Mobile App 的專屬平台,除了原有的儲存和即時資料庫之外,還增加了分析、廣告、推送(Cloud Message / Notifications)、認證、當機報告、Remote Config、Invites / Dynamic Links、App Indexing 等功能。最重要的是,分析紀錄的儲存無上限,而且只要加入分析函式庫,不用改程式,就能自動收集預設的事件。
細節可參考下面的投影片。
此次的改版證明了 Google 會持續強化 Firebase 的服務,不必擔心 Firebase 會跟隨同樣是 PaaS 的 Parse.com 停止服務。

最近測試了新版的 Firebase Analytics、Crash Reporting、AdMob 這三個函式庫,以下依順序介紹。

前置作業

要安裝新版  Firebase 函式庫,要將 Google Play Services 升級到版本 30 以上,並將 Google Repository 升級到版本 26 以上。

另外,在 Android Studio 的  Project Structure 可導入 Firebase Android Client API,勾選後會自動增加 INTERNET 權限,並新增 firebase-client-android 函式庫,此函式庫為雲端儲存之用,若無此需求,可不需導入。

新增 Firebase 專案

接著到 Firebase 網站,新增一個新的 Android 專案。新增的過程中,需要輸入 Android 的 Package Name,至於 SHA-1 可不填,系統會自動產生。

Firebase 會根據 Package Name 自動生成一個檔名是 google-services.json 的設定檔,這是一個內有 Firebase 帳號和 API 資訊的設定檔,請將這個檔案複製到Android Studio 專案資料夾的  app 目錄下。

最後將指定的套件名稱新增到專案層級和 app 層級的 build.gradle,要注意的是,apply plugin: 'com.google.gms.google-services' 要放在最後一行,否則編譯時會出錯!

Firebase Analytics

將下面這行加入 build.gradle,不需額外程式碼,Firebase Analytics 就能蒐集預設的事件了
compile 'com.google.firebase:firebase-core:9.6.0'
如果要蒐集自訂的事件,可參考 Firebase 文件

Firebase Analytics 和 Google Analytics 兩套產品是獨立運作的,如果 App 原本已經使用 GA,增加 Firebase Analytics 不影響 GA 的使用。

Crash Reporting

將下面這行加入 build.gradle,不需額外程式碼,App 當機時會自動發出當機報告,約莫 2 分鐘後當機報告就會出現在 Firebase Console。
releaseCompile 'com.google.firebase:firebase-crash:9.6.0'

因為 Crash Reporting 目前沒有提供「開發階段不發送錯誤」的方法,因此在開發階段發生的錯誤,也會發送到 Firebase Crash Report。暫解方法是在 Gradle 使用 releaseCompile 指令,只在 release 時加入 Crash Reporting 函式庫。

和Android 預設的當機報告不同的是,Android 的當機報告是用戶同意才會發送,因此在 Google Play Console 沒有顯示當機報告,不代表一定沒有 Crash 發生,常常是用戶沒有主動回報。Firebase 的當機報告則不需用戶同意,當有 Error 發生時,就會自動發送。

這張圖是 Firebase Crash Report 在網頁上顯示的效果,這裡可以看出錯誤是 OutOfMemoryError,這其實是 Volley 沒有用 Singleton 導致記憶體用量過高所造成的,哎呀,我的眼睛業障重啊!

AdMob

Firebase 官方文件對於 Firebase Admob 的說明是「建議使用,但可選擇的」(Firebase is recommend, but optional),意思是原本已經使用 Google Play Service 的Ads 函式庫的專案,不必改換成 Firebase Admob 函式庫(因為兩者的程式碼、package name、class name 是一樣的),但是 Google 建議更換成 Firebase Admob 函式庫,畢竟 Google 已經逐漸將 Mobile App 的重心移往 Firebase 平台。

如果要使用 Firebase Admob 函式庫,需將下面這行加入 build.gradle, 若 App 原先有使用 Google Play Service 的 ad 函式庫com.google.android.gms:play-services-ads,最好將其移除,既有的 Admob 程式碼不需修改。
compile 'com.google.firebase:firebase-ads:9.6.0'

接著到 AdMob Console 的 Analyze 功能,選擇要連結 Firebase 的 App,點選「Link to Firebase」連結,將 App 與 Firebase 專案關聯。
此時選擇已存在的 Firebase 專案(也可自動建立一個新的 Firebase 專案,然後接著按照下面的說明,先下載一個 json 格式的設定檔,然後將 Firebase SDK 整合到你的 App)

最後要注意的是,如果 App 有使用 Google Play Services 函式庫,這些 Firebase 函式庫的版本號要和 Google Play Services 版本號一致,否則編譯時會出錯。

Google 最近一直在推廣 Firebase,有興趣的朋友可以關注 Firebase 的 Twitter 帳戶,內有教學影片。

分類: , , ,

Android Arsenal - Android 第三方函式庫網站

隨著 Android 市占率的增加,以及開發工具 Android Studio 的改版,並變得越來越好用,越來越多開發者投入 Android 的開發,因此自然有越來越多 Android 函式庫被開發出來,以加速 Android 的開發。

Android Arsenal 這個網站蒐集了眾多的 Android 函式庫,讓開發者知道大家都用了哪些熱門函式庫,開發者也可以從這個網站,快速找到市面上的某個函式庫來解決某個需求。


可以依照「分類」搜尋函式庫,然後網站會依照 Rating 排名顯示每個分類下的函式庫

這個網站對於函式庫的評分(Rating),是依照每個函式庫贊 GitHub 和 Android Arsenal 網站的活動為依據去給分。

Android Arsenal 網站上的函式庫資料,基本上都是從 GitHub 取得,包括基本資料、Star 數、Fork 數等等,甚至也包括  README.md 的資料。


Android Arsenal 也有做全部函式庫的排名,不過前兩名居然是 Fond Awesome 和 Material Design Icons,這兩個函式庫根本只是美工圖庫。





分類:

[Android] 如何讓應用程式保持喚醒

如果要讓應用程式在運行中,不因為裝置休眠而導致螢幕關閉,可使用 FLAG_KEEP_SCRENE_ON ,此方法不需額外權限,範例如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
  }

也可以定義在 Layout 中
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:keepScreenOn="true">

如果需要讓 CPU 持續保持運行,不因為裝置休眠而終止,則要使用 PowerManager 的 WakeLock 來控制應用程式。
要先增加 WAKE_LOCK 權限
<uses-permission android:name="android.permission.WAKE_LOCK" />
程式碼範例如下
PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag");
wakeLock.acquire();

參考資料:Android 官網的文件 Keeping the Device Awake




分類:

在 Mac 上使用 Visual Studio Code

微軟推出 Visual Studio Code(以下簡稱 VS Code)已經一年多。VS Code 是使用 Electron(Chromium 的開源架構) 和 TypeScript 開發的,因此可以跨平台在 Windows、Linux 和 Mac 上執行。不同於 Windows 上的 Visual Studio IDE, VS Code 是類似 Sublime、Atom,Notepad++ 一樣,當作純文字編輯器來寫 JavaScript、Python 和 GoLang。

VS Code 是 Eric Gamma 主導開發,此人來頭不小,是經典書籍「設計模式」四人幫作者之一。而微軟換了執行長後擁抱開源, VS Code 也不例外,直接將程式碼開源到 Github


VS Code 主要功能包括:
  • Intellisense
  • Theme 的部分延續了 VS 一貫的黑紫色系風格
  • 支援 Git
  • 支援 Markdown 語法編輯與預覽
  • Debug 模式,支援大部分語言的除錯
  • 通過 市集可以安裝各種套件
主要嚇到我的是開大檔案的速度,一個 30 MB 的文字檔,Sublime 要五分鐘,Atom 會當掉,VS Code 大概只要一秒就開了,太神了!






分類: ,

[Android] Backup API

當用戶因故換手機或重置手機時,通常,原先安裝在 App 裡頭的資料無法跟著回復。事實上,Android 有提供 Backup API,能讓 App 端先將資料備份到雲端,待 App 重新安裝後,自動 Restore 資料。

首先,要到這個網站註冊 Android Backup Service

完成註冊後,會取得一個 API Key

然後將 API Key 連同備份代理程式名稱(這裡是 TheBackupAgent)加到 AndroidManifest.xml
<application android:label="MyApp"
             android:backupAgent="TheBackupAgent">
    ...
    <meta-data android:name="com.google.android.backup.api_key"
        android:value="ABcDe1FGHij2KlmN3oPQRs4TUvW5xYZ" />
    ...
</application>

接著開始寫備份代理程式(Backup Agent)

Backup API 可以備份檔案(亦可備份 SQLite 資料庫的 db 檔)以及 SharedPreference 資料,

下面是 SQLite db 檔和SharedPreference 資料的備份範例
原則上,當資料變動時,會執行自動備份。可以使用下面的程式手動執行備份。
BackupManager bm = new BackupManager(this);
bm.dataChanged();

可以透過 adb 來測試,指令如下:
adb shell bmgr backup packagename  # 等於dataChanged
adb shell bmgr run                 # 立即去trigger backup job
adb uninstall packagename          # 先移除App

最後再重新安裝 App,資料應該都在才對。

這種備份方式,備份檔只會有一份,保留最近更新的,而且是跟著 Google 帳號,因此兩台手機共用一個 Google 帳號的話,應該是無法還原兩台手機的資料。






分類:

Google Play 收到新評論的通知

以往,使用者在 Google Play 上寫完 App 的評論後,開發者並不會被通知,往往要隔好一陣子,開發者主動去看評論時,才會發現。為了解決這個問題,前陣子有人寫出了取名為 JonSnow 的程式,以定期爬網頁的方式,當發現有新的評論,就發送訊息到 Slack 通知開發者。

終於,Google Play Developer Console 可以設定收到新評論的通知了。到「設定」>「電子郵件通知」,勾選新評論,還可以選擇幾顆星才收到通知。


當用戶新增評論之後,就會收到一封由 no-reply-play-developer-console 發出的信件


另外,Google 也推出了「Google Play Developer Console」App,將這個 App 裝在手機上,就能隨時查詢上架的應用程式的評論與相關統計。在這個 App 也能設定當使用者更改評論後,開發者會收到通知。


Google 在每次的開發者大會或財報公布之後,常常會低調地釋出產品的新功能,多多留意 Google 相關產品的部落格,往往會有意外的發現。





分類: ,

[Android] 夜間模式

以往要實作 Android App 的夜間模式,得要自行製作不同的 Style Theme 切換。然而從 Android Support Library 23.2 版本開始,增加了 AppCompat DayNight Theme 功能,事先設置好 白天 和 夜晚 主題。需注意這裡的 DayNight Theme 只支援 Android 4.0(API 14)以上的版本。

使用方式如下:
首先將 styles.xml 的 Theme 改為 DayNight 主題
styles.xml
<style name="AppTheme.DayNight.NoActionBar">
   .....
</style>

DayNight 主題有四種模式:
  • MODE_NIGHT_NO:使用白天(白色)主題
  • MODE_NIGHT_YES:使用夜間(暗黑)主題
  • MODE_NIGHT_AUTO:根據一天當中的時間自動切換
  • MODE_NIGHT_FOLLOW_SYSTEM:遵循系統的設置,基本上是以 MODE_NIGHT_NO 為主
然後,在程式中可以透過 AppCompatDelegate.setDefaultNightMode 以及 getDelegate().setLocalNightMode() 來改變
  • AppCompatDelegate.setDefaultNightMode 是對整個 App 中主題為 DayNight Theme 有效
  • getDelegate().setLocalNightMode() 只對於設定的地方生效,用於重新設定預設值
最後,用 recurate() 來通知頁面更新
if (Config.Day) {
    //白天
    AppCompatDelegate.setDefaultNightMode(
              AppCompatDelegate.MODE_NIGHT_NO);

} else {
    //夜間
    AppCompatDelegate.setDefaultNightMode(
              AppCompatDelegate.MODE_NIGHT_YES);
}
recreate();
要注意的是,因為 Toolbar 有自己的 Theme,而 WebView 不能使用 Theme,如果畫面上的 Toolbar 和 WebView 需要套用夜間模式,要另外加工處理,除此之外,其他元件都會自動套用日間/夜間主題。

以下是實作之效果
日間模式:

夜間模式:





分類:

Copyright © Andy Cheng

Distributed By My Blogger Themes | Blogger Theme By NewBloggerThemes Up ↑