插件開發(fā)
創(chuàng)建插件工程
AndroidManifest.xml文件application下添加插件配置和入口
必須設(shè)置model和message_handler星著,提供插件運(yùn)行的android sdk版本號(hào)
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<!-- 支持插件的最低版本,必須 -->
<meta-data
android:name="minPluginSdkApiVersion"
android:value="1" />
<!-- 設(shè)備model粗悯,必須 -->
<meta-data
android:name="model"
android:value="xiaomi.demo.v1" />
<!-- 設(shè)備處理消息入口虚循,必須 -->
<meta-data
android:name="message_handler"
android:value="com.xiaomi.xmplugindemo.MessageReceiver" />
<!-- 設(shè)備場(chǎng)景配置信息,可選 -->
<meta-data
android:name="SHPluginSceneInfo"
android:value="@string/plugin_scene_info" />
創(chuàng)建MessageReceiver類,繼承IXmPluginMessageReceiver横缔,入口函數(shù)
類名必須保持和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: {// 啟動(dòng)入口
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;
}
}
創(chuàng)建Device繼承BaseDevice铺遂,封裝設(shè)備的狀態(tài)和rpc調(diào)用
/**
* 設(shè)備方法調(diào)用
*
* @param method 方法名
* @param param 參數(shù),可以是一個(gè)集合Collection子類
* @param callback 回調(diào)結(jié)果
* @param parser
*/
public <T> void callMethod(String method, Object[] params,
final Callback<T> callback, final Parser<T> parser) {
XmPluginHostApi.instance().callMethod(getDid(), method, params, callback, parser);
}
/**
* 設(shè)備方法調(diào)用
*
* @param method 方法名
* @param param
* @param callback 回調(diào)結(jié)果
* @param parser
*/
public <T> void callMethod(String method, JSONArray params,
final Callback<T> callback, final Parser<T> parser) {
XmPluginHostApi.instance().callMethod(getDid(), method, params, callback, parser);
}
創(chuàng)建Activity,繼承XmPluginBaseActivity
插件內(nèi)的Activity必須是XmPluginBaseActivity子類剪廉,才能被啟動(dòng)
初始化device
mDevice = new DemoDevice(mDeviceStat);
設(shè)置titlebar在頂部透明顯示時(shí)的頂部padding
mHostActivity.setTitleBarPadding(findViewById(R.id.title_bar));
activiy中需要返回調(diào)用結(jié)果必須如下調(diào)用
activity().setResult(RESULT_OK);
在插件Activity中凡是需要使用Context上下文對(duì)象參數(shù)的娃循,必須使用activity()
顯示Toast
Toast.makeText(activity(), “test”, Toast.LENGTH_SHORT).show();
顯示Dialog
MLAlertDialog.Builder builder = new MLAlertDialog.Builder(activity());
builder.setTitle("測(cè)試Dialog");
builder.setPositiveButton("Ok", new MLAlertDialog.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
調(diào)用公共設(shè)備菜單界面
//點(diǎn)擊菜單返回界面,需要在onActivityResult接收參數(shù)
ArrayList<String> menus = new ArrayList<String>();
menus.add("自定義菜單1");
//點(diǎn)擊直接進(jìn)入下一頁(yè)
ArrayList<Intent> intents = new ArrayList<Intent>();
Intent intent = mHostActivity.getActivityIntent(null, SettingActivity.class.getName());
intent.putExtra("menu", "設(shè)置");
intents.add(intent);
// 設(shè)置自定義菜單
mHostActivity.openMoreMenu(menus,intents, true, REQUEST_MENUS);
默認(rèn)菜單操作已經(jīng)封裝統(tǒng)一處理斗蒋,自定義的菜單在Activity接收并處理
public void onActivityResult(int requestCode, int resultCode, Intent data)
調(diào)起創(chuàng)建場(chǎng)景界面
mHostActivity.startCreateSceneByCondition(mDevice.getDid(), "device");
啟動(dòng)插件內(nèi)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;
}
// 插件內(nèi)啟動(dòng)activity
public void startActivityForResult(Intent intent, String className,
int requestCode) {
if (mXmPluginBaseActivity != null) {
mXmPluginBaseActivity.startActivityForResult(intent, className, requestCode);
}
}
商城一鍵購(gòu)買
鏈接參數(shù)
http://home.mi.com/shop/search?action={search,detail,check}&keyword={keyword}&source={packageName}
其中action有三種:
search表示搜索
detail表示去商品詳情頁(yè)
check表示一鍵購(gòu)買
keyword為商品關(guān)鍵字
source為來(lái)源捌斧,一般使用包名
一鍵購(gòu)買攝像機(jī)實(shí)例如下:
Uri uri = Uri.parse("http://home.mi.com/shop/search?action=check&keyword=小蟻攝像頭 夜視&source=com.xiaomi.smarthome?");
XmPluginHostApi.instance().gotoPage(activity(), mPluginPackage, uri, null);