@ProxyService(proxy = MiniAppProxy.class)注解进行修饰。@ProxyService(proxy = MiniAppProxy.class)public class MiniAppProxyImpl extends BaseMiniAppProxyImpl{}

onCapsuleButtonCloseClick方法返回值表示是否自定义关闭按钮监听,返回值为 true 表示自定义,false(默认值)表示使用默认监听。/*** 点击胶囊按钮的关闭选项* 调用环境:子进程** @param miniAppContext 小程序运行环境(小程序进程,非主进程)* @param onCloseClickedListener 点击小程序关闭时回调* @return 不支持该接口,请返回false*/public abstract boolean onCapsuleButtonCloseClick(IMiniAppContext miniAppContext,DialogInterface.OnClickListener onCloseClickedListener);
@Override public boolean onCapsuleButtonCloseClick(IMiniAppContext miniAppContext, DialogInterface.OnClickListener onCloseClickedListener) { Log.e("TAG","onCapsuleButtonCloseClick"+miniAppContext.getMiniAppInfo()); //handle close mini app event return true; }

/*** 点击胶囊按钮的更多选项** @param miniAppContext 小程序运行环境* @return 不支持该接口,请返回false*/public abstract boolean onCapsuleButtonMoreClick(IMiniAppContext miniAppContext);
@Overridepublic boolean onCapsuleButtonMoreClick(IMiniAppContext miniAppContext) {// 弹出自定义更多面板return true;}

MoreItemList.Builder 用于添加扩展按钮,扩展按钮的展示顺序和添加顺序一致;/*** 返回胶囊更多面板的按钮,扩展按钮的ID需要设置为[100, 200]这个区间中的值,否则,添加无效* 调用环境:子进程** @param builder* @return*/public abstract ArrayList<MoreItem> getMoreItems(MoreItemList.Builder builder);
@Overridepublic ArrayList<MoreItem> getMoreItems(IMiniAppContext miniAppContext, MoreItemList.Builder builder) {MoreItem item1 = new MoreItem();// 设置菜单id(必须),扩展按钮的ID需要设置为[100, 200]这个区间中的值,否则,添加无效。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;// 设置无障碍描述(可选), 默认是菜单标题item2.contentDescription = "菜单无障碍描述";// 监听点击事件item2.onClickListener = new MoreItem.MoreItemClickListener() {@Overridepublic void onClick(IMiniAppContext context, MoreItem item) {// 处理点击事件}};// 自行调整顺序。builder.addMoreItem(item1)// 根据需求添加内置菜单项.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)// 根据需求添加内置菜单项.addSetting(getString(miniAppContext, R.string.mini_sdk_more_item_setting_0),R.drawable.mini_sdk_setting,//设置无障碍描述(可选), 默认是菜单标题"小程序设置");return builder.build();}private String getString(IMiniAppContext miniAppContext, int id) {return miniAppContext.getContext().getString(id);}
wx.chooseImage、wx.chooseVideo、wx.chooseMedia时触发。/*** 从相册选择媒体文件* @param context* @param options* @return*/public boolean chooseMediaFromAlbum(Activity context, ChooseMediaOptions options, ChooseMediaProxy.IChooseMediaListener listener)/*** 从相机拍摄媒体文件* @param context* @param options* @param listener* @return*/public boolean chooseMediaFromCamera(Activity context, ChooseMediaOptions options, ChooseMediaProxy.IChooseMediaListener listener)
public static final int REQUEST_CHOOSE_MEDIA = 110;public static final int REQUEST_CHOOSE_MEDIA_CAMERA = 111;@Overridepublic void chooseMediaFromAlbum(Activity context, ChooseMediaOptions options, IChooseMediaListener listener) {try {TmfMiniSDK.addActivityResultListener(new IActivityResultListener() {@Overridepublic boolean doOnActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode == REQUEST_CHOOSE_MEDIA && resultCode == Activity.RESULT_OK) {ArrayList<Uri> picturePath = new ArrayList<>();if (data == null) {Log.e(TAG, "empty intent ,failed getting from chooseImage");listener.onResult(false, null);return false;}if (null != data.getClipData()) {Log.d(TAG, "use clipdata as intent uri ");ClipData clipData = data.getClipData();for (int i = 0; i < clipData.getItemCount(); i++) {picturePath.add(clipData.getItemAt(i).getUri());}Log.d(TAG, "send to mini with path " + picturePath.size());} else if (null != data.getData()) {Log.d(TAG, "select picture path is " + data.getData());picturePath.add(data.getData());}listener.onResult(true, picturePath);} else {listener.onResult(false, null);}MiniSDK.removeActivityResultListener(this);return true;}});Intent chooserIntent = new Intent(Intent.ACTION_GET_CONTENT);if (options.maxCount > 1) {chooserIntent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);}switch (options.mediaType) {case ChooseMediaOptions.MEDIA_TYPE_IMAGE:chooserIntent.setType("image/*");break;case ChooseMediaOptions.MEDIA_TYPE_VIDEO:chooserIntent.setType("video/*");break;case ChooseMediaOptions.MEDIA_TYPE_MIX:chooserIntent.setType("*/*");chooserIntent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/*", "video/*"});default:chooserIntent.setType("image/*");break;}context.startActivityForResult(chooserIntent, REQUEST_CHOOSE_MEDIA);} catch (Exception e) {listener.onResult(false, null);}}@Overridepublic void chooseMediaFromCamera(Activity context, ChooseMediaOptions options, IChooseMediaListener listener) {Intent takePhotoIntent;if (options.mediaType == ChooseMediaOptions.MEDIA_TYPE_VIDEO) {takePhotoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);int duration = options.duration;if (duration < 1 || duration > 60000) {duration = 60000;}takePhotoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, duration);if (options.camera == ChooseMediaOptions.CAMERA_TYPE_FRONT) {takePhotoIntent.putExtra("android.intent.extras.CAMERA_FACING", 1);}} else {takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);}if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {takePhotoIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);}if (takePhotoIntent.resolveActivity(context.getPackageManager()) == null) {Log.e(TAG, "resolveActivity failed ,has no camera app");listener.onResult(false, null);return;}if (options.cameraOutput == null) {Log.e(TAG, "createImageFile failed ");listener.onResult(false, null);return;}Uri imageUri = options.cameraOutput;takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);context.startActivityForResult(takePhotoIntent, REQUEST_CHOOSE_MEDIA_CAMERA);TmfMiniSDK.addActivityResultListener(new IActivityResultListener() {@Overridepublic boolean doOnActivityResult(int requestCode, int resultCode, Intent data) {if (requestCode != REQUEST_CHOOSE_MEDIA_CAMERA) {return false;}if (resultCode != Activity.RESULT_OK) {listener.onResult(false, null);} else {ArrayList<Uri> picturePath = new ArrayList<>();picturePath.add(imageUri);listener.onResult(true, picturePath);}MiniSDK.removeActivityResultListener(this);return true;}});}
wx.previewImage 时触发。
/*** 打开图片预览界面* 调用环境:子进程** @param context 当前Activity* @param selectedIndex 当前选择的图片索引* @param pathList 图片路径列表* @return 不支持该接口,请返回false*/public abstract boolean openImagePreview(Context context, int selectedIndex, List<String> pathList);
/** * 打开图片预览界面 * * @param context 当前Activity * @param selectedIndex 当前选择的图片索引 * @param pathList 图片路径列表 * @return 不支持该接口,请返回false */ @Override public boolean openImagePreview(Context context, int selectedIndex, List<String> pathList) { //todo start your image preview Intent intent = new Intent(context, CustomPreviewActivity.class); intent.putExtra("curIndex",selectedIndex); intent.putStringArrayListExtra("pathList", pathList); context.startActivity(intent); return true; }

/*** 获取scope.userInfo授权用户昵称** @return 用户昵称*/public abstract String getNickName();/*** 获取scope.userInfo授权用户头像(默认使用应用图标)** @return 用户头像地址*/public abstract String getAvatarUrl();
@Overridepublic String getNickName() {return "userInfo测试";}@Overridepublic String getAvatarUrl() {return "https://xxx/avatar.png"}
@Override public Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable)
@Override public Drawable getDrawable(Context context, String source, int width, int hight, Drawable defaultDrawable) { //接入方接入自己的ImageLoader //示例代码里使用开源的universalimageloader UniversalDrawable drawable = new UniversalDrawable(); if (TextUtils.isEmpty(source)) { return drawable; } drawable.loadImage(context, source); return drawable; }
/*** 用户账号,必须唯一,设置后数据会按账号隔离存储,不建议使用用户敏感信息* 调用环境:主进程*/@Overridepublic String getAccount() {return "tmf_test";}

MiniConfigData.TYPE_DOMAIN的方法实现自定义。@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();}
MiniConfigData.TYPE_WEBVIEW的方法实现自定义。@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();}
/*** 扫码二维码** @param context 上下文* @param onlyFromCamera 只允许摄像头扫码* @param result 扫描结果* @return true:自定义扫码;false:使用内置扫码*/@Overridepublic boolean enterQRCode(Context context, boolean onlyFromCamera, AsyncResult result);
/*** 指定小程序API保存图片、视频到系统相册中的目录**/public String getSaveFileDir(){return "myapp";}
/*** 小程序生命周期事件回调* 调用上下文环境:主进程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);
文档反馈