Uninote
Uninote

可以通过 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();
}

使用深度修改组件样式

技术栈

点赞(1) 阅读(9) 举报
目录
标题