访问Alexa的API,必须要携带AccessToken,也就是必须要登录授权,本文主要记录Amazon Alexa在Android平台上的登录授权过程。

一、在亚马逊开发者平台注册应用

进入亚马逊开发者平台的Alexa栏

https://developer.amazon.com/edw/home.html#/

点击Alexa Voice Service的Get Started,进入到应用管理页面

选择注册一个产品,我这边选的是application,然后开始填写相关信息。

这里Application Type ID必须唯一,并且需要记住这个id,在代码中需要加入这个id,Display Name是授权时用户会看到的名字。填好进入下一步

创建Profile,Profile应该就是登录授权时要校验的信息,这里选择新建一个,填好信息进入next

选择Android/Kindle Settings栏,填写相关信息,其中Package和Signature是校验的关键,Package是实际Android工程的包名,Signature是签名的MD5值,debug阶段也是需要有一个debug的签名的。

生成签名:

keytool -genkey -alias xxx -keyalg RSA -validity 20000 -keystore yyy.keystore

xxx : keystore的alias 
20000 : keystore的有效天数 
yyy.keystore : keystore的名称

查看签名信息:

keytool -list -v -alias <xxx> -keystore <yyy.keystore>

填好后点击add,会生成一个key

这个key很重要,也是需要导入的Android工程中的,具体导入见后文。后面完善好信息项目就创建完成了,接下来就需要在Android工程中添加相关代码了。

二、添加登录授权相关代码到Android工程

1、下载login with Amazon的sdk,下载地址:https://developer.amazon.com/sdk-download,下载后加入到工程中。

2、manifest中增加网络访问权限

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

3、manifest中声明WorkflowActivity

<activity android:name="com.amazon.identity.auth.device.workflow.WorkflowActivity" android:theme="@android:style/Theme.NoDisplay"
android:allowtaskreparenting="true" android:launchmode="singleTask">
<intent-filter>
<action android:name="android.intent.action.VIEW">
<category android:name="android.intent.category.DEFAULT">
<category android:name="android.intent.category.BROWSABLE">
<!-- android:host must use the full package name found in Manifest General Attributes -->
<data android:host="${applicationId}" android:scheme="amzn">
</intent-filter>
</activity>

4、添加Key

在assets目录下新建api_key.txt文件,内容为之前profile中的key

5、增加登录授权相关代码

private RequestContext requestContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestContext = RequestContext.create(this); requestContext.registerListener(new AuthorizeListener() { /* Authorization was completed successfully. */
@Override
public void onSuccess(AuthorizeResult result) {
/* Your app is now authorized for the requested scopes */
    //result.getAccessToken 就是需要的AccessToken
    }

    /* There was an error during the attempt to authorize the
application. */
@Override
public void onError(AuthError ae) {
/* Inform the user of the error */
} /* Authorization was cancelled before it could be completed. */
@Override
public void onCancel(AuthCancellation cancellation) {
/* Reset the UI to a ready-to-login state */
}
});
View loginButton = findViewById(R.id.login_with_amazon); loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final JSONObject scopeData = new JSONObject();
final JSONObject productInstanceAttributes = new JSONObject(); try {
productInstanceAttributes.put("deviceSerialNumber", Settings.Secure.getString(getContentResolver(),
Settings.Secure.ANDROID_ID));
scopeData.put("productInstanceAttributes", productInstanceAttributes);
scopeData.put("productID", PRODUCT_ID);//这里的PRODUCT_ID就是之前申请的Application ID
AuthorizationManager.authorize(new AuthorizeRequest.Builder(requestContext)
.addScope(ScopeFactory.scopeNamed("alexa:all", scopeData))
.forGrantType(AuthorizeRequest.GrantType.ACCESS_TOKEN)
.shouldReturnUserData(false)
.build());
} catch (JSONException e) {
Log.e(TAG,"JSONException = "+e);
}
});
}
@Override
protected void onResume() {
super.onResume();
requestContext.onResume();
}
@Override
protected void onStart(){ super.onStart();
Scope[] scopes = { ALEXA_ALL_SCOPE };
AuthorizationManager.getToken(this, scopes, new Listener<AuthorizeResult, AuthError>() {

    @Override
public void onSuccess(AuthorizeResult result) {
if (result.getAccessToken() != null) {//
就是需要的AccessToken
  /* The user is signed in */
} else {
  /* The user is not signed in */
} } @Override
public void onError(AuthError ae) {
/* The user is not signed in */
} }); }
 

代码比较简单易懂,具体可以参见

https://developer.amazon.com/public/apis/engage/login-with-amazon/docs/use_sdk_android.html

Amazon Alexa登录授权(Android)的更多相关文章

  1. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  2. 网站微信登录授权 ASP.NET

    最新做一些项目都有微信登录注册什么的,今天就把自己整理的demo提供给大家 微信认证流程(我自己简称三次握手): 1.用户同意授权,获取code 2.通过code换取网页授权access_token, ...

  3. MVC 自定义过滤器/特性来实现登录授权及验证

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精    最近在做自学MVC,遇到的问题很多,索性一点点总结 ...

  4. Google用户登录界面 Android实现

    实验效果: 项目目录: Java代码(放在Src文件下) package com.bn.chap9.login; import java.io.BufferedReader; import java. ...

  5. Asp.Net Core 2.0 项目实战(10) 基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  6. 06_NoSQL数据库之Redis数据库:Redis的高级应用之登录授权和主从复制

     Redis高级实用特征 安全性(登录授权和登录后使用auth授权) 设置客户端连接后进行任何其他指定前需要使用的密码. 警告:因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户 ...

  7. 关于微信登录授权获取unionid的方法

    前言:微信登录授权是目前普遍存在于小程序的,还有一种静默授权方式是微信提供的但是不推荐使用,由于不同设备登录openid是不同的那么我们应该怎样拿到一个唯一的ID呢,下面做分享 wxml代码 < ...

  8. net core体系-web应用程序-4asp.net core2.0 项目实战(1)-12基于cookie登录授权认证并实现前台会员、后台管理员同时登录

    1.登录的实现 登录功能实现起来有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,当然还有其他模式,今天主要探讨一下在Asp.net core 2.0下 ...

  9. 安装mysql5.7与创建用户和远程登录授权

    环境:ubuntu18.04 参考文章:安装并远程登录授权:https://www.cnblogs.com/chancy/p/9444187.html 用户管理:https://www.cnblogs ...

随机推荐

  1. 2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛

    2060: [Usaco2010 Nov]Visiting Cows 拜访奶牛 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 252  Solved: 1 ...

  2. 一道面试题引发的pythonic

    一道测试工程师面试题(来自搜狗): 自己写了解法: # -*- coding: utf-8 -*- import re #从整体log中过滤出有用的部分,缩小搜索范围 def filter_log(t ...

  3. Android中的WebView实战详解(一)

    一.为什么要用WebView? 1.兼容已有的项目2.可动态更新 二.WebView怎样使用? WebView是一个控件,如在布局中设置: <WebView android:id="@ ...

  4. 取出关联数组的key值和values值

    取出关联数组的key值,可用 array_keys()取出; <?php $a=array("Volvo"=>"XC90","BMW&qu ...

  5. Selenium自动化脚本开发总结

    Selenium Selenium 是ThoughtWorks专门为Web应用程序编写的一个验收测试工具. Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mo ...

  6. [转]利用excel进行线性规划求解

                           利用线性回归方法求解生产计划 方法一: 1.建立数学模型: 设变量:设生产拉盖式书桌x台,普通式书桌y台,可得最大利润 ‚确定目标函数及约束条件 目标函 ...

  7. 【Troubleshooting Case】Unable to delete Exchange database?

    在我们日常邮件系统运维管理或实施部署变更中,经常会遇到,删除Exchange 数据库DB时,提示无法删除. ------------------– Microsoft Exchange Error - ...

  8. JavaScript当页面关闭时向后台发送请求

    今天做项目时遇上一个需求,当浏览器或页面关闭时将数据存储到数据库内.实现思想是采用js监测onunload然后发送请求.结果失败,刷新可以发送但是关闭并不能,整了一整天并没有解决,最后找到了解决办法. ...

  9. 模拟一个shuffle

    之所以会想到写这么一个shuffle的例子,是因为一个需求:我需要把一个有序数组中的数据随机的打散.java代码如下, public void shuffle() { int[] arr = {1,2 ...

  10. js高级程序设计学习之高级函数

    安全的类型检测 function isArray(value){ return Object.prototype.toString.call(value) === "[object Arra ...