Android華為推送整合從掉坑到爬坑
Android的推送一直是個大坑,好在統一聯盟的的推送在測試了,希望早點一統推送,挖去開發者的心病吧。在此之前,該踩坑還是踩坑,按官方文件一步步踩吧。
整合
-
先整合必備套件 HMS SDK Agent
- 下載地址: HMSAgent_2.6.3.301.zip
-
解壓後執行GetHMSAgent_cn.bat檔案生成我們所需的檔案,輸入我們的應用包名和後臺配置應用生成的appid,回車執行, cpid沒有可以跳過繼續,按需整合所需要的功能。
解壓目錄、執行檔案和生成後文件夾.png
命令執行過程.png
- 程式碼拷貝
- 標準的AS專案直接拷貝到app/src/main/下即可
- 轉換成AS專案的我將java下的資料夾及AppManifestConfig.xml檔案拷貝至src/下,結構如圖
拷貝後目錄結構.png

生成檔案目錄.png
-
自動整合
專案build.gradle配置
allprojects { repositories { ··· maven {url 'http://developer.huawei.com/repo/'} } }
app的build.gradle配置
dependencies { ··· //說明:{version} 替換為實際的版本號,如:compile 'com.huawei.android.hms:push:2.6.3.301' compile 'com.huawei.android.hms:push:{version}' }
最後進行同步配置
-
手動整合
畢竟現在都用AS了,自動整合的方便手動整合你想象不到啊,奈何還有Eclipse轉成AS的專案,怎麼都下載不到依賴包,只能老老實實手動集成了
- SDK下載: hmssdk-gradle-2.6.3.301.zip
- 解壓後進行程式碼拷貝,這裡資料夾結構簡單,直接全部複製到對應工程相應資料夾即可
解壓目錄.png
開始配置與初始化
-
配置manifest檔案 <記得更改appid和${PACKAGE_NAME}>
因為當前應用只需要推送功能,所以我只集成了推送必須項
- 配置appid application節點下
<meta-data android:name="com.huawei.hms.client.appid" <!-- value的值“xxx”用實際申請的應用ID替換,來源於開發者>聯盟網站應用的服務詳情。--> android:value="appid=xxx"> </meta-data>
- 配置自定義的Application,這個開發過程中我們都會做的
- 配置BridgeActivity --定義了HMS SDK中一些跳轉所需要的透明頁面
<activity android:name="com.huawei.hms.activity.BridgeActivity" android:configChanges="orientation|locale|screenSize|layoutDirection|fontScale" android:excludeFromRecents="true" android:exported="false" android:hardwareAccelerated="true" android:theme="@android:style/Theme.Translucent" > <meta-data android:name="hwc-theme" android:value="androidhwext:style/Theme.Emui.Translucent" /> </activity>
- 在manifest節點下增加所需許可權
<!--HMS-SDK引導升級HMS功能,訪問OTA伺服器需要網路許可權--> <uses-permission android:name="android.permission.INTERNET" /> <!--HMS-SDK引導升級HMS功能,儲存下載的升級包需要SD卡寫許可權--> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!--檢測網路狀態--> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <!--檢測wifi狀態--> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <!--為了獲取使用者手機的IMEI,用來唯一的標識使用者。--> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <!--如果是安卓8.0,應用編譯配置的targetSdkVersion>=26,請務必新增以下許可權 --> <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" /> <!-- 接收PUSH TOKEN的廣播以及PUSH訊息需要定義該許可權 ${PACKAGE_NAME} 要替換上您應用的包名 --> <permission android:name="${PACKAGE_NAME}.permission.PROCESS_PUSH_MSG" android:protectionLevel="signatureOrSystem"/> <!--接收PUSH TOKEN的廣播以及PUSH訊息需要定義該許可權 ${PACKAGE_NAME} 要替換上您應用的包名 --> <uses-permission android:name="${PACKAGE_NAME}.permission.PROCESS_PUSH_MSG" />
- 配置Receiver
<!-- 接入HMSSDK PUSH模組需要註冊,第三方相關 :接收Push訊息(註冊、透傳訊息、通知欄點選事件)廣播,此receiver類需要開發者自己建立並繼承com.huawei.hms.support.api.push.PushReceiver類,參考示例程式碼中的類:com.huawei.hmsagent.HuaweiPushRevicer--> <!--“xxx”用實際的類名替換, ${PACKAGE_NAME} 要替換上您應用的包名--> <receiver android:name=".receiver.HWReciver" android:permission="com.foxhis.kft.permission.PROCESS_PUSH_MSG"> <intent-filter> <!-- 必須,用於接收token --> <action android:name="com.huawei.android.push.intent.REGISTRATION" /> <!-- 必須, 用於接收透傳訊息 --> <action android:name="com.huawei.android.push.intent.RECEIVE" /> <!-- 必須, 用於接收通知欄訊息點選事件 此事件不需要開發者處理,只需註冊就可以--> <action android:name="com.huawei.intent.action.PUSH_DELAY_NOTIFY"/> </intent-filter> </receiver>

配置自己的HWReciver.png
-
Agent初始化
在自定義的Application中的onCreat中呼叫
com.huawei.android.hms.agent.HMSAgent.init(this);
使用與測試
- 呼叫獲取token
開發文件要求:呼叫connect、請務必在應用啟動後的首個activity的onCreate方法中呼叫connect介面,確保HMS SDK和HMS APK的連線。
因為我這邊是一進去就執行獲取token,因此我將連線與申請抽成一個方法然後在啟動的Activity的onCreate中執行
image.png
- 推送測試與錯誤碼
華為推送通道因為預先配置了SHA256指紋資訊,後期測試時需要簽名打包才能進行測試,所以這裡可以預先更改下debug包的簽名模式來方便除錯,注意signingConfigs一定要在buildTypes之前,否則會出錯debug簽名配置.png
獲取成功.png
過程中剛開始一直拿不到token,四處翻找之後過一會又可以了,初步懷疑中間有什麼耗時配置,後期會好很多,擁有token之後就可以去後臺進行測試了,推送還是很快的
獲取簽名包證書指紋資訊 SHA256獲取
keytool.exe -printcert -jarfile ....\release\app-release.apk

image.png