小程序引擎代理实现

最近更新时间:2024-01-16 15:46:41

我的收藏
通过如下设置,宿主需要自定义小程序的一些定制化功能。
@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 实现参考示例
@Override
public 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:使用内置
*/
@Override
public boolean authView(Context context, MiniAuthInfo authInfo, IAuthView authView) {
return true;
}

自定义授权用户信息

实现 BaseMiniAppProxyImpl 如下代码,可以自定义用户授权信息中用户昵称和头像。



/**
* 获取scope.userInfo授权用户信息
* 调用环境:子进程
*
* @param appId
* @param result
*/
@Override
public void getUserInfo(String appId, AsyncResult result) {
JSONObject jsonObject = new JSONObject();
try {
//返回昵称
jsonObject.put("nickName", "userInfo测试");
//返回头像url
jsonObject.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 停止运行的小程序,然后再进行账号切换。
/**
* 用户账号,必须唯一,设置后数据会按账号隔离存储,不建议使用用户敏感信息
* 调用环境:主进程
*/
@Override
public String getAccount() {
return "tmf_test";
}

小程序图片加载

小程序中需要加载网络或本地图片时,需要实现如下接口:
/**
* 获取Drawable对象
* 调用环境:子进程
*
* @param context 上下文
* @param source 来源,可以是本地或者网络
* @param width 图片宽度
* @param hight 图片高度
* @param defaultDrawable 默认图片,用于加载中和加载失败
*/
@Override
public Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable)
demo 中参考示例
@Override
public Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable) {
//接入方接入自己的ImageLoader
//demo里使用开源的universalimageloader
UniversalDrawable drawable = new UniversalDrawable();
if (TextUtils.isEmpty(source)) {
return drawable;
}
drawable.loadImage(context, source);
return drawable;
}

自定义虚拟域名

小程序打用到默认的虚拟域名,这个域名并非真实的域名,在浏览器中是无法访问的,如果需要自定义可以按照如下配置进行设置。

@Override
public 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。
@Override
public MiniConfigData configData(Context context, int configType, JSONObject params) {
if(configType == MiniConfigData.TYPE_WEBVIEW) {
//webView userAgent
String 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:使用内置扫码
*/
@Override
public 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);