# WMPFMiniProgramApi.launchMiniProgram

> 需 WMPF >= 2.1.0 支持，使用前建议阅读[注意事项](/doc/oplatform/Miniprogram_Frame/api/about)

启动小程序。

## 调用参数

| 参数            | 必填 | 类型               | 说明               | 最低版本 |
|-----------------|------|--------------------|--------------------|----------|
| params          | 是   | WMPFStartAppParams | 启动小程序参数     |          |
| forceFullscreen | 否   | boolean            | 是否强制全屏显示   |          |
| landscapeMode   | 否   | LandscapeMode      | 启动小程序展示方式 |          |

或

| 参数    | 必填 | 类型                | 说明                     | 最低版本 |
|---------|------|---------------------|--------------------------|----------|
| request | 是   | WMPFStartAppRequest | 启动小程序参数（完整版） | 2.2.0    |

### WMPFStartAppParams

| 属性    | 必填 | 类型        | 说明                                                                        | 最低版本 |
|---------|------|-------------|-----------------------------------------------------------------------------|----------|
| appId   | 是   | String      | 小程序 AppId。需在微信硬件平台上[和 hostAppId 绑定过](/doc/oplatform/Miniprogram_Frame/bind-app) |          |
| path    | 否   | String      | 小程序启动页面路径，不填则为小程序首页                                      |          |
| appType | 是   | WMPFAppType | 小程序类型，可选择正式版、体验版、开发版                                    |          |

### WMPFAppType

| 枚举值           | 说明                                         |
|------------------|----------------------------------------------|
| APP_TYPE_RELEASE | 正式版小程序                                 |
| APP_TYPE_DEV     | 开发版小程序，需要登录用户具备小程序开发权限 |
| APP_TYPE_EXP     | 体验版小程序，需要登录用户具备小程序体验权限 |

### LandscapeMode

| 枚举值           | 说明                                                                                                   |
|------------------|--------------------------------------------------------------------------------------------------------|
| NORMAL           | 默认展示方式，与微信客户端保持一致                                                                     |
| LANDSCAPE        | 适用于强制横屏，且无法转动屏幕的设备(比如车机)                                                         |
| LANDSCAPE_COMPAT | 兼容模式，小程序内容将强制 WMPFUiApi.setWindowRatio 设置的比例显示（声明了resizable=true的小程序除外） |
| FORCE_COMPAT     | 强制兼容模式（声明了resizable=true的小程序也不例外）                                                   |

### DisplayMode

| 枚举值           | 说明                                                                                                   |
|------------------|--------------------------------------------------------------------------------------------------------|
| NORMAL           | 默认展示方式，与微信客户端保持一致（小程序显示状态栏和导航栏、小游戏全屏显示） |
| FULLSCREEN        | 全屏显示（隐藏状态栏和导航栏）                                                        |
| HIDE_STATUS_BAR | 只隐藏状态栏 |
| HIDE_NAVIGATION_BAR     | 只隐藏导航栏                                                   |

### WMPFStartAppRequest

| 属性                  | 必填 | 类型               | 说明                                                                                                                                          | 最低版本 |
|-----------------------|------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------|----------|
| params                | 是   | WMPFStartAppParams | 启动小程序参数                                                                                                                               |          |
| forceFullscreen       | 否   | boolean            | 是否强制全屏显（已废弃，改用 displayMode）                                                                                                        |          |
| landscapeMode         | 否   | LandscapeMode      | 启动小程序展示方式                                                                                                                            |          |
| displayId             | 否   | int                | 从 Android DisplayManager 中获取到的 displayId，用于指定小程序显示的屏幕。在双屏设备、将小程序嵌入屏幕指定区域可用。                                     |          |
| enterPictureInPicture | 否   | boolean            | 进入画中画模式，默认 false。画中画模式需要接入方的 ROM 支持，支持方式参考：https://source.android.google.cn/devices/tech/display/pip?hl=zh-cn |          |
| zoom | 否   | float            | 小程序缩放 | 2.3.0 |
| ratio | 否   | float            | 兼容模式下小程序的高宽比，默认为屏幕长边比上屏幕短边 | 2.3.0 |
| processId | 否   | String            | 【实验性接口，未来可能被废弃】指定小程序运行在 WMPF 的某个 container 进程上，配合 WMPFUiApi.setZoomForProcess 使用。 | 2.3.0 |
| suspendTimeout | 否 | int | 小程序在后台运行指定秒数后暂停 | 2.3.0 |
| suicideTimeout | 否 | int | 小程序在后台被暂停指定秒数后结束进程 | 2.3.0 |
| forceIndexNoRelaunch | 否 | boolean | 设置为 true 时，若小程序已启动且 params.path 为空，将不会跳转页面；设置为 false 时，将跳转到小程序首页 | 2.3.0 |
| disableOpenAnimation | 否 | boolean | 禁用小程序自带的弹出动画。适合不需要小程序从底下向上弹出动画的场景。 | 2.3.0 |
| displayMode | 否 | DisplayMode | 指定小程序系统状态栏、导航栏显示模式或全屏。 | 2.3.0 |
| usingAllowList | 否 | boolean | 只打开小程序列表内的小程序。对于不在小程序列表内的小程序，提示用户无法打开。 | 2.4.0 |
| floatWindow | 否 | boolean | 使用悬浮窗模式打开小程序 | 2.4.0 |
| specific | 否 | WMPFFloatWindowSpecific | 小程序浮窗模式，设置小程序 Activity 的 Window 参数，可以将小程序显示到屏幕的某个子区域且区域外透明 | 2.4.0 |

### WMPFFloatWindowSpecific

悬浮窗小程序是在 Android 系统内通过 `WindowManager.addView` 的方式创建的悬浮窗内显示小程序的形态。
悬浮窗小程序的 orientation 和系统屏幕 Display 的 orientation 无关，由小程序自身状态控制（小程序全屏播放视频时会变换到横屏悬浮窗，此时手机/车机屏幕可能还是竖屏显示状态）。

| 属性 | 必填 | 类型 | 说明 | 最低版本 |
| -- | -- | -- | -- | -- |
| landscapeWidth | 是 | int | 横屏悬浮窗宽度，单位 px | 2.1.0 |
| landscapeHeight | 是 | int | 横屏悬浮窗高度，单位 px | 2.1.0 |
| portraitWidth | 是 | int | 竖屏悬浮窗宽度，单位 px | 2.1.0 |
| portraitHeight | 是 | int | 竖屏悬浮窗高度，单位 px | 2.1.0 |
| initOrientation/orientation | 否 | int | 悬浮窗初始方向，默认为竖屏 | 2.1.0 |
| requestFocus | 否 | boolean | 悬浮窗是否申请焦点，默认 true | 2.1.0 |
| portraitSpec | 是 | WMPFFloatWindowOrientationSpecific | 竖屏悬浮窗配置 | 2.4.0 |
| landscapeSpec | 是 | WMPFFloatWindowOrientationSpecific | 横屏悬浮窗配置 | 2.4.0 |
| cornerRadius | 否 | float | 悬浮窗圆角大小 | 2.1.0 |
| layer | 否 | int | 悬浮窗层级，值与 `WindowManager.LayoutParams.type` 对应，默认值为 `WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY` | 2.4.0 |
| preserveLocation | 否 | 悬浮窗是否保存位置。若保存位置，则本次启动小程序传入的 x、y 将无效，使用原来在后台的悬浮窗小程序被关闭前的坐标。（注意，如果悬浮窗小程序被杀，将不会记录坐标）| 2.4.0 |
| closedOnTouchOutside | 否 | boolean | 点击悬浮窗外侧是否自动关闭悬浮窗。| 2.4.0 |

### WMPFFloatWindowOrientationSpecific

悬浮窗横屏或者竖屏的配置。

| 属性 | 必填 | 类型 | 说明  | 最低版本 |
| -- | -- | -- | -- | -- |
| width | 是 | int | 悬浮窗宽度（单位 px） | 2.4.0 |
| height | 是 | int | 悬浮窗高度（单位 px） | 2.4.0 |
| x | 否 | int | 窗口 x 坐标（单位 px） | 2.4.0 |
| y | 否 | int | 窗口 y 坐标（单位 px） | 2.4.0 |
| gravity | 否 | int | 悬浮窗 WindowManager.LayoutParams#gravity。 | 2.4.0 |
| fixedLocations | 否 | int | 浮窗小程序吸附位置，设置后浮窗小程序被拖动后会吸附在最近的指定位置。 | 2.4.0 |
| dragAreaHeight | 否 | int | 悬浮窗拖拽区域高度，单位 px。 | 2.4.0 |
| dragBarSize | 否 | int | 悬浮窗拖拽条宽高，单位 px。 | 2.4.0 |
| dragBarMarginTop | 否 | int | 悬浮窗拖拽条上边距。默认值为 -1，表示上下居中。适用于悬浮窗拖拽条在 dragArea 中不是上下居中的情况。 | 2.4.0 |
| dragBarDayColor | 否 | int | 悬浮窗拖拽条浅色（日间）模式颜色 ARGB。浅色模式下默认为黑色。 | 2.4.0 |
| dragBarNightColor | 否 | int | 悬浮窗拖拽条深色（夜间）模式颜色 ARGB。深色模式下默认为白色。 | 2.4.0 |
| layoutInScreen | 否 | int | 悬浮窗是否在屏幕内布局，而不是在可用区域（即除导航栏状态栏外的区域）内布局。 | 2.4.0 |
| draggableHorizontally | 否 | int | 是否允许悬浮窗横向拖动 | 2.4.0 |
| draggableVertically | 否 | int | 是否允许悬浮窗纵向拖动 | 2.4.0 |
| layoutNoLimits | 否 | boolean | 是否允许悬浮窗部分移动到屏幕外。建议配合 fixedLocation 使用，允许用户拖动悬浮窗到屏幕外后自动吸附到最近的位置。对应 WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS。 | 2.4.0 |

## 返回参数

无

## 示例代码

```kotlin
val miniProgramApi = WMPF.getInstance().getMiniProgramApi()
miniProgramApi.launchMiniProgram(WMPFStartAppParams(
    appId="wxe5f52902cf4de896",
    path="",
    appType=WMPFAppType.APP_TYPE_RELEASE
))

miniProgramApi.launchMiniProgram(WMPFStartAppRequest(WMPFStartAppParams(
    appId="wxe5f52902cf4de896",
    path="",
    appType=WMPFAppType.APP_TYPE_RELEASE
)).apply {
  floatWindow = true
  specific = WMPFFloatWindowSpecific(800, 1000, 1000, 800, 15, 0, 0, true)
})
```

## 注意

* WMPF 需要有后台弹出页面权限。
* 对于体验版和开发版小程序，WMPF 必须要先用户登录之后，且登录的用户具备小程序体验版或者开发版打开权限才能正常打开。
- 如果弹窗提示 `Error Loading WxaAttrs`，请确认
  - 可能打开正式版（appType==0），但小程序没有发布过正式版本。小程序正式上线前请根据需要使用 1（开发版）或 2（体验版）。
  - 可能打开开发版（appType==1），但 WMPF 端未扫码登录，或登录用户无开发版权限，或该用户未在工具上上传开发版。
  - 可能打开体验版（appType==2），但 WMPF 端未扫码登录，或登录用户无体验版权限，或小程序当前无体验版。
- 如果弹窗提示 `err:TRANSFER, errCode:-3`，一般是当前移动应用无打开对应小程序的权限，请确认
  - 已在「微信终端合作平台」上[「绑定移动应用和小程序」](/doc/oplatform/Miniprogram_Frame/bind-app)
  - [激活设备](/doc/oplatform/Miniprogram_Frame/api/client/ActivateDevice)时，传入了正确的 hostAppId
