1. 设备控制业务包
1.1. 功能介绍
设备控制业务包是涂鸦智能设备控制面板的核心容器,在涂鸦智能 Android Home SDK 的基础上,提供了设备控制面板的加载和控制的接口封装,加速应用开发过程。主要包括以下功能:
- 面板加载(加载多种设备类型,支持:WIFI、Zigbee、Mesh、BLE)
- 设备控制(支持单设备和群组的控制,不支持群组管理)
- 设备定时
1.2. 业务包集成
1.2.1. 创建工程
在 Android Studio 中建立你的工程,接入公版 SDK 并配置完成
1.2.2. 根目录的 build.gradle 配置
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
1.2.3. module 的 build.gradle 配置
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"
}
}
repositories {
flatDir {
dirs 'libs'
}
}
compileOptions {
sourceCompatibility 1.8
targetCompatibility 1.8
}
packagingOptions {
pickFirst 'lib/*/libc++_shared.so'
pickFirst 'lib/*/libgnustl_shared.so'
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
//panel
implementation 'com.tuya.smart:panel-sdk:0.6.5'
// 已废弃 com.facebook.react:react-native:0.51.1.11
// 请使用涂鸦版本 react-native
implementation 'com.tuya.smart:react-native:0.51.1.11'
//tuya react-native
//homesdk
implementation 'com.alibaba:fastjson:1.1.67.android'
implementation 'com.squareup.okhttp3:okhttp-urlconnection:3.12.3'
implementation 'com.tuya.smart:tuyasmart:3.17.0'
//third
implementation 'com.weigan:loopView:0.1.1'
implementation 'com.facebook.infer.annotation:infer-annotation:0.11.2'
implementation 'javax.inject:javax.inject:1'
implementation 'com.facebook.soloader:soloader:0.8.2'
implementation 'com.facebook.fresco:fresco:1.3.0'
implementation "com.facebook.fresco:imagepipeline-okhttp3:1.3.0"
implementation 'com.alibaba:fastjson:1.1.67.android'
implementation 'org.apache.commons:commons-compress:1.9'
implementation 'com.github.PhilJay:MPAndroidChart:v3.0.3'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
implementation 'com.readystatesoftware.systembartint:systembartint:1.0.3'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
}
可选配置 根据面板功能依赖
高德地图依赖项 发布GooglePlay时请务必去除此依赖
implementation 'com.amap.api:search:6.9.2'
implementation 'com.amap.api:map2d:5.2.0'
implementation 'com.tuya.smart:tuyasmart-react-native-amap:1.0.0'
GoogleMap 依赖项 发布国内应用市场时请务必去除此依赖
implementation 'com.tuya.smart:tuyasmart-react-native-googlemap:1.0.0'
implementation('com.google.android.gms:play-services-maps:16.1.0') {
exclude group: 'com.android.support'
}
QQ 音乐登录模块依赖项
implementation(name: 'qqmusic-innovation-aidl-api-sdk-1.0.0-SNAPSHOT-release', ext: 'aar')
implementation 'com.tuya.smart.rnplugin:tyrctspeakermanager:1.0.15-open'
def tvsVer = '2.3.0'
implementation "com.tencent.yunxiaowei.dmsdk:core:$tvsVer"
implementation "com.tencent.yunxiaowei.webviewsdk:webviewsdk:$tvsVer"
扫地机依赖项
implementation 'com.tuya.smart:tuyasmart-TuyaRNApi-sweeper:5.26.13-open'
1.2.4. Theme 配置
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- default configuration start -->
<item name="app_bg_color">@color/app_bg_color</item>
<item name="list_line_color">@color/list_line_color</item>
<!-- default configuration end -->
</style>
1.2.5. 混淆配置
# react-native
-keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip
-keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters
# Do not strip any method/class that is annotated with @DoNotStrip
-keep @com.facebook.proguard.annotations.DoNotStrip class *
-keep @com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.proguard.annotations.DoNotStrip *;
@com.facebook.common.internal.DoNotStrip *;
}
-keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * {
void set*(***);
*** get*();
}
-keep class * extends com.facebook.react.bridge.JavaScriptModule { *; }
-keep class * extends com.facebook.react.bridge.NativeModule { *; }
-keepclassmembers,includedescriptorclasses class * { native <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.UIProp <fields>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp <methods>; }
-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup <methods>; }
-dontwarn com.facebook.react.**
-keep,includedescriptorclasses class com.facebook.react.bridge.** { *; }
#高德地图
-dontwarn com.amap.**
-keep class com.amap.api.maps.** { *; }
-keep class com.autonavi.** { *; }
-keep class com.amap.api.trace.** { *; }
-keep class com.amap.api.navi.** { *; }
-keep class com.autonavi.** { *; }
-keep class com.amap.api.location.** { *; }
-keep class com.amap.api.fence.** { *; }
-keep class com.autonavi.aps.amapapi.model.** { *; }
-keep class com.amap.api.maps.model.** { *; }
-keep class com.amap.api.services.** { *; }
#Google Play Services
-keep class com.google.android.gms.common.** {*;}
-keep class com.google.android.gms.ads.identifier.** {*;}
-keepattributes Signature,*Annotation*,EnclosingMethod
-dontwarn com.google.android.gms.**
#MPAndroidChart
-keep class com.github.mikephil.charting.** { *; }
-dontwarn com.github.mikephil.charting.**
-keep class com.tuya.**.**{*;}
-dontwarn com.tuya.**.**
1.2.6. Application 中初始化涂鸦智能 设备控制业务包
public class TuyaSmartApp extends Application {
@Override
public void onCreate() {
super.onCreate();
// 必须移除 TuyaHomeSdk.init() 方法,再使用 TuyaPanelSDK.init()
TuyaHomeSdk.setDebugMode(BuildConfig.DEBUG);
TuyaPanelSDK.init(this," TUYA_SMART_APPKEY","TUYA_SMART_SECRET");
//未实现的路由回调
TuyaWrapper.init(this, new RouteEventListener() {
@Override
public void onFaild(int errorCode, UrlBuilder urlBuilder) {
ToastUtil.shortToast(TuyaPanelSDK.getCurrentActivity(), urlBuilder.originUrl);
}
});
//注册家庭服务,实现设置当前家庭 homeId,BizBundleFamilyServiceImpl为示例代码,用户可以自行实现
TuyaWrapper.registerService(AbsBizBundleFamilyService.class, new BizBundleFamilyServiceImpl());
}
}
1.3. 功能调用
1.3.1. 实现家庭服务
通过继承 AbsBizBundleFamilyService 抽象类,实现设置当前家庭 homeId
示例代码
public class BizBundleFamilyServiceImpl extends AbsBizBundleFamilyService {
private long mHomeId;
@Override
public long getCurrentHomeId() {
return mHomeId;
}
@Override
public void setCurrentHomeId(long homeId) {
mHomeId = homeId;
}
@Override
public void shiftCurrentFamily(long l, String s) {
mHomeId = l;
}
}
1.3.2. 设置家庭 HomeId
当获取家庭列表后,通过服务化调用设置家庭 homeId
示例代码
AbsBizBundleFamilyService service = MicroServiceManager.getInstance().findServiceByInterface(AbsBizBundleFamilyService.class.getName());
//设置为当前家庭的homeId
service.setCurrentHomeId(homeBean.getHomeId());
1.3.3. 打开设备面板
通过家庭 Id 和设备 Id 进入对应设备面板页面,家庭和设备的 Id 需要通过公版 SDK 接口获取
接口说明
打开设备面板
gotoPanelViewControllerWithDevice(Activity activity, long homeId, String devId, ITuyaPanelLoadCallback loadCallback);
参数说明
参数 | 说明 |
---|---|
activity | 在面板内打开新面板时应使用 TuyaPanelSDK.getCurrentActivity() |
homeId | 家庭 Id 通过公版 SDK 接口获取 |
devId | 设备Id 通过公版 SDK 接口获取 |
loadCallback | 面板加载回调 |
示例代码
// 加载状态回调里界面操作的 Context 应使用 TuyaPanelSDK.getCurrentActivity()
final ITuyaPanelLoadCallback mLoadCallback = new ITuyaPanelLoadCallback() {
@Override
public void onStart(String deviceId) {
ProgressUtil.showLoading(TuyaPanelSDK.getCurrentActivity(), "Loading...");
}
@Override
public void onError(String deviceId, int code, String error) {
ProgressUtil.hideLoading();
Toast.makeText(getApplicationContext(), "errorCode:" + code + ",errorString:" + error, Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(String deviceId) {
ProgressUtil.hideLoading();
}
@Override
public void onProgress(String deviceId, int progress) {
}
};
//打开面板
TuyaPanelSDK.getPanelInstance().gotoPanelViewControllerWithDevice(TuyaPanelSDK.getCurrentActivity(), mCurrentHomeId, bean.getDevId(), mLoadCallback);
1.3.4. 打开群组面板
通过家庭 Id 和群组 Id 进入对应群组页面,家庭和群组 Id 需要通过公版 SDK 接口获取
接口说明
打开设备面板
gotoPanelViewControllerWithGroup(Activity activity, long homeId, long groupId, ITuyaPanelLoadCallback loadCallback);
参数说明
参数 | 说明 |
---|---|
activity | 在面板内打开新面板时应使用 TuyaPanelSDK.getCurrentActivity() |
homeId | 家庭 Id 通过公版 SDK 接口获取 |
groupId | 群组 Id 通过公版 SDK 接口获取 |
loadCallback | 面板加载回调 |
示例代码
// 加载状态回调里界面操作的 Context 应使用 TuyaPanelSDK.getCurrentActivity()
final ITuyaPanelLoadCallback mLoadCallback = new ITuyaPanelLoadCallback() {
@Override
public void onStart(String deviceId) {
ProgressUtil.showLoading(TuyaPanelSDK.getCurrentActivity(), "Loading...");
}
@Override
public void onError(String deviceId, int code, String error) {
ProgressUtil.hideLoading();
Toast.makeText(getApplicationContext(), "errorCode:" + code + ",errorString:" + error, Toast.LENGTH_LONG).show();
}
@Override
public void onSuccess(String deviceId) {
ProgressUtil.hideLoading();
}
@Override
public void onProgress(String deviceId, int progress) {
}
};
//打开面板
TuyaPanelSDK.getPanelInstance().gotoPanelViewControllerWithGroup(TuyaPanelSDK.getCurrentActivity(), mCurrentHomeId, bean.getGroupId(), mLoadCallback);
1.3.5. 面板事件回调
点击面板右上角按钮
通过面板右上角按钮回调打开其他页面
接口说明
进入面板页面后点击右上角按钮可以获取当前面板设备 Id
void setPressedRightMenuListener(ITuyaPressedRightMenuListener listener);
参数说明
参数 | 说明 |
---|---|
ITuyaPressedRightMenuListener | 点击按钮回调获取当前面板设备 Id,如果是群组面板则返回 groupId 否则为 -1 |
示例代码
TuyaPanelSDK.getPanelInstance().setPressedRightMenuListener(new ITuyaPressedRightMenuListener() {
@Override
public void onPressedRightMenu(String deviceId,String groupId) {
Toast.makeText(TuyaPanelSDK.getCurrentActivity(), "PanelMore", Toast.LENGTH_SHORT).show();
}
});
获取未实现路由地址
获取未实现路由地址跳转对应页面
接口说明
进入面板页面后点击按钮跳转路由,如果有未实现的路由则会调用
void init(Application app,ITuyaOpenUrlListener listener);
参数说明
参数 | 说明 |
---|---|
RouteEventListener | 未实现的路由回调 |
示例代码
TuyaWrapper.init(this, new RouteEventListener() {
@Override
public void onFaild(int errorCode, UrlBuilder urlBuilder) {
// 路由原始地址 urlBuilder.originUrl
ToastUtil.shortToast(TuyaPanelSDK.getCurrentActivity(), urlBuilder.originUrl);
}
});
1.3.6. 释放面板资源
在退出应用的时候调用释放资源
示例代码
TuyaPanel.getInstance().onDestroy();
1.3.7. 清除所有面板缓存
面板文件会存放在当前 app 存储目录下,若需要清理可调用此方法
示例代码
TuyaPanelSDK.getPanelInstance().clearPanelCache();
1.4. 错误码
错误码 | 描述 |
---|---|
1901 | 面板下载失败 |
1902 | 多语言包下载失败 |
1903 | 设备类型不支持 |
1904 | 群组内无设备 |
1905 | home id有误 |
1906 | 设备DeviceBean为null |
1907 | 找不到可下载的面板资源 |
1908 | 固件版本不正确 |
1909 | 未知错误 |