https://github.com/stars-one/swan-android-libray
https://github.com/stars-one/swan-android-libray
Last synced: 8 months ago
JSON representation
- Host: GitHub
- URL: https://github.com/stars-one/swan-android-libray
- Owner: stars-one
- Created: 2022-02-08T02:56:35.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2022-04-21T08:19:54.000Z (over 3 years ago)
- Last Synced: 2024-12-27T04:26:09.164Z (9 months ago)
- Language: Java
- Size: 7.52 MB
- Stars: 0
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: readme.md
Awesome Lists containing this project
README
# Android 组件库
[](https://github.com/stars-one/android-component-libray)



Android原生组件库,为Html提供Android原生能力,增强H5
## Module目录及引用说明
|module名 |必选 |描述 |
|-- |-- |-- |
|webViewBase |√ |核心库,包含文件上传 |
|media |× |媒体库,包含拨打电话,发短信,拍照,录制视频等功能 |
|share |× |分享库,使用Android系统内置分享功能,进行文本或图片的分享 |
|device |× |设备信息库,用来获取当前设备的系统等信息 |
|notification |× |通知库,用来弹出通知栏通知 |
|storage |× |存储库,调用SharePerfence进行简单数据的存储(键值对形式) |
|listener |× |监听回调类的开源库,包含来电监听,网络状态监听,返回键监听 |
|debugger |× |开发调试辅助库 |
|update |× |自动更新库 |
|page |× |页面相关 |
|tim |× |腾讯IM |依赖引入(需要添加jitpack仓库源):
```
implementation 'com.github.stars-one.android-component-libray:module名:版本号'
```例:
```
implementation 'com.github.stars-one.android-component-libray:0.2'
```**注:以下使用的传参都是需要Json的字符串,需要调用`JSON.stringify()`方法将对象转为字符串**
## webViewBase使用
提供一个CustomWebViewActivity,首页的MainActivity需要继承于此Activity,之后再onCreate方法中调用以下两种方法之一,来加载url- `loadLocalUrl` 设置加载的url并加载
- `loadWebUrl` 加载url> **PS:loadLocalUrl主要是自动拼接了assets里的本地资源html文件,如下图**

由于文件选择的功能与Webview比较耦合,无法单独划分出一个module,所以内置在主module中
包含拍照,选择相册图片,录制视频,选择本地视频文件,录音,选择本地音频文件,和选择其他文件
## media使用
### 1.获取剪切板内容
`getTextFromClipboard()`
用来获取手机剪切板的文本内容
**传参:无需传参**
**返回结果:**
```
{"code":200,"desc":"","result":"剪切板的内容"}
```**H5调用示例:**
```
if (window.android_media) {
let result = window.android_media.getTextFromClipboard()
let text = JSON.parse(result).result
console.log(text)
}
```
### 2.复制文本`copyTextToClipboard(paramStr)`
往手机的剪切板写入内容,实现H5复制功能
**传参:**
```
{
content:"hello world"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {content:"hello world"}
let result = window.android_media.copyTextToClipboard(JSON.stringify(content))
console.log(result);
}
```### 3.拨打电话
`callPhone(paramStr)`拨打电话,会直接拨号
> 使用前需要声明电话权限,方法内已作了动态权限申请适配
``````
**传参:**
```
{
phone:"10086"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {
phone: "10086"
}
let result = window.android_media.callPhone(JSON.stringify(content))
console.log(result);
}
```### 4.跳转拨号页面
goToCall会跳转到拨号页面,无需申请电话权限
**传参:**
```
{
phone:"10086"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {
phone: "10086"
}
let result = window.android_media.goToCall(JSON.stringify(content))
console.log(result);
}
```### 5.发送短信
sendSms会跳转到短信发送页面,不会立即发送短信
**传参:**
```
{
phone:"10086", //手机号码
content:"111" //短信内容
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {
phone: "10086",
content: "111"
}
let result = window.android_media.sendSms(JSON.stringify(content))
console.log(result)
}
```### 6.图片预览
previewPicture
预览单张图片,之后点击图片会关闭
**传参:**
```
{
content: "",
type: 2
}
```
> 当`type`为1,`content`传base64数据;
>
> 当`type`为2,`content`传图片地址**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {
content: "https://gimg2.baidu.com/image_search/src=http%3A%2F%2Fimg.jj20.com%2Fup%2Fallimg%2Ftp01%2F1ZZQ214233446-0-lp.jpg&refer=http%3A%2F%2Fimg.jj20.com&app=2002&size=f9999,10000&q=a80&n=0&g=0n&fmt=jpeg?sec=1647143194&t=b67961882a5e7d01f6ecd8a503a9db47",
type: 2
}
let result = window.android_media.previewPicture(JSON.stringify(content))
console.log(result)
}
```
### 7.扫描二维码qrScan 扫描二维码
**传参:**
```
{
callBackMethod: "" //扫描二维码成功后的回调js方法
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
//object格式与返回结果一样,result即为二维码的文本数据
window.qrScanResult = function(object) {
console.log(object);
}function qrScan() {
if (window.android_media) {
let content = {
callBackMethod: "qrScanResult"
}
window.android_media.qrScan(JSON.stringify(content))
}
}
```### 8.语音播放文本
speakText 播放文本(如果没有tts引擎,会没法播放语音)
**传参:**
```
{
content: "这是一段测试语音的文本"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.android_media) {
let content = {
content: "这是一段测试语音的文本"
}
let result = window.android_media.speakText(JSON.stringify(content))
console.log(result)
}
```### 还未实现功能清单
8. 图片压缩(H5传参)
9. 文件下载
10. 文件预览(文件先下载再预览)
11. 安装apk
## notification通知
### 1.发送通知
sendNotification 状态栏显示一条新通知**传参:**
```
{
content: "测试内容11111",
title:"测试标题"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.notification) {
let content = {
content: "测试内容11111",
title:"测试标题"
}
let result = window.notification.sendNotification(JSON.stringify(content))
console.log(result)
}
```
### 2. 设置桌面小红点setBargeCount
**传参:**
```
{
content: "11" //未读数
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.notification) {
let content = {
content: "11"
}
let result = window.notification.setBargeCount(JSON.stringify(content))
console.log(result)
}
```
## share
默认分享会弹出分享方式(如分享给微信好友,复制文本,分享到QQ等选项)### 1.分享文本
shareText 弹出分享的对话框,选择某一应用进行分享
**传参:**
```
{
content: "这是分享的文本内容"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.share) {
let content = {
content: "这是分享的文本内容"
}
let result = window.share.shareText(JSON.stringify(content))
console.log(result)
}
```### 2.分享图片
shareImage 弹出分享的对话框,选择某一应用进行分享目前只支持传base64图片数据
**传参:**
```
{
content: "data:image/png;base64,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"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.share) {
let content = {
content: "data:image/png;base64,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"
}
let result = window.share.shareImage(JSON.stringify(content))
console.log(result)
}
```### 3.分享图文
shareImage 弹出分享的对话框,选择某一应用进行分享目前只支持传base64图片数据,测试发现文字没法获取,和分享图片效果一样
**传参:**
```
{
title:"分享的标题",
content: "data:image/png;base64,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"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.share) {
let content = {
title:"分享的标题",
content: "data:image/png;base64,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"
}
let result = window.share.shareTextImage(JSON.stringify(content))
alert(result);
console.log(result)
}
```### 4.分享文本给微信好友
shareToWechatFriend分享文本给微信好友,会直接弹出选择好友的列表页面
**传参:**
```
{
content: "分享的文本内容"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.share) {
let content = {
content: "分享的文本内容"
}
let result = window.share.shareToWechatFriend(JSON.stringify(content))
console.log(result)
}
```
## device设备### 1.获取设备mac地址
getMacAddress
获取设备mac地址
**传参:无需**
**返回结果:**
```
//成功 result中即为mac地址数据
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.device) {
let result = window.device.getMacAddress()
alert(result);
}
```### 2.获取唯一设备id
getUniqueDeviceId获取唯一设备id
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"2196aa50b16cd36d39df62298561809a1"}
```**H5调用示例:**
```
if (window.device) {
let result = window.device.getUniqueDeviceId()
alert(result);
}
```### 3.判断当前设备是否为平板
isTablet当前设备是否为平板
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":true}
```**H5调用示例:**
```
if (window.device) {
let result = window.device.isTablet()
alert(result);
}
```
### 4.判断当前设备是否为模拟器
isEmulator判断当前设备是否为模拟器
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":false}
```**H5调用示例:**
```
if (window.device) {
let result = window.device.isEmulator()
alert(result);
}
```
### 5.获取当前设备系统信息getDeviceInfo
获取当前设备系统信息
**传参:无需**
**返回结果:**
```
//成功
{
"code":200,
"desc":"",
"result":{
"model":"ZUKZ2121",//设备型号
"manufacturer":"ZUK" //设备厂商
"versionName":"11",//系统版本名
"versionCode":30,//系统版本号
}
}
```**H5调用示例:**
```
if (window.device) {
let result = window.device.getDeviceInfo()
alert(result);
}
```## storage使用
### 1.保存数据save
保存数据到Android内置的SharePerfence
**传参:**
```
{
key: "test",
value: "hello woll" //value可以是布尔值,字符串,整数,不能是一个JsonObject对象
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":false}
```**H5调用示例:**
```
if (window.storage) {
let content = {
key: "test",
value: "hello woll"
}
let result = window.storage.save(JSON.stringify(content))
alert(result);
console.log(result)
}
```### 2.读取数据
get
根据key值去获取保存的数据
**传参:**
```
{
key: "test"
}
```**返回结果:**
```
//成功 若result为空,则表示该key没有对应的数据
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.storage) {
let content = {
key: "test"
}
let result = window.storage.get(JSON.stringify(content))
alert(result);
console.log(result)
}
```## listener使用
### 1. 注册网络状态监听registerNetworkListener
注册网络状态的监听回调
**传参:**
```
//传两个js回调的方法名,之后Android原生会执行对应的JS方法
{
"callBackMethod": "networkDisconnect,networkConnect"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
window.networkDisconnect = function() {
alert("网络已断开")
}
window.networkConnect = function() {
alert("网络已连接")
}if (window.listener) {
let content = {
"callBackMethod": "networkDisconnect,networkConnect"
}
let result = window.listener.registerNetworkListener(JSON.stringify(content))
console.log(result)
}
```### 2.来电监听
registerPhoneListener
来电时候的监听回调
**传参:**
```
//传递个js回调的方法名,之后Android原生会执行对应的JS方法
{
"callBackMethod": "phoneCall"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
window.phoneCall = function() {
alert("来电了。。")
}if (window.listener) {
let content = {
"callBackMethod": "phoneCall"
}
let result = window.listener.registerPhoneListener(JSON.stringify(content))
console.log(result)
}
```## map
### 1. 获取当前地址
startLocation
获取当前地址
**传参:**
```
//传递个js回调的方法名,之后Android原生会执行对应的JS方法
{
"callBackMethod": "getLocation"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
window.getLocation = function(object) {
//object内容为{"addrStr":"中国广东省深圳市福田区梅林街道梅坳八路","city":"深圳市","district":"福田区","province":"广东省","street":"梅坳八路"}
console.log(object);
alert(JSON.stringify(object))
}function startLocation() {
if (window.map) {
let content = {
"callBackMethod": "getLocation"
}
let result = window.map.startLocation(JSON.stringify(content))
alert(result)
console.log(result)
}
}
```### 2.地图显示当前位置
showLocationInMap
打开地图页面,并展示当前的位置
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.map) {
let result = window.map.showLocationInMap()
alert(result)
console.log(result)
}
```### 待完成功能
4. 路径导航
5. 地图选点
6. 路径规划## handware
### 1.获取当前电量数值getBattery
获取当前电量数值
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"98%"}
```**H5调用示例:**
```
if (window.hardware) {
let result = window.hardware.getBattery()
alert(result)
console.log(result)
}
```
### 2.获取当前网络状态getNetworkState
获取当前网络状态
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"NETWORK_WIFI"}
```result字段的数值如下:
- `NETWORK_ETHERNET` 以太网
- `NETWORK_WIFI` Wifi
- `NETWORK_4G`
- `NETWORK_3G`
- `NETWORK_2G`
- `NETWORK_UNKNOWN` 未知网络
- `NETWORK_NO` 无网络**H5调用示例:**
```
if (window.hardware) {
let result = window.hardware.getNetworkState()
alert(result)
console.log(result)
}
```### 3.获取媒体最大音量
getMaxVolume获取当前网络状态
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"25"}
```> PS:不同手机,返回的最大音量可能会不同
**H5调用示例:**
```
if (window.hardware) {
let result = window.hardware.getMaxVolume()
alert(result)
console.log(result)
}
```### 3.获取媒体音量
getVolume获取当前媒体音量
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"11"}
```**H5调用示例:**
```
if (window.hardware) {
let result = window.hardware.getVolume()
alert(result)
console.log(result)
}
```### 4.设置媒体音量
setVolume设置当前的媒体音量
**传参:**
```
{
content: "11"
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.hardware) {
let content = {
content: "11"
}
let result = window.hardware.setVolume(JSON.stringify(content))
alert(result)
console.log(result)
}
```
### 5.获取屏幕亮度getBrightness
获取当前屏幕亮度
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":"11"}
```**H5调用示例:**
```
if (window.hardware) {
let result = window.hardware.getBrightness()
alert(result)
console.log(result)
}
```### 6.设置屏幕亮度
setBrightness
设置当前的屏幕亮度
**传参:**
```
{
content: "11"
}
```> 注:亮度范围为0-255
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```由于设置屏幕亮度需要权限的申请,所以第一次设置屏幕亮度会出现不成功(因为是申请权限操作),返回的结果为
```
"{"code":202,"desc":"未授予权限,设置亮度失败","result":""}"
```需要注意判断一下
**H5调用示例:**
```
if (window.hardware) {
let content = {
content: "11"
}
let result = window.hardware.setBrightness(JSON.stringify(content))
alert(result)
console.log(result)
}
```### 未完成
0. NFC
1. 蓝牙配对
2. 指纹识别
3. 人脸识别(包含活体检测)## debugger
> 注意:由于配置页面中需要扫一扫的功能,目前是复用了media的Module中的扫一扫页面,导致**使用此模块需要前提引入media的模块**
### 1.跳转到debugger页面
goSettingPage跳转到debugger页面,可输入一个在线地址用来测试页面功能(也含有扫一扫功能)
**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.debugger) {
let result = window.debugger.goSettingPage()
console.log(result)
}
```### 2.Bugly配置
目前引入了Bugly对接,**注意公司的网络环境对Bugly有限制,无法测试,建议使用移动网络****使用步骤:**
在AndroidManifest文件中,声明application,并修改Bugly的配置

**注:debugger默认有个appId,下面这个是在APP的AndroidManifest.xml文件,会将debugger模块中的`AndroidManifest.xml`覆盖掉**
```
```
如果有需求需要改动,只需要在主Module中,修改上述数值即可
> 注意:BaseApplication中是使用了**反射+注解**的方式实现了Module自动初始化(假如Module中使用的库需要在Application中进行初始化)
### 剩余功能
3. h5是否也要做成可配置的方式,来实现更换接口地址(优先读storege里的数据),入口设计思路为**依次按下音量键`+`和`-`次**
4. 360加固快捷打包## update使用
更新后台的部署操作,及更新
考虑几套更新策略
## page
### 1.跳转其他APP页面gotoApp
跳转其他APP页面
**传参:**
```
{
"packageName": "com.android.settings",//app应用应用包名
"activityName": "com.android.settings.Settings"//具体的某个页面Activity(全包名)
}```
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.page) {
//下面这里是进入设置页面
let content = {
"packageName": "com.android.settings",
"activityName": "com.android.settings.Settings"
}
let result = window.page.gotoApp(JSON.stringify(content))
console.log(result)
}
```## tim
腾讯云IM模块依赖之后,需要配置主module的Androidmainfest文件
```
android:name="com.tencent.qcloud.tim.demo.DemoApplication"
tools:replace="android:allowBackup"
```### 1.进入登录页
gotoImLogin 进入IM内置的登录页**传参:无**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.tim) {
window.tim.gotoImLogin()
}
```
### 2.IM登录
login**传参:**
```
{
"userId": "5913635",//im的userId
"userSig": "",//im的签名,不传会使用内置的sdkid计算
"isGotoPage": true //是否登录后跳转到IM的会话列表页面
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.tim) {
let content = {
"userId": "5913635",
"userSig": "",
"isGotoPage": true
}
let result = window.tim.login(JSON.stringify(content))
alert(result)
}
```### 3.IM退出
logout**传参:无需**
**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
if (window.tim) {
let result = window.tim.logout()
alert(result)
}
```### 4.获取消息未读数
使用前,需要调用上述2中的IM登录**传参:**
```
{
"callBackMethod": "loadUnreadCount",
}
```**返回结果:**
```
//成功
{"code":200,"desc":"","result":""}
```**H5调用示例:**
```
//返回数据以回调方式的回传给h5
window.loadUnreadCount = function(object){
alert(JSON.stringify(object))
}if (window.tim) {
let content = {
"callBackMethod": "loadUnreadCount",
}
let result = window.tim.getUnreadCount(JSON.stringify(content))
console.log(result)
}
```## 关于Module创建
若是想要创建一个module,需要进行以下几步
### 1.新建module


> **注意:**由于封装了自动扫描包实现了Js注入功能,规定包名一定要为`com.tyky`
>
### 2.module依赖修改
由于新建的module,没有核心库`webViewBase`的依赖,所以,需要导入依赖
上面的截图,由于module都是与webviewBase在同一项目中,所以可以这样写
实际上,这部分源码在对应的项目中是不存在的,所以,需要导入jitpack上的那个`webViewBase`依赖
### 3.创建Js注入类
使用Gradle进行sync,之后在新建的module中创建一个类,并标上注解`WebViewInterface`
`@WebViewInterface("share")`
此注解是个人自定义的一个注解,主要是实现了自动注入Js方法的功能,而无需去设置webview,可以十分方便的实现功能扩展
后面的参数为之后注入到Js中的使用方式
以上面为例:
之后注入到Js代码中,就可以在Js层通过`window.share.xx()`去调用我们原生Android的方法
### 4.创建Js注入方法
这里不再过多赘述,就写个注解即可

如果想要保持返回结果规范,可以参考上述代码
PS:之后使用不要忘记了依赖自己新建的module哦!!
### 补充
#### 需要Application进行初始化操作目前是使用了注解+反射方式,实现了Application的初始化,下面介绍一下步骤:
1.新建类,标明注解`@ApplicationInit`
2.实现接口`ModuleInit````
@ApplicationInit
public class UpdateModuleInit implements ModuleInit {@Override
public void init(Application application) {
//写你的初始化操作
}
}
```> PS:由于采用的包名扫描方式,**需要注意包名得在`com.tyky`下**
#### 清单文件怎么写?如果需求是要在module新建页面或者其他四大组件,可以在AndroidManifest文件中这样写对应的声明:
下面给出的Activity的声明,其他组件类似,这里不再赘述
```
```
如果是需要权限的,也是在此声明对应的权限,同时也要考虑到动态权限申请的情况
比较好的方式就是卸载对应Js方法里,用到就声明
#### ParamModel实体类字段:
```
/**
* 电话号码
*/
private String phone;/**
* 标题
*/
private String title;
/**
* 内容
*/
private String content;
/**
* 类型
*/
private Integer type;
/**
* 回调方法,多个用逗号隔开
*/
private String callBackMethod;/**
* shareperfence存储需要用到的key和value
*/
private String key;
private String value;
```# 功能清单
## 设备1. 获取原生APP的版本信息 (版本号,版本名)
2. 获取设备mac地址
3. 获取唯一设备ID
4. 判断是否是平板
5. 判断是否是模拟器## 地图
考虑使用哪种地图SDK?目前只对接过百度地图SDK,各款地图SDK使用的坐标系有所差异
1. 获取当前位置地址
2. 地图选择
3. 地图显示当前位置
4. 路径规划
5. 路径导航## 分享
1. 分享到微信好友
2. 分享给朋友圈
3. 分享到QQ
4. 使用浏览器打开
5. 单纯复制链接## 监听回调
1. 网络状态监听
2. 来电监听
3. 返回键监听## 媒体
1. 拍照
2. 录制视频
3. 录音
4. 图片选择
5. 图片预览
6. 二维码扫描
7. 拨打电话
8. 发送短信
9. 图片压缩
10. 安装apk
11. 文件下载
12. 获取剪切板内容
13. 写入剪切板内容## 页面
1. 设置页面标题
2. 打开第三方链接
3. 设置页面全屏
4. 设置隐藏导航条及还原
5. 退出APP## 通知
1. 提供一个固定格式可发通知,后端服务或者是前端也可以调用实现弹出通知
2. 预先对接友盟SDK推送通知功能## 登录(如果有原生实现登录)
1. 提供登录用户信息
2. 判断用户是否登录
## 页面跳转
1. 跳转登录页面(如果有原生登录功能)
2. 跳转微信小程序
## APP存储
1. 提供读写SharePerfences的功能,信息可永久保存(不卸载APP的情况下)
2. 提供判断是否第一次进入APP
## 硬件
1. NFC
2. 蓝牙配对
3. 指纹识别
4. 人脸识别(包含活体检测)
5. 获取当前电量数值
6. 设置屏幕亮度
7. 获取当前网络状态(数据网络还是Wifi)## 开发辅助配置功能(不是提供给H5的)
1. bugly SDK接入
2. 提供配置webview加载的地址(本地资源或是网络url地址)
3. h5是否也要做成可配置的方式,来实现更换接口地址(优先读storege里的数据),入口设计思路为**依次按下音量键`+`和`-`次**
4. 360加固快捷打包## 推进流程疑惑点
### 1.文件预览(pdf,doc,ppt,xls),
目前网上的资料只有实现了pdf和doc的预览,其他的格式没有找到有方案,
pdf可以使用webview进行预览(使用pdf.js),doc则是需要解压doc文件,然后实现渲染加载
自己实现比较困难,目前3个思路:
> 1.由后台+前端实现在线预览文档页面,app则可以直接通过访问url来预览文件
> 2.app内置实现,只能实现pdf或doc预览(需要先下载在本地),其他格式不行
> 3.与分享类似,打开一个第三方应用来查看文件(也是需要将文件下载在本地)### 2.分享功能,目前是实现的打开一个分享的对话框,然后有用户选择对应的方式,这样是否满足需求?
目前支持文本,图片,图文分享
图片需要有图片的uri地址,但是h5只能闯过来数据,是否是要讲图片数据先下载在本机的缓存目录中?需要考虑传多张图片(可以是图片地址或者是base64)
### 3.下载
由于存储权限的变更,下载实现需要对多不同Android版本进行测试验证,预估可能会花费较多时间,
### 4.无法解析安装包
360加固导致的某些Android设备无法成功解析安装包,出问题的大多是 Android11或Android12,没有设备,无法复现,且没有解决思路
目前确认apk重新签名是无误的,包含了v1+v2+v3版本的签名
### 4.通知栏点击的pendintent如何封装
通知有时候需要点击跳转到具体页面,这个pendinginent该如何实现封装,接收前端传的参数?
## 困难点和疑惑点
### 1.人脸识别(活体检测)
百度人脸识别
需要对接具体SDK,且SDK无法固定(客户可能会有所要求),无对接经验,需要参考具体SDK文档和demo进行编写,封装
集成SDK导致APP体积过大,是否考虑分离多模块进行打包?
单独库,项目配置文件,自定义gradle脚本,组件化module开发
### 2.地图导航和路径规划
各个地图采用的定位坐标系不一致,需要应该明确使用哪个平台的地图?还是多套都有所对接,然后按需使用?
地图导航和路径规划是否有必要做?
### 3.指纹识别
功能是否有需要?无相关开发经验
### 4.打包问题
是固定使用一个包名来打包H5?固定包名是否会对相关的SDK使用有所影响?
如何动态变更包名,保证是不同的applicationId?
关于动态打包
### 5.后续更新
拆分module,依赖,后续如何更新?
### 6.腾讯x5内核
集成之后要从网络中下载渲染引擎,约莫30M
## 建设目标
1.支持任意的前端框架,提供原生的能力
2.学习成本低,轻量
3.