tencent cloud

文档反馈

小程序宿主自定义

最后更新时间:2024-03-04 22:43:53
    通过如下设置,宿主需要自定义小程序的一些定制化功能。
    @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);
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持