介绍Android SDK Level 7及之前版本中各SDK的初始化。

获取Andriod安全图片

  1. 进入自有品牌App页面。
  2. 选择应用包的版本(测试版或正式版)。
  3. 上传APK包(即.apk格式的文件)。
  4. 下载安全图片。下载后的安全图片的文件名为yw_1222_xxxx.jpg
  5. 将安全图片放置到Android工程目录中的src\res\drawable路径下。
    安全图片目录
  6. 配置签名。

    Android 端上,安全图片是需要和签名搭配使用。

    说明 如果您的产品销往海外,且Android App要在Googleplay上架,上架App时请勿选择Google的签名服务。由于安全图片需要与签名搭配使用,选用Google的签名服务后会导致App无法正常启动。

    确认build.gradle文件中包含以下内容,并确保与生成APK包中配置的内容一致。

    android{
    
        signingConfigs {
            debug {
                storeFile file("./debug.keystore")
                storePassword '123456'
                keyAlias 'android'
                keyPassword '123456'
            }
        }

API通道SDK

在初始化SDK前,需要先集成安全图片,再参照下面的示例代码初始化SDK。

// 初始化无线保镖
        try {
            SecurityInit.Initialize(app);
        } catch (JAQException ex) {
            Log.e(TAG, "security-sdk-initialize-failed");
        } catch (Exception ex) {
            Log.e(TAG, "security-sdk-initialize-failed");
        }

        // 初始化 IoTAPIClient
        IoTAPIClientImpl.InitializeConfig config = new IoTAPIClientImpl.InitializeConfig();
        config.host = "api.link.aliyun.com";  // 国内环境
        //config.host = “api-iot.ap-southeast-1.aliyuncs.com”; // 海外环境,请参考如下设置
        config.apiEnv = Env.RELEASE;  //只支持RELEASE
        //设置请求超时(可选)默认超时时间10s
        config.connectTimeout=10_000L;
        config.readTimeout=10_000L;
        config.writeTimeout=10_000L;

        IoTAPIClientImpl impl = IoTAPIClientImpl.getInstance();
        impl.init(app, config);
            

安全图片未正确集成的时候,会导致安全组件初始化失败。

长连接通道SDK

初始化Mobile的长连接通道SDK前,请先初始化API通道SDK。

Mobile长连接通道SDK的初始化配置可以参照MobileConnectConfig,示例初始化代码如下。

//打开Log 输出
    ALog.setLevel(ALog.LEVEL_DEBUG);    

    MobileConnectConfig config = new MobileConnectConfig();
    // 设置 appKey 和 authCode(必填)
    config.appkey = "{YOUR_APP_KEY}";
    config.securityGuardAuthcode = "114d";


    // 设置验证服务器(默认不填,SDK会自动使用“API通道SDK“的Host设定)
    config.authServer = "";

    // 指定长连接服务器地址。 (默认不填,SDK会使用默认的地址及端口。默认为国内华东节点。)
    config.channelHost = "{长连接服务器域名}"; 

    // 开启动态选择Host功能。 (默认false,海外环境建议设置为true。此功能前提为ChannelHost 不特殊指定。)
    config.autoSelectChannelHost = false;

    MobileChannel.getInstance().startConnect(context, config, new IMobileConnectListener() {
        @Override
        public void onConnectStateChange(MobileConnectState state) {
            ALog.d(TAG,"onConnectStateChange(), state = "+state.toString());
        }
    });
            

账号及用户SDK

初始化账号及用户SDK前,请先初始化API通道SDK。

  • com.aliyun.iot.aep.sdk:account为0.0.2以及以上,请使用如下代码完成初始化
    OALoginAdapter adapter = new OALoginAdapter(application);
    
    //如果需要切换到海外环境,请执行下面setDefaultOAHost方法,默认为大陆环境
    //adapter.setDefaultOAHost("sgp-sdk.openaccount.aliyun.com");
    
    adapter.init("online","114d");
    
    LoginBusiness.init(application, adapter, "online");
                        
  • com.aliyun.iot.aep.sdk:account为0.0.2以下,请使用如下代码完成初始化。
    OALoginAdapter adapter = new OALoginAdapter(application);
    LoginBusiness.init(application,adatper,true,"online");

移动应用推送SDK

应用中注册和启动移动推送,在应用里添加初始化代码。

PushManager.getInstance().init(app, "114d"); // app => application

创建消息接收Receiver,继承自com.alibaba.sdk.android.push.MessageReceiver,并在对应回调中添加业务处理逻辑,可参考以下代码。

public class MyMessageReceiver extends MessageReceiver {
    // 消息接收部分的LOG_TAG
    public static final String REC_TAG = "receiver";
    @Override
    public void onNotification(Context context, String title, String summary, Map<String, String> extraMap) {
        // TODO 处理推送通知
        Log.e("MyMessageReceiver", "Receive notification, title: " + title + ", summary: " + summary + ", extraMap: " + extraMap);
    }
    @Override
    public void onMessage(Context context, CPushMessage cPushMessage) {
            Log.e("MyMessageReceiver", "onMessage, messageId: " + cPushMessage.getMessageId() + ", title: " + cPushMessage.getTitle() + ", content:" + cPushMessage.getContent());
    }
    @Override
    public void onNotificationOpened(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationOpened, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationClickedWithNoAction(Context context, String title, String summary, String extraMap) {
        Log.e("MyMessageReceiver", "onNotificationClickedWithNoAction, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap);
    }
    @Override
    protected void onNotificationReceivedInApp(Context context, String title, String summary, Map<String, String> extraMap, int openType, String openActivity, String openUrl) {
        Log.e("MyMessageReceiver", "onNotificationReceivedInApp, title: " + title + ", summary: " + summary + ", extraMap:" + extraMap + ", openType:" + openType + ", openActivity:" + openActivity + ", openUrl:" + openUrl);
    }
    @Override
    protected void onNotificationRemoved(Context context, String messageId) {
        Log.e("MyMessageReceiver", "onNotificationRemoved");
    }
}

将该receiver添加到AndroidManifest.xml中。

<!-- 消息接收监听器 (用户可自主扩展) -->
<receiver
    android:name=".MyMessageReceiver"
    android:exported="false"> <!-- 为保证receiver安全,建议设置不可导出,如需对其他应用开放可通过android:permission进行限制 -->
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_OPENED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.push2.action.NOTIFICATION_REMOVED" />
    </intent-filter>
    <intent-filter>
        <action android:name="com.alibaba.sdk.android.push.RECEIVE" />
    </intent-filter>
</receiver>
            

当接收到服务器下发的消息时,会触发onNotification方法。

初始化正常,方法callback.onSuccess()则会被回调。以上文接入代码为例,logcat将会打印以下日志。

11-24 12:55:51.096  15235-15535/com.alibaba.xxxx D/YourApp﹕ init cloudchannel success

确认cloudchannel初始化正常,在logcat日志中输入 awcn关键字。

11-24 12:53:51.036  15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] AUTH httpStatusCode: 200
11-24 12:53:51.036  15235-15556/com.alibaba.xxxx E/awcn﹕ |[seq:AWCN1_1] status:AUTH_SUCC

在初始化成功后使用cloudPushService.getDeviceId()获取DeviceId,如果能够成功获取,则DeviceId获取正常。

BoneMobile 容器SDK

初始化Mobile长连接通道SDK前,请先初始化API通道SDK。

在Application.onCreate函数中,添加如下初始化代码。

String serverEnv = "production";  //仅支持production,即生产环境
    String pluginEnv = "release";  //仅支持release
    String language = "zh-CN";  //语言环境,目前支持多种语言

    // 初始化 BoneMobile RN 容器
    InitializationHelper.initialize(application, pluginEnv, serverEnv,language);          

身份认证SDK

初始化身份认证SDK前,请先完成API通道SDK、账号及用户SDK的初始化。

  • SDK(com.aliyun.iot.aep.sdk:iot-credential)版本小于0.0.1.7,请使用如下方式初始化
    //其中loginAdapter为OLoginAdapter,务必注意在调用之前,保证loginAdapter已经完成初始化,即完成了用户和账号SDK的初始化
    IoTCredentialManageImpl.init(loginAdapter, appkey);
  • SDK(com.aliyun.iot.aep.sdk:iot-credential)版本为0.0.1.7及以上,请使用如下方式初始化
    //务必注意在调用之前,保证完成了用户和账号SDK的初始化
    IoTCredentialManageImpl.init(appKey);

配网SDK

配网SDK自身不涉及初始化,但配网SDK依赖API通道SDK和账号SDK,因此需要完成API通道和账号的初始化才能使用。

物模型SDK

此功能模块依赖API通道SDK,以及长连接通道SDK。使用前请先完成这两个SDK的初始化。

SDK初始化调用如下代码。

 TmpSdk.init(getBaseContext(), new TmpInitConfig(TmpInitConfig.ONLINE));

在初始化之后需要调用发现接口发现本地设备。在网络情况发生变化时同样需要调用该接口。网络情况发生变化包括切换连接的路由器,从WiFi切换到4G网络等。

  TmpSdk.getDeviceManager().discoverDevices(null,5000,null);