前言
Alexa 的 App-to-App Account Linking 指的是將你的 App 賬號與 Alexa App 賬號進(jìn)行 “鏈接”们何,“鏈接” 的作用是為了通過 Amazon Echo 系列音箱來語音控制支持 Alexa 的設(shè)備水泉。App-to-App Account Linking 有兩種方式锅棕,分別 ”從您的應(yīng)用開始“ 和 ”從 Alexa 應(yīng)用開始“得滤,這篇文章講的是第一種。
對于沒有實(shí)現(xiàn)過的小伙伴臀叙,第一次實(shí)現(xiàn)可能會無從下手坐梯,因?yàn)?Google 或者百度搜索幾乎找不到相關(guān)接入的博客震嫉,而且 Alexa 的英文文檔也是比較難理解的森瘪,最重要的是在實(shí)現(xiàn)的過程中還會遇到很多坑,所以這里記錄一下责掏。
一柜砾、“鏈接” 流程
1.1 界面交互流程
分成是否安裝 Alexa App。
-
已安裝 Alexa App:打開 Alexa App换衬,跳轉(zhuǎn)到一個是否同意 “鏈接” 的頁面,點(diǎn)擊 “鏈接” 則返回到你的 App证芭。
-
未安裝 Alexa App:打開瀏覽器加載 Alexa 登錄頁面瞳浦,登錄后加載一個是否同意 “鏈接” 的頁面,點(diǎn)擊 “鏈接” 則返回到你的 App叫潦。
1.2 底層交互流程
這里貼一張文檔中的流程圖:
從流程圖上可以看到步驟是這樣的:
(1)如果用戶沒有登錄那么需要先登錄官硝,因?yàn)楹竺婧蠖伺c Alxea 交互的時(shí)候是需要通過 token 唯一識別某一個用戶的短蜕。
(2)客戶端請求后端獲取 Alexa app URL 和 LWA fallback URL傻咖。
- Alexa app URL:https://alexa.amazon.com/spa/skill-account-linking-consent?fragment=skill-account-linking-consent&client_id={ClientId}&scope=alexa::skills:account_linking&skill_stage={skillStage}&response_type=code&redirect_uri={yourRedirectUrl}&state={yourState}
- LWA fallback URL:https://www.amazon.com/ap/oa?client_id={ClientId}&scope=alexa::skills:account_linking&response_type=code&redirect_uri={yourRedirectUrl}&state={yourState}
(3)后端返回對應(yīng)的 URL卿操。
(4)在頁面上點(diǎn)擊綁定 Alexa 的時(shí)候,如果已安裝 Alexa App害淤,則打開 Alexa App,跳轉(zhuǎn)到一個是否同意 “鏈接” 的頁面镶奉。點(diǎn)擊“鏈接” 后 Alexa App 會通過 Alexa app URL 中的 redirect_uri 打開你的 App 中指定的頁面,并且返回亞馬遜授權(quán)碼崭放;點(diǎn)擊取消也是通過 redirect_uri 打開你的 App 中指定的頁面腮鞍。
(5)未安裝 Alexa App莹菱,則打開瀏覽器加載 Alexa 登錄頁面移国,登錄后加載一個是否同意 “鏈接” 的頁面。點(diǎn)擊 “鏈接” 后 Alexa App 會通過 LWA fallback URL 中的 redirect_uri 打開你的 App 中指定的頁面道伟,并且返回亞馬遜授權(quán)碼;點(diǎn)擊取消也是通過 redirect_uri 打開你的 App 中指定的頁面祝懂。
(6)客戶端拿著亞馬遜授權(quán)碼請求后端,后端去請求亞馬遜后端啟用技能并 “鏈接” 賬戶拘鞋。
(7)后端返回賬戶 “鏈接” 狀態(tài)砚蓬,也就是最終綁定成功還是失敗。
二盆色、實(shí)現(xiàn)
2.1 配置應(yīng)用鏈接
Alexa App 打開你的 App 的時(shí)候需要通過應(yīng)用鏈接跳轉(zhuǎn)回來灰蛙,所以這里需要先配置應(yīng)用鏈接。
(1)添加 Intent 過濾器:
<activity
android:name=".xxx.LinkMiddleAppActivity">
<intent-filter android:autoVerify="true"
tools:targetApi="m">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="www.example.com" />
</intent-filter>
</activity>
- android:autoVerify="true":在 Android 6.0 及更高版本的設(shè)備上安裝應(yīng)用隔躲,系統(tǒng)會去驗(yàn)證應(yīng)用中的 host摩梧,如果與后面配置的 https://xxx/.well-known/assetlinks.json 中的 xxx 匹配,那么系統(tǒng)就會將你的應(yīng)用指定為處理該 host 的默認(rèn)程序宣旱。
- scheme+host:組成應(yīng)用鏈接 https://www.example.com仅父,打開指定 Activity 的時(shí)候就是通過這兩個來標(biāo)記的。
(2)配置 assetlinks.json
通過在線網(wǎng)站 生成 assetlinks.json 內(nèi)容:
- Hosting site domain:存放 assetlinks.json 文件的域名,需要與 Intent 過濾器中設(shè)置的 host 保持一致笙纤,這個域名讓后端提供即可耗溜。
- App package name:App 的包名。
- App package fingerprint (SHA256):App 的 SHA256省容。
填寫完成后點(diǎn)擊 “Generate statement” 按鈕即可生成 assetlinks.json 內(nèi)容抖拴。
或者手動生成,如下蓉冈,更改 package_name城舞、sha256_cert_fingerprints 即可:
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
}
}]
然后創(chuàng)建 assetlinks.json 文件,將上面的內(nèi)容復(fù)制進(jìn)去寞酿,將 assetlinks.json 文件發(fā)給后端同事家夺,讓他上傳到 www.example.com 域名的 .well-known 目錄下,然后打開 https://www.example.com/.well-known/assetlinks.json 可以看到配置的內(nèi)容即可伐弹。
最后點(diǎn)擊在線網(wǎng)站的 “Test statement” 按鈕拉馋,如果返回 success 那么就表示 assetlinks.json 文件配置成功了。
(3)測試應(yīng)用鏈接
首先將應(yīng)用安裝到手機(jī)上惨好,等待 20s 以上煌茴,讓系統(tǒng)完成異步驗(yàn)證流程。然后在終端執(zhí)行如下命令:
adb shell am start -a android.intent.action.VIEW \
-c android.intent.category.BROWSABLE \
-d "https://www.example.com"
如果可以打開你的應(yīng)用日川,那么應(yīng)用鏈接配置成功蔓腐;如果彈框讓你選擇是使用應(yīng)用打開還是瀏覽器打開,或者不彈框直接用瀏覽器打開龄句,那么應(yīng)用鏈接配置失敗回论,需要回去檢查上面的配置是否有誤。
2.2 配置技能
即在 Alexa 開發(fā)者控制臺配置技能的相關(guān)參數(shù)分歇,例如 Alexa app URL傀蓉、LWA fallback URL 中的一些參數(shù)就是在這里配置的,實(shí)際上這一步一般都是后端去完成职抡,但是有些后端也沒配置過葬燎,會導(dǎo)致客戶端使用 Alexa app URL、LWA fallback URL 的時(shí)候各種報(bào)錯缚甩,所以客戶端還是要了解一些主要參數(shù)的配置谱净,出現(xiàn)錯誤的時(shí)候才知道是哪里錯了并提醒后端改過來。
(1)登錄 Alexa Skills Kit 開發(fā)者控制臺蹄胰。
(2)在技能列表中找到需要配置的技能岳遥,選擇編輯。
(3)點(diǎn)擊左側(cè)欄的 “TOOLS”裕寨,然后再點(diǎn)擊 “Account linking”。
(4)打開 ”Allow users to link their account to your skill from within your application or website“ 開關(guān),”authorization grant type“ 選擇 Auth Code Grant宾袜。如下圖:
(5)Your Android App Authorization URI 填寫 assetlinks.json 文件的地址 https://www.example.com/.well-known/assetlinks.json捻艳。
(6)Your Redirect URLs 填寫應(yīng)用鏈接 https://www.example.com。
(7)記住這里的 ”Your Client ID“ 和 ”Alexa Client Id“庆猫,后端返回的 Alexa app URL 和 LWA fallback URL 中的 client_id 使用的是后者认轨,如果弄錯了需要告訴后端改回來,否則打開 Alxea App 會報(bào)錯月培。
2.3 獲取用戶的亞馬遜授權(quán)碼去啟用技能并 “鏈接” 賬戶
(1)請求后端獲取 Alexa app URL 和 LWA fallback URL嘁字。
(2)判斷 Alexa App 是否安裝,已安裝打開 Alexa App杉畜,未安裝打開瀏覽器加載 Alexa 登錄頁面(由于瀏覽器無法通過應(yīng)用鏈接跳轉(zhuǎn)回 App纪蜒,所以這里通過應(yīng)用內(nèi)的 WebView 加載)。如下:
private void openAlexaAppToAppUrl() {
boolean isAlexaInstalled = AppUtils.isAppInstalled("com.amazon.dee.app");
if (isAlexaInstalled) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(alexaAppUrl));
startActivity(intent);
} else {
CommonWebActivity.start(this, lwaFallbackUrl);
}
}
com.amazon.dee.app 需要在清單文件中聲明此叠,否則在 targetSdkVersion 30 及以上 AppUtils#isAppInstalled() 無效纯续。
<queries>
<package android:name="com.amazon.dee.app" />
</queries>
如果是打開 Alexa App,用戶同意 “鏈接” 后會通過 Alexa app URL 中的 redirect_uri 打開你的 App 中指定的頁面灭袁,也就是上面配置了應(yīng)用鏈接的 LinkMiddleAppActivity 頁面猬错,在該頁面獲取亞馬遜授權(quán)碼:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
String code = uri.getQueryParameter(”code“);
}
如果是打開 Web 頁面,用戶同意 “鏈接” 后會加載一個 Url茸歧,亞馬遜授權(quán)碼就在這個 Url 中倦炒,在 CommonWebActivity 頁面獲取到 Url 后將亞馬遜授權(quán)碼取出來即可:
private WebViewClient mWebViewClient = new WebViewClient() {
...
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if (url.contains("code")) {
Uri uri = Uri.parse(url);
String code = uri.getQueryParameter(”code“);
}
}
...
};
(3)拿著亞馬遜授權(quán)碼請求后端,后端去請求亞馬遜后端啟用技能并 “鏈接” 賬戶软瞎。然后后端返回賬戶 “鏈接” 狀態(tài)逢唤,也就是最終綁定成功還是失敗。
三铜涉、遇到的一些坑
3.1 無法在 Google Play 搜索到 Alexa App 進(jìn)行下載
問題:
無法在 Google Play 搜索到 Alexa App智玻。
原因:
在大陸地區(qū)下載 Alexa App 需要使用國外的應(yīng)用市場賬號。
解決:
- 使用國外的應(yīng)用市場賬號進(jìn)行下載芙代。
- 在電腦上下載再安裝到手機(jī)上吊奢。
3.2 國內(nèi)登錄 Alexa App 報(bào)錯
問題:
登錄填寫驗(yàn)證碼的時(shí)候提示驗(yàn)證碼不正確,或者登錄成功后彈框報(bào)錯:
原因:
國內(nèi)使用應(yīng)該是被限制了纹烹,Alexa App 判斷地區(qū)是國內(nèi)就不給使用页滚。
解決:
更改手機(jī)系統(tǒng)地區(qū)為美國。
如果上面改了后還不行可以嘗試以下操作:
- 更改系統(tǒng)語言為英文铺呵。
- 翻墻裹驰。
- 關(guān)閉定位。
- 拔掉 SIM 卡片挂。
3.3 Unable to link account with Alexa
問題:
跳轉(zhuǎn)到 Alexa App 后顯示 Unable to link account with Alexa幻林,如下:
原因:
后端返回的 Alexa app URL 中的 skill_stage 設(shè)置錯了贞盯。
解決:
技能發(fā)布之前 stage 需要設(shè)置成 development,發(fā)布之后設(shè)置成 live沪饺。
3.4 跳轉(zhuǎn)到 Alexa app 后不顯示提示文字
問題:
跳轉(zhuǎn)到 Alexa app 后不顯示提示文字躏敢,如圖:
原因:
賬號被限制了,可能是手機(jī)號注冊的原因整葡,也可能是識別到是國內(nèi)登錄的原因件余,總之后面這個賬號雖然能登錄,但是 Alexa App 中很多功能用不了了遭居,很坑啼器,找了很久原因。
解決:
重新注冊一個賬號俱萍。