通过如下设置,宿主需要自定义小程序的一些定制化功能。
@ProxyService(proxy = MiniAppProxy.class)public class MiniAppProxyImpl extends BaseMiniAppProxy{}
定义实现类并继承 BaseMiniAppProxyImpl,并使用上面的注解进行修饰。
自定义胶囊
/*** 点击胶囊按钮的关闭选项* 调用环境:子进程** @param miniAppContext 小程序运行环境(小程序进程,非主进程)* @param onCloseClickedListener 点击小程序关闭时回调* @return 不支持该接口,请返回false*/public abstract boolean onCapsuleButtonCloseClick(IMiniAppContext miniAppContext,DialogInterface.OnClickListener onCloseClickedListener);/*** 返回胶囊更多面板的按钮,扩展按钮的ID需要设置为[100, 200]这个区间中的值,否则,添加无效* 调用环境:子进程** @param builder* @return*/public abstract ArrayList<MoreItem> getMoreItems(MoreItemList.Builder builder);/*** 返回胶囊更多面板按钮点击监听器* 调用环境:子进程** @return 监听器*/public abstract OnMoreItemSelectedListener getMoreItemSelectedListener();
getMoreItems 实现参考示例
@Overridepublic ArrayList<MoreItem> getMoreItems(IMiniAppContext miniAppContext, MoreItemList.Builder builder) {MoreItem item1 = new MoreItem();item1.id = ShareProxyImpl.OTHER_MORE_ITEM_1;item1.text = getString(miniAppContext, R.string.applet_mini_proxy_impl_other1);item1.drawable = R.mipmap.mini_demo_about;MoreItem item2 = new MoreItem();item2.id = ShareProxyImpl.OTHER_MORE_ITEM_2;item2.text = getString(miniAppContext, R.string.applet_mini_proxy_impl_other2);item2.shareKey = SHARE_TWITTER;//自定义分享的key,必须设置且唯一,与小程序端调用控制设置时会使用到item2.drawable = R.mipmap.mini_demo_about;MoreItem item3 = new MoreItem();item3.id = DemoMoreItemSelectedListener.CLOSE_MINI_APP;item3.text = getString(miniAppContext, R.string.applet_mini_proxy_impl_float_app);item3.drawable = R.mipmap.mini_demo_about;MoreItem item4 = new MoreItem();item4.id = ShareProxyImpl.OTHER_MORE_ITEM_INVALID;item4.text = getString(miniAppContext, R.string.applet_mini_proxy_impl_out_of_effect);item4.drawable = R.mipmap.mini_demo_about;// 自行调整顺序。builder.addMoreItem(item1).addMoreItem(item2).addShareQQ("QQ", R.mipmap.mini_demo_channel_qq).addMoreItem(item3).addShareQzone(getString(miniAppContext, R.string.applet_mini_proxy_impl_Qzone),R.mipmap.mini_demo_channel_qzone).addShareWxFriends(getString(miniAppContext, R.string.applet_mini_proxy_impl_wechat_friend),R.mipmap.mini_demo_channel_wx_friend).addShareWxMoments(getString(miniAppContext, R.string.applet_mini_proxy_impl_wechat_group),R.mipmap.mini_demo_channel_wx_moment).addRestart(getString(miniAppContext, R.string.applet_mini_proxy_impl_restart),R.mipmap.mini_demo_restart_miniapp).addAbout(getString(miniAppContext, R.string.applet_mini_proxy_impl_about),R.mipmap.mini_demo_about).addDebug(getString(miniAppContext, R.string.mini_sdk_more_item_debug),R.mipmap.mini_demo_about).addMonitor(getString(miniAppContext, R.string.applet_mini_proxy_impl_performance),R.mipmap.mini_demo_about).addComplaint(getString(miniAppContext, R.string.applet_mini_proxy_impl_complain_and_report),R.mipmap.mini_demo_browser_report).addSetting(getString(miniAppContext, R.string.mini_sdk_more_item_setting),R.mipmap.mini_demo_setting);return builder.build();}private String getString(IMiniAppContext miniAppContext, int id) {return miniAppContext.getContext().getString(id);}
getMoreItemSelectedListener 实现参考
/** * 胶囊更多面板按钮点击监听器 * * @return */ @Override public OnMoreItemSelectedListener getMoreItemSelectedListener() { return new DemoMoreItemSelectedListener(); }public class DemoMoreItemSelectedListener extends DefaultMoreItemSelectedListener { public static final int CLOSE_MINI_APP = 150; @Override public void onMoreItemSelected(IMiniAppContext miniAppContext, int moreItemId) { //处理开发者自定义点击事件(自定义分享事件除外) switch (moreItemId) { case CLOSE_MINI_APP: close(miniAppContext); return; case OTHER_MORE_ITEM_1: miniAppContext.getAttachedActivity().runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(miniAppContext.getAttachedActivity(), "custom menu click", Toast.LENGTH_SHORT).show(); } }); return; } //处理内置分享和开发者自定义分享,例如:微博、twitter等 super.onMoreItemSelected(miniAppContext, moreItemId); } public void close(IMiniAppContext miniAppContext) { Activity activity = miniAppContext.getAttachedActivity(); if (activity != null && !activity.isFinishing()) { boolean moved = activity.moveTaskToBack(true); if (!moved) { QMLog.e("Demo", "moveTaskToBack failed, finish the activity."); activity.finish(); } } } }
相册选择与图片预览
/*** 打开选图界面* 调用环境:子进程** @param context 当前Activity* @param maxSelectedNum 允许选择的最大数量* @param listner 回调接口* @return 不支持该接口,请返回false*/public abstract boolean openChoosePhotoActivity(Context context, int maxSelectedNum, IChoosePhotoListner listner);/*** 打开图片预览界面* 调用环境:子进程** @param context 当前Activity* @param selectedIndex 当前选择的图片索引* @param pathList 图片路径列表* @return 不支持该接口,请返回false*/public abstract boolean openImagePreview(Context context, int selectedIndex, List<String> pathList);
自定义授权 UI
当小程序调用的 API 需要授权时,SDK 提供如下默认的授权 UI 样式,开发者也可以通过如下方法自定义授权 UI 样式。
/*** 自定义授权弹窗view* 调用环境:子进程** @param context* @param authInfo* @param authView* @return true:自定义授权view;false:使用内置*/@Overridepublic boolean authView(Context context, MiniAuthInfo authInfo, IAuthView authView) {return true;}
自定义授权用户信息
实现 BaseMiniAppProxyImpl 如下代码,可以自定义用户授权信息中用户昵称和头像。
/*** 获取scope.userInfo授权用户信息* 调用环境:子进程** @param appId* @param result*/@Overridepublic void getUserInfo(String appId, AsyncResult result) {JSONObject jsonObject = new JSONObject();try {//返回昵称jsonObject.put("nickName", "userInfo测试");//返回头像urljsonObject.put("avatarUrl", "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.daimg.com%2Fuploads%2Fallimg%2F210114%2F1-210114151951.jpg&refer=http%3A%2F%2Fimg.daimg.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=auto?sec=1673852149&t=e2a830d9fabd7e0818059d92c3883017");result.onReceiveResult(true, jsonObject);} catch (JSONException e) {e.printStackTrace();}}
可参考如下方法实现加载头像:
public Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable)
小程序数据根据账号隔离存储
当进行账号切换时,如当前账号下已有运行的小程序,建议先调用 stopAllMiniApp 停止运行的小程序,然后再进行账号切换。
/*** 用户账号,必须唯一,设置后数据会按账号隔离存储,不建议使用用户敏感信息* 调用环境:主进程*/@Overridepublic String getAccount() {return "tmf_test";}
小程序图片加载
小程序中需要加载网络或本地图片时,需要实现如下接口:
/*** 获取Drawable对象* 调用环境:子进程** @param context 上下文* @param source 来源,可以是本地或者网络* @param width 图片宽度* @param hight 图片高度* @param defaultDrawable 默认图片,用于加载中和加载失败*/@Overridepublic Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable)
demo 中参考示例
@Overridepublic Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable) {//接入方接入自己的ImageLoader//demo里使用开源的universalimageloaderUniversalDrawable drawable = new UniversalDrawable();if (TextUtils.isEmpty(source)) {return drawable;}drawable.loadImage(context, source);return drawable;}
自定义虚拟域名
小程序打用到默认的虚拟域名,这个域名并非真实的域名,在浏览器中是无法访问的,如果需要自定义可以按照如下配置进行设置。
@Overridepublic MiniConfigData configData(Context context, int configType, JSONObject params) {if(configType == MiniConfigData.TYPE_DOMAIN) {//虚拟域名配置MiniConfigData.DomainConfig domainConfig = new MiniConfigData.DomainConfig();domainConfig.domain = "test.com";return new MiniConfigData.Builder().domainConfig(domainConfig).build();}return new MiniConfigData.Builder().build();}
自定义 userAgent
可以通过如下方式自定义 webview的userAgent。
@Overridepublic MiniConfigData configData(Context context, int configType, JSONObject params) {if(configType == MiniConfigData.TYPE_WEBVIEW) {//webView userAgentString ua = params.optString(MiniConfigData.WebViewConfig.WEBVIEW_CONFIG_UA);MiniConfigData.WebViewConfig webViewConfig = new MiniConfigData.WebViewConfig();//设置开发者需要追加的userAgent,注意:不要把原始的ua设置进去了webViewConfig.userAgent = "key/value";return new MiniConfigData.Builder().webViewConfig(webViewConfig).build();}return new MiniConfigData.Builder().build();}
自定义扫码
小程序的扫码 API 功能可以使用平台提供的扫码扩展库进行扫码,也支持自定义扫码。
/*** 扫码二维码** @param context 上下文* @param onlyFromCamera 只允许摄像头扫码* @param result 扫描结果* @return true:自定义扫码;false:使用内置扫码*/@Overridepublic boolean enterQRCode(Context context, boolean onlyFromCamera, AsyncResult result) {return false;}
保存文件目录
/** * 指定小程序API保存图片、视频到系统相册中的目录 * */ public abstract String getSaveFileDir();
小程序生命周期
/** * 小程序生命周期事件回调 * 调用上下文环境:主进程UI线程 * * @param appState 事件状态 * @param event 事件 */ public abstract void onAppStateChange(@AppState int appState, MiniAppEvent event);
基础库更新
/** * 基础库检测到更新时,是否进行更新 * @param context * @param data 基础库信息数据 * @return true:更新;false:不更新,默认为 true */ public abstract boolean isUpdateBaseLib(Context context, JSONObject data);