插件开发
创建插件工程
AndroidManifest.xml文件application下添加插件配置和入口
必须设置model和message_handler,提供插件运行的android sdk版本号
创建MessageReceiver类,继承IXmPluginMessageReceiver,入口函数
类名必须保持和AndroidManifest.xml中配置message_handler一致
public class MessageReceiver implements IXmPluginMessageReceiver {
public static final String MODEL = "xiaomi.demo.v1";
@Override
public boolean handleMessage(Context context, XmPluginPackage xmPluginPackage, int type,
Intent intent,
DeviceStat deviceStat) {
switch (type) {
case LAUNCHER: {// 启动入口
XmPluginHostApi.instance().startActivity(context, xmPluginPackage, intent,
deviceStat.did, MainActivity.class);
return true;
}
default:
break;
}
return false;
}
@Override
public boolean handleMessage(Context context, XmPluginPackage xmPluginPackage, int type,
Intent intent, DeviceStat deviceStat, MessageCallback callback) {
// TODO Auto-generated method stub
return false;
}
}
创建Device继承BaseDevice,封装设备的状态和rpc调用
/**
* 设备方法调用
*
* @param method 方法名
* @param param 参数,可以是一个集合Collection子类
* @param callback 回调结果
* @param parser
*/
public void callMethod(String method, Object[] params,
final Callback callback, final Parser parser) {
XmPluginHostApi.instance().callMethod(getDid(), method, params, callback, parser);
}
/**
* 设备方法调用
*
* @param method 方法名
* @param param
* @param callback 回调结果
* @param parser
*/
public void callMethod(String method, JSONArray params,
final Callback callback, final Parser parser) {
XmPluginHostApi.instance().callMethod(getDid(), method, params, callback, parser);
}
创建Activity,继承XmPluginBaseActivity
插件内的Activity必须是XmPluginBaseActivity子类,才能被启动
初始化device
mDevice = new DemoDevice(mDeviceStat);
设置titlebar在顶部透明显示时的顶部padding
mHostActivity.setTitleBarPadding(findViewById(R.id.title_bar));
activiy中需要返回调用结果必须如下调用
activity().setResult(RESULT_OK);
在插件Activity中凡是需要使用Context上下文对象参数的,必须使用activity()
显示Toast
Toast.makeText(activity(), “test”, Toast.LENGTH_SHORT).show();
显示Dialog
MLAlertDialog.Builder builder = new MLAlertDialog.Builder(activity());
builder.setTitle("测试Dialog");
builder.setPositiveButton("Ok", new MLAlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
调用公共设备菜单界面
//点击菜单返回界面,需要在onActivityResult接收参数
ArrayList menus = new ArrayList();
menus.add("自定义菜单1");
//点击直接进入下一页
ArrayList intents = new ArrayList();
Intent intent = mHostActivity.getActivityIntent(null, SettingActivity.class.getName());
intent.putExtra("menu", "设置");
intents.add(intent);
// 设置自定义菜单
mHostActivity.openMoreMenu(menus,intents, true, REQUEST_MENUS);
默认菜单操作已经封装统一处理,自定义的菜单在Activity接收并处理
public void onActivityResult(int requestCode, int resultCode, Intent data)
调起创建场景界面
mHostActivity.startCreateSceneByCondition(mDevice.getDid(), "device");
启动插件内Activity
startActivityForResult(null, FragmentActivity.class.getName(), 2);
或者
startActivity(null, SettingActivity.class.getName());
加载native so
必须用下面的接口加载
XmPluginHostApi.instance().loadLibrary(“model”,”h264decoder",
getClassLoader());
Fragment继承BaseFragment
提供下面方法可以使用XmPluginBaseActivity接口
public XmPluginBaseActivity xmPluginActivity() {
return mXmPluginBaseActivity;
}
// 插件内启动activity
public void startActivityForResult(Intent intent, String className,
int requestCode) {
if (mXmPluginBaseActivity != null) {
mXmPluginBaseActivity.startActivityForResult(intent, className, requestCode);
}
}
商城一键购买
链接参数
http://home.mi.com/shop/search?action={search,detail,check}&keyword={keyword}&source={packageName}
其中action有三种:
search表示搜索
detail表示去商品详情页
check表示一键购买
keyword为商品关键字
source为来源,一般使用包名
一键购买摄像机实例如下:
Uri uri = Uri.parse("http://home.mi.com/shop/search?action=check&keyword=小蚁摄像头 夜视&source=com.xiaomi.smarthome");
XmPluginHostApi.instance().gotoPage(activity(), mPluginPackage, uri, null);