全部产品
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 钉钉智能硬件
CDN

Android SDK接入指南

更新时间:2017-11-07 11:39:42

1.前言

本文旨在介绍定向流量 Android SDK的接入步骤和使用方法。

2.安装

2.1配置maven仓库

build.gradle添加阿里云maven仓库

  1. allprojects {
  2. repositories {
  3. maven {
  4. url "http://maven.aliyun.com/nexus/content/repositories/releases"
  5. }
  6. }
  7. }

2.2配置gradle依赖

  1. dependencies {
  2. compile 'com.aliyun.ams:alicloud-android-tfree:1.0.0@aar'
  3. }

2.3Proguard配置

  1. -keep class com.alibaba.sdk.android.tfree.** {*;}
  2. -dontwarn com.alibaba.sdk.android.tfree.**

3.支持的版本

定向流量 sdk支持的android最小版本为10

  1. minSdkVersion 10

4.API

4.1 TFreeClient

TFreeClient用来打开订购、退订、激活、查询等界面,获取token,使用方法参见最佳实践

  1. public final class TFreeClient{
  2. /**
  3. * 初始化
  4. * @param context
  5. * @param appid 由小沃分配
  6. * @param packageid 免流包id,由小沃分配
  7. * @param desKey 不同app使用不同的desKey,小沃分配
  8. * @param iv 不同app使用不同的iv,小沃分配
  9. * @return
  10. */
  11. void init(Context context,String appid,String packageid,String desKey,String iv);
  12. /**
  13. * 流量包订购
  14. * @param context
  15. * @param telephone 电话号码,可选
  16. * @param callback 回调
  17. */
  18. void TFreeClient.openOrderActivity(Context context,String telephone,IActivityCallback callback);
  19. /**
  20. * 获取用户订购关系
  21. * @param context
  22. * @param telephone 电话号码
  23. */
  24. void TFreeClient.openQueryRelationActivity(Context context,String telephone);
  25. /**
  26. * 用户激活,通过代理方式
  27. * @param context
  28. * @param telephone 电话号码,可选
  29. * @param callback
  30. */
  31. void TFreeClient.openActiveUserActivity(Context context,String telephone,IActivityCallback callback);
  32. /**
  33. * 流量包退订
  34. * @param context
  35. * @param telephone 电话号码,可选
  36. * @param callback
  37. */
  38. void TFreeClient.openUnOrderActivity(Context context,String telephone,IActivityCallback callback);
  39. /**
  40. * 获取鉴权的结果-同步
  41. * @param host 源站host
  42. * @param force 是否强制刷新,true会启动一次刷新,但是本次依旧会使用缓存的数据
  43. * @return
  44. */
  45. AccessInfo TFreeClient.getAccessInfoSyncByHost(String host,boolean force);
  46. /**
  47. * 获取鉴权的结果-异步
  48. * @param host 源站host
  49. * @param force 是否强制刷新
  50. * @param callback
  51. * @return
  52. */
  53. void TFreeClient.getAccessInfoAsyncByHost(String host,boolean force,IAccessInfoCallback callback);
  54. }

4.2 AccessInfo

AccessInfo是鉴权结果。

  1. public class AccessInfo {
  2. public boolean success;//是否获取成功
  3. public String code;//失败的code
  4. public String subCode;//失败的具体code
  5. public String msg;//失败的原因
  6. public String authinfo;//鉴权信息
  7. }

失败的code和msg:

code 意义 subcode 意义
“5001” 需要订购
“0001” 用户无权限(未订购指定套餐)
”2103“ 未订购产品用户
“5002” 需要激活
“0004” 用户的deviceid不正确
“2101” 产品未激活,请激活产品
“2111” 用户手机号码或订单号码错误
“2113” 该订单号码没有对应的用户
“-1002 SIM卡改变
“5003” 需要订购或激活
“-1000” 没有免流信息,需要先订购或激活
“5004” 不用走免流
“2104” 用户流量已用完
“-1001” 不是联通网络
“-1003” 免流关闭
“5005” 需要联系小沃客服
“2102” 用户行为异常,请重新鉴权
“2112” 该订单存在异常
“5100” 其他错误
“2110” 设备标识码未上传
“9001” 请求签名有误
”9002“ 请求参数有误
”9999“ 系统异常

4.3 IActivityCallback

IActivityCallback为流量包订购、退订、激活的回调。

  1. public interface IActivityCallback {
  2. void onSuccess();
  3. void onFail(String code,String msg);
  4. }

onFail中错误码:

“1001”:激活失败

“1002”:订购失败

“1003”:退订失败

“1004”:结果解析失败

“1005”:其他失败

4.4 IAccessInfoCallback

IAccessInfoCallback为异步获取授权信息的回调。

  1. public interface IAccessInfoCallback {
  2. void result(AccessInfo result);
  3. }

5.最佳实践

5.1 初始化

调用TFreeClient.init方法,设置appid、packageid、desKey,这些参数由小沃提供,该方法只需要调用一次,建议在Application.onCreate中调用:

  1. public class DemoApplication extends Application{
  2. private final static String APPID = "***";
  3. private final static String PACKAGEID = "***";
  4. private final static String DESKEY = "***";
  5. private final static String IV = "***";
  6. @Override
  7. public void onCreate() {
  8. super.onCreate();
  9. TFreeClient.init(getApplicationContext(),APPID, PACKAGEID, DESKEY, IV);
  10. }
  11. }

5.2 申请权限

由于READ_PHONE_STATE权限在Android 6.0及以上的版本中需要动态请求,所以在合适的地方加上权限请求代码:

  1. if (ContextCompat.checkSelfPermission(this, permission.READ_PHONE_STATE)
  2. != PackageManager.PERMISSION_GRANTED){
  3. ActivityCompat.requestPermissions(this,
  4. new String[] { Manifest.permission.READ_PHONE_STATE}
  5. , READ_PHONE_STATE_PERMISSIONS);
  6. }

5.3 提示订购或激活流量包

根据用户的选择调用TFreeClient中的接口。

5.4 发起免流请求

调用getAccessInfoSyncByHost或getAccessInfoAsyncByHost获取鉴权信息成功后,将AccessInfo.authinfo放入请求的header中,以HttpsURLConnection为例:

  1. HttpURLConnection connection = (HttpURLConnection) myUrl.openConnection();
  2. ......
  3. connection.setRequestProperty("User-agent",AccessInfo.authinfo);

如果鉴权通过,正常情况是返回200;如果鉴权失败,会返回403,原因会出现在响应头X-Tengine-Error中,类似(X-Tengine-Error: tfree auth failed: json decode error),可能有如下几种情况:

  1. no user-agent : 没有user-agent
  2. no Alitfree : user-agent中没有Alitfree()包裹的鉴权信息
  3. decode base64 error : Alitfree()包裹的鉴权信息base64 decode失败
  4. json decode error : Alitfree()包裹的鉴权信息base64 decode之后,做json decode失败
  5. invalid expired : expired值无效,如不为数字
  6. expired url : url的鉴权信息过期
  7. no verify : 没有verify
  8. invalid verify : 计算的verify值不相等,鉴权失败

如果鉴权失败,建议调用getAccessInfoAsyncByHost强制刷新后,重新请求。

6. 其他说明

6.1 上网的SIM卡不是订购流量包的手机号

目前无法对SIM卡和手机号进行校验,所以无法判断出使用的SIM卡与订购流量包的手机号是否一致。

如果是联通网络,只会对订购流量包的手机进行计费。如果非联通网络,则不会走免流。

6.2 鉴权成功后如果查询流量失败会怎样处理?

这种情况会走免流

6.3 对于不同上网网络怎么处理的?

sdk会判断当前上网的网络情况,只有在联通网络是才会正常获取鉴权信息,如果非联通网络则获取不到鉴权信息。

6.4 app卸载后重装是否需要重新激活?

需要重新激活,app通过sdk可以判断出当前没有订购或者没有激活,自行提示用户。

本文导读目录