# ShowCore-Open
**Repository Path**: xiaowei127/ShowCore-Open
## Basic Information
- **Project Name**: ShowCore-Open
- **Description**: 使用 iFLYOS 的 EVS 协议开发的、运行在 Android 平台的通用语音交互 Launcher App。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-09-18
- **Last Updated**: 2022-06-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 带屏设备开源项目 ShowCore Open
本项目是使用 iFLYOS 的 [EVS协议](https://doc.iflyos.cn/device/evs/) 开发的、运行在 Android 平台的通用语音交互 Launcher App。项目的根本目的是为了减少开发者集成到自有硬件中的开发成本,可以快速开发一款使用 iFLYOS 的智能音箱。
## 运行项目
### 依赖项
* 要求 cmake 3.6 或更高的版本。(用于编译唤醒的 JNI 模块)
* [Android SDK tools](https://developer.android.com/studio/#comand-tools)。(Android Studio 中已内置)
### 集成开发环境
项目开发使用的是 Android Studio 3.5 正式版。
### EVS SDK
项目中引入了 [SDK-EVS-Android](https://github.com/iFLYOS-OPEN/SDK-EVS-Android) 作为 `evs_sdk` 模块,其中代码更新将与 [SDK-EVS-Android](https://github.com/iFLYOS-OPEN/SDK-EVS-Android) 同步。
## App 提供能力概述
整个项目的前提是,为智能音箱开发语音交互应用。在此前提下,App 声明作为 Launcher,期望作为设备开机后的第一入口,比较符合智能音箱的交互。
初次打开应用时,App 提供了简易的网络配置引导和授权绑定引导。
授权完成后,App 提供了一个会提供部分交互推荐的桌面、音频播放界面、视频播放界面、闹钟界面、包含部分简单配置项的设置界面。在主界面中,提供会在桌面轮播的推荐项,左上角可以进入提供有声内容和视频内容推荐的「内容发现」和语音交互使用概览的「技能中心」。
## App 依赖权限概述
为了实现智能音箱的大部分交互,App 依赖若干权限,期望效果中 ROM 在集成应用后应当能在开机后授予应用所有的权限。以下为各个权限及其相关用途说明,如果你开发过程中并不需要,亦可以酌情移除部分权限。
> 以下罗列的主要是我们认为较为重要的需要介绍的权限,针对一些特殊设备的适配时可能有额外的工作要做。例如,VIVO 一些机型上调节音量会导致自动开关勿扰模式,因此你会发现项目中也声明了 `android.permission.ACCESS_NOTIFICATION_POLICY` 权限来解决这种特殊情况。
### 录音权限(必须)
用于发送语音请求和语音唤醒模块
```xml
```
### 网络连接权限(必须)
用于各种网络请求
```xml
```
### 网络状态获取与修改权限
用于在引导页面、设置页面中的 WLAN 引导。Manifest 包含以下内容。
```xml
```
### 获取当前前台应用状态
服务端可以根据当前前台应用,将语义分配给不同的技能做处理,提供更人性化的交互体验。
```xml
```
### 悬浮窗
App 通过悬浮窗接口实现了全局可显示的 **语音唤醒按钮**、**语音识别界面**、**左边缘右滑返回手势**、**上边缘下拉控制栏**、**静态模板渲染界面**。
```xml
```
> 请注意,返回手势默认只在 App 内才可以有效,全局返回手势需要将 App 作为系统应用或通过 adb 手动授予 `android.permission.INJECT_EVENTS` 权限。
### 修改系统设置
通过这些权限,App 可以做到识别你调节音量、亮度等系统设置相关的语音请求,并对 Android 设备做出相应的更改。
```xml
```
### 请求安装应用
项目中包含了一个通用的 OTA 模块,可以通过 iFLYOS 的 [自动更新API](https://doc.iflyos.cn/device/ota.html) 更新 App。下载上传到设备控制台的 APK 后,应用提示安装。
```xml
```
## 语音唤醒
项目中使用了 70 版本的唤醒引擎实现,可使用 [自定义唤醒词工具](https://www.iflyos.cn/custom-awake-words) 生成你所要自定义的唤醒词文件,解压后替换到 `app/src/main/assets/wakeup/` 下,并在 `app/src/main/java/com/iflytek/cyber/iot/show/core/record/EvsIvwHandler.kt` 代码文件中对如下代码片段进行修改
```kotlin
// others codes
init {
val externalCache = context.externalCacheDir
val customWakeResFile = File("$externalCache/wake_up_res_custom.bin") // 自定义唤醒词
if (!customWakeResFile.exists()) {
val wakeUpResFile = File("$externalCache/wake_up_res.bin")
wakeUpResFile.createNewFile()
val inputStream = context.assets.open("wakeup/lan2-xiao3-fei1.bin")
val outputStream = FileOutputStream(wakeUpResFile)
val buffer = ByteArray(1024)
var byteCount = inputStream.read(buffer)
}
}
// others codes
```
对其中引用 `assets` 目录的 `wakeup/lan2-xiao3-fei1.bin` 路径替换为你所命名的文件路径即可。
## 应用保活
项目中增加了 `keepalive` 模块,用于保证语音交互服务可以一直运行。语音服务在运行过程中会定制启动 `keepalive` 中的服务,服务在一段时间内未收到心跳包后,则会主动调用启动 ShowCore 的主界面。
> **注意**
>
> `keepalive` 应用并未声明开机自启动,保活功能生效必须至少被语音服务启动过一次。
## 其他
为了拥有更好的体验,我们推荐使用 adb 对设备执行以下命令进入全屏模式。
```
adb shell settings put secure user_setup_complete 0
adb shell settings put global policy_control "immersive.full=*"
```
如果你可以授予设备 `android.permission.WRITE_SECURE_SETTINGS` 权限的话,也可以通过 Android 的 Settings API 执行上述授权。
```kotlin
Settings.Secure.putInt(contentResolver, "user_setup_complete", 0)
Settings.Global.putString(contentResolver, "policy_control", "immersive.full=*")
```
恢复原有状态则执行以下命令
```
adb shell settings put secure user_setup_complete 1
adb shell settings put global policy_control "immersive.full="
```
## License
[Apache License, Version 2.0](LICENSE)