可以通过 HBuilder 将 Vue 开发的项目打包成 APP,然而 web 项目无法直接访问原生功能。这个时候我们可以通过使用 H5+ 规范来实现对系统功能的访问。
判断当前环境是否支持 H5+ API
navigator.userAgent.indexOf("Html5Plus");
编写特定平台代码
虽然在编写跨平台的应用时,我们尽可能的复用代码。但总是会有些时候,我们会碰到针对不同平台编写不同代码的需求。
在 H5+ 中,可以通过 Device 模块来实现区分不同平台。
Device 模块
Attribute:
- imei: 设备的国际移动设备身份码。如果设备不支持则返回空字符串,如果设备有多个身份码,则以
,
号分割拼接成一个字符串。eg:862470039452950,862470039452943
- imsi: 设备的国际移动用户识别码
- model: 设备型号
- vendor: 设备的生产厂商
- uuid: 设备的唯一标识
Function:
- dial: 拨打电话
- beep: 发出蜂鸣声
- vibrate: 设备振动
- setWakelock: 设置应用是否保持唤醒(屏幕常亮)状态
- isWakelock: 获取程序是否一直保持唤醒(屏幕常亮)状态
- setVolume: 设置设备的系统音量
- getVolume: 获取设备的系统音量
使用上面的属性和方法时,注意需要在 manifest.json 中添加 Device 权限:
{
"permissions": {
"Device": {
"description": "设备信息"
}
}
}
Object:
- screen: Screen模块管理设备屏幕信息
- display: Display模块管理应用可使用的显示区域信息
- networkinfo: networkinfo模块用于获取网络信息
- os: OS模块管理操作系统信息
我们可以通过 os 对象来获取当前操作系统信息:
// 获取当前系统名称
console.log(plus.os.name);
os.name 属性在 iOS 上会返回 iOS
,而在 Android 设备上则会返回 Android
。我们可以通过判断当前设备系统的方法来对不同平台编写不同代码:
if (plus.os.name === 'iOS') {
// iOS 平台独有代码
} else if(plus.os.name === 'Android') {
// 安卓平台独有代码
}
检测系统版本
通过 plus.os.version 可以获取当前版本号,在 iOS 上,版本号类似12.1
,而在安卓上同样也是以8.0.0
形式返回,而不是返回 API 版本(例如25、28等格式)。
let version = convertVersionStrToNumber(plus.os.version);
if (version >= 800) {
// 安卓版本大于8.0
console.log("您的安卓版本大于或等于8.0.0");
}
/**
* 将标准版本字符串转换为数字以便于比较.
*
* @param versionStr
* @return int
*/
function convertVersionStrToNumber(versionStr) {
let vArr = versionStr.split('.');
let verNumber = parseInt(vArr[0]) * 100 + parseInt(vArr[1]) * 10 + parseInt(vArr[2]);
return verNumber;
}
H5+ 录音
在安卓设备上,由于浏览器支持录音,所以直接使用 web 录音那一套即可,但是在 iOS 设备上,webapp 使用的浏览器实际上是 safari ,而 safari 浏览器并不支持录音,所以这个使用我们必须使用 H5+ 的录音 api。
audio 模块
audio 模块可提供音频的录制和播放功能,可调用系统的麦克风设备进行操作,也可调用系统的扬声器来播放音频文件。
在 audio 模块中,通过 AudioRecorder
对象来实现录音,录音对象可以通过 getRecorder()
方法来获取。
let recorder = plus.audio.getRecorder();
AudioRecorder 对象
interface AudioRecorder {
readonly attribute String[] supportedSamplerates;
readonly attribute String[] supportedFormats;
function record( option, successCB, errorCB );
function stop();
}
attribute:
- supportedSamplerates: 只读数组,设备录音支持的采用率
- supportedFormats: 只读数组,设备录音支持的文件格式
function:
- record: 调用设备进行录音操作
- stop: 结束录音操作
在 iOS 上支持的录音格式有: wav
, aac
, amr
, mp3
,在 Android 上支持的录音格式有: amr
, 3gp
, aac
。建议在使用前最好通过 supportedFormats
属性来查看目标设备所支持的录制格式
record 方法
void recorder.record( option, successCB, errorCB );
record 方法有三个参数,第一个参数是录音配置参数,第二个是成功回调,第三个是失败回调。options 参数支持以下选项:
- channels: (string) 录音声道,可取值为:
mono
- 单声道;stereo
- 立体声道。默认值为mono
。仅在 iOS 7.0+ 上支持。 - filename: (string) 保存录音文件的路径。可设置具体文件名,也可只设置路径,如果以“/”结尾则表明是路径,文件名由录音程序自动生成。 如未设置则使用默认目录生成随机文件名称,默认目录为应用%APPID%下的documents目录。
- samplerate: (string) 录音采样率, 取值范围为 supportedSamplerates 数组中的元素,如果设置无效值,则使用默认值。
- format: (string) 录音格式,取值范围为 supportedFormats 中的元素,如果设置无效值,则使用默认值。
let recorder = null;
function startRecord() {
recorder = plus.audio.getRecorder();
new Promise((resolve, reject) => {
recorder.record({
filename: "_doc/audio/",
format: "mp3"
}, (p) => {
// 成功回调
// 因为成功回调调用时,可能录音文件还未完全写入到文件中,
// 所以我们这里等待1秒,让录音内容完全写入到文件中
setTimeout(_ => {
resolve(p);
}, 1000);
})
}).then(p => {
return new Promise((resolve, reject) => {
// resolveLocalFileSystemURL: 通过URL参数获取目录对象或文件对象
plus.io.resolveLocalFileSystemURL(p, entry => {
resolve(entry);
});
})
}).then(entry => {
return new Promise((resolve, reject) => {
entry.file(file => {
resolve(file);
})
})
}).then(file => {
let fileReader = new plus.io.FileReader();
fileReader.onloadend = evt => {
console.log('Base64:');
console.log(evt.target.result);
}
fileReader.readAsDataURL(file);
}).catch(err => {
console.log(err);
})
}
function stopRecord() {
recorder.stop();
}