iTOP-4412全能版采用四核Cortex-A9,主频为1.4GHz-1.6GHz,配备S5M8767 电源管理,集成USB HUB,选用高品质板对板连接器稳定可靠,大厂生产,做工精良。接口一应俱全,开发更简单,搭载全网通4G、支持WIFI、蓝牙、陀螺仪、CAN总线、RS485总线、500万摄像头等模块,稳定运行Android 4.0.3/Android 4.4操作,系统通用Linux-3.0.15+Qt操作系统(QT支持5.7版本),Ubuntu版本:12.04,接口智能分配 方便好用。
【交流群2】258811263(获取开源资料)
【迅为B站】北京迅为电子的个人空间-北京迅为电子个人主页-哔哩哔哩视频
第一百零二章 Android 4.0典型功能相关源码修改及定制
102.1 iTOP-4412-Android4.0-更改默认休眠时间
Android 默认休眠时间是可以修改的,下面以将开发板休眠时间修改成无限长为例来讲解具体怎么操作。如下图,打开 Android 源码中的文件
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
找到“<integer name="def_screen_off_timeout">600000</integer>”这一行,这里单位是 ms,下图中是 10 分钟后休眠,如果改成-1 则不休眠。
102.2 去掉默认安装的APK
在 Android 文件系统中,默认安装了一些应用程序,如果有不需要的可以将其去掉,本小节和下一小节结合了来使用。
如下图所示,在 Android 源码目录“device/samsung/smdk4x12/apk”中,有一些默认的应用程序。
102.3 将APK编译到Android镜像中
上一小节中,讲到如何去掉默认安装的 APK,如果用户需要将 APK 编译到 Android 镜像中,除了需要将 APK 拷贝到“device/samsung/smdk4x12/apk”目录中,还需要添加安装脚本。
如下图所示,安装 APK 的脚本是“device/samsung/smdk4x12/device.mk”,我们以led 为例。
如下图所示,这两行脚本是与 led 相关的。首先将 ledtest.apk 放到对应的文件夹中。其次,ledtest 需要一个库文件,这个库文件也要放到对应的文件夹中。
如果是其它的 APK,可以参照 ledtest 的脚本。
102.4手机和平板模式(横屏竖屏)
在 Android 系统中,有手机和平板两种模式。可以通过修改 Android 代码,改变开发板的模式。
如下图所示,切换手机模式和平板模式的文件是“device/samsung/smdk4x12/BoardConfig.mk”,打开该文件。
找到文件中的参数“BOARD_USES_HIGH_RESOLUTION_LCD”,如下图所示,如果变量设置为“true”,则是对应平板模式,如果是“false”,则对应手机模式
102.5 设置Android的GPS
开发板支持两种 GPS 模块,分别为 GNS7560 和 UBLOX,下面讲解一下代码里面怎么选择对应的驱动。
这两种 GPS 模块都是通过串口来传输数据的,linux 内核里面已经支持串口的驱动了,所以我们需要修改的只是 android 代码,通过配置对应的宏来选择支持我们使用的 GPS,进入到 “iTop4412_ICS” android 的源码目录,如下图。
然后输入“vi device/samsung/smdk4x12/BoardConfig.mk”命令,如下图。
然后在 BoardConfig.mk 文件里面找到“BOARD_HAVE_GNS7560 := false”,如下图。
如果使用 GNS7560 模块,需要把这行改成:
BOARD_HAVE_GNS7560 := true
如果使用 UBLOX 模块,需要把这行改成:
BOARD_HAVE_GNS7560 := false
修改完成以后,保存并退出。然后在终端依次输入下面的两条编译命令:
make clobber
./build_android.sh
重新编译 android 就可以了,最后会生成的 Android 镜像就可以支持对应的 GPS。
102.6 设置Android的HDMI转VGA
在 Android 源码目录(iTop4412_ICS)下打开文件“device/samsung/smdk4x12/BoardConfig.mk”,找到“BOARD_HDMI_STD := STD_1080P”,如下图。
然后把这一行修改为:”BOARD_HDMI_STD := STD_480P_TOPEET“,如下图所示:
然后退出并保存。如果以前编译过 Android,需要执行下面的命令删除编译生成的一些中间文件,如下图所示。
然后执行“./build_android.sh”编译 Android,如下图所示。
编译完成后,最后把生成的镜像烧写到开发板上。
102.7 设备节点权限的修改
在 Android 下调用设备内核驱动的设备节点的时候,会遇到没有权限的问题,这个时候需要修改一下设备权限。下面以串口为例介绍一下,其它的设备修改方法也类似。
在 android 下操作串口有时会遇到没有权限的问题,这就需要修改下 android 的启动脚本,在里面修改下串口的权限。
在 android 源码目录下输入“vi device/samsung/smdk4x12/conf/init.smdk4x12.rc”,如下图所示。
在里面找到修改权限的地方,如下图所示。
上面的“chmod 777 xxxx”就是修改设备节点的权限,比如我们现在想修改串口 0(/dev/ttySAC0)的权限,那我们在这下面输入“chmod 777 /dev/ttySAC0”就可以了, 如下图所示。
其他几个串口的修改方法也是这样的,修改完以后,保存并退出,回到 android 源码的目录下面,如下图所示。
然后输入“./build_android.sh ”开始编译 android,如下图所示。
编译完成后,把生成的“ramdisk-uboot.img”和“system.img”烧到开发板里面,重新启动 android,就可以看到串口 0(/dev/ttySAC0)的权限修改了。
102.8 Android系统VGA显示时横竖屏切换方法
Android 系统使用 VGA 显示时,默认是横屏,需要修改为竖屏(11.9.4 修改对 VGA 显示无效)。
修改 android 源码“device/samsung/smdk4x12/system.prop”文件里面的ro.sf.hwrotation 参数。默认参数值 270 设置为 0,VGA 显示正常。
102.9 Android 4.0通过脚本实现IP地址的设置
本章介绍修改源码,使系统启动时执行一个脚本来设置有线网 ip:
n 编写 shell 脚本 iTop4412_ICS/device/samsung/smdk4x12/myinit.sh,注意开头一定要是”#! /system/bin/sh“,内容如下:
#! /system/bin/sh
echo “This shell added by Pojun”
ifconfig eth0 192.168.1.130
修改脚本 iTop4412_ICS/device/samsung/smdk4x12/device.mk,增加一行, 使编过程中将myinit.sh 拷贝到镜像文件中,目标路径为/system/bin:
PRODUCT_COPY_FILES += \
device/samsung/smdk4x12/myinit.sh:system/bin/myinit.sh
修改源代码中的启动脚本“iTop4412_ICS/system/core/rootdir/init.rc “,在末尾添加 service 定义:
service myinit /system/bin/myinit.sh
class main
user root
group root
oneshot
重新编译只要两分钟
n 将重新编译的 android 镜像烧写到开发板(注意,只需要烧写android 系统镜像就可以了),重新启动后,查看 ip 地址:
Ip a
显示eth0 的 ip 地址为 192.168.1.130,OK!
102.10 Android 4.0讯飞语音第三方库
资料包全称是“iTOP-4412-Android4.0 讯飞语音第三方库的使用.rar”,介绍了Android4.0 讯飞语音第三方库的使用过程。在网盘“iTOP4412开发板资料汇总(不含光盘内容)\iTOP-4412 开发板系统源码及镜像(其他)\Android模块测试例程\iTOP-4412-Android4.0讯飞语音第三方库的使用.rar” 目录下可找到配套资料。
讯飞语音Demo简介(第三方库)
1.百度上搜索讯飞开放平台,如图1所示
2. 注册一下账户,然后下载其相关的Android SDK 如图2所示,在此我以“语音+(语记)”写为例。(温馨提示,可以把组合服务SDK下载中的“语音听写”、“在线语音合成”也一并下载了)
3.解压下载得到的SDK 里面会有一个sample 文件,里面有三个demo,直接导入eclipse中就可以使用,如图3所示,读者可以参考着官方给出的例子来做。
4.下面呢介绍的是自己写一个简单的Demo,将文字转换为语音。新建一个项目工程
1)导入SDK 将官网中下载好的压缩包中的libs目录下的所有文件拷贝到工程目录中的libs 目录中,如图所示
- 在AndroidManifest.xml中添加用户权限
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
3)初始化如图4所示 ,
APPID 是你在申请SDK时得到的如图所示,
输入语音UI,在此可以使用SDK资源包中的assets文件中的资源文件如图所示,这一步可以做,可以不做。
5)添加代码
FlowerCollector.onResume(Context) 和 onResume(context),destory();如图所示
1、设置一些基本的参数
private SpeechSynthesizer mTts;
private EditText et_text;
private int mPercentForBuffering = 0;
// 播放进度
private int mPercentForPlaying = 0;
// 引擎类型
private String mEngineType = SpeechConstant.TYPE_LOCAL;
// 默认发音人
private String voicer = "xiaoyan";
private String voicer2="xiaomei";
2、Button 中的监听内容是
btn_speak.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
//String text = "讯为科技,你多打听打听";
String text=et_text.getText().toString().trim();
if(text.equals(null))
{
//showTip("内容是空的,请输入内容");
return;
}
// 设置参数
setParam();
int code = mTts.startSpeaking(text, mTtsListener);
}
});
3、初始化监听
private InitListener mTtsInitListener = new InitListener() {
@Override
public void onInit(int code) {
Log.d(TAG, "InitListener init() code = " + code);
if (code != ErrorCode.SUCCESS) {
showTip("初始化失败,错误码:"+code);
} else {
// 初始化成功,之后可以调用startSpeaking方法
// 注:有的开发者在onCreate方法中创建完合成对象之后马上就调用startSpeaking进行合成,
// 正确的做法是将onCreate中的startSpeaking调用移至这里
}
}
};
- 合成回调监听
private SynthesizerListener mTtsListener = new SynthesizerListener() {
@Override
public void onSpeakBegin() {
showTip("开始播放");
}
@Override
public void onSpeakPaused() {
showTip("暂停播放");
}
@Override
public void onSpeakResumed() {
showTip("继续播放");
}
@Override
public void onBufferProgress(int percent, int beginPos, int endPos,
String info) {
// 合成进度
mPercentForBuffering = percent;
showTip(String.format("缓冲进度为%d%%,播放进度为%d%%",
mPercentForBuffering, mPercentForPlaying));
}
@Override
public void onSpeakProgress(int percent, int beginPos, int endPos) {
// 播放进度
mPercentForPlaying = percent;
showTip(String.format("缓冲进度为%d%%,播放进度为%d%%",
mPercentForBuffering, mPercentForPlaying));
}
@Override
public void onCompleted(SpeechError error) {
if (error == null) {
showTip("播放完成");
} else if (error != null) {
showTip(error.getPlainDescription(true));
}
}
@Override
public void onEvent(int eventType, int arg1, int arg2, Bundle obj) {
// 以下代码用于获取与云端的会话id,当业务出错时将会话id提供给技术支持人员,可用于查询会话日志,定位出错原因
// 若使用本地能力,会话id为null
// if (SpeechEvent.EVENT_SESSION_ID == eventType) {
// String sid = obj.getString(SpeechEvent.KEY_EVENT_SESSION_ID);
// Log.d(TAG, "session id =" + sid);
// }
}
};
5、setParam 为设置参数 语音的一些参数
private void setParam(){
// 清空参数
mTts.setParameter(SpeechConstant.PARAMS, null);
// 根据合成引擎设置相应参数
if(mEngineType.equals(SpeechConstant.TYPE_CLOUD)) {
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_CLOUD);
// 设置在线合成发音人
mTts.setParameter(SpeechConstant.VOICE_NAME, voicer);
//设置合成语速
mTts.setParameter(SpeechConstant.SPEED, "50");
//设置合成音调
mTts.setParameter(SpeechConstant.PITCH, "50");
//设置合成音量
mTts.setParameter(SpeechConstant.VOLUME, "50");
}else {
mTts.setParameter(SpeechConstant.ENGINE_TYPE, SpeechConstant.TYPE_LOCAL);
// 设置本地合成发音人 voicer为空,默认通过语记界面指定发音人。
mTts.setParameter(SpeechConstant.VOICE_NAME, null);
/**
* TODO 本地合成不设置语速、音调、音量,默认使用语记设置
* 开发者如需自定义参数,请参考在线合成参数设置
*/
}
//设置播放器音频流类型
mTts.setParameter(SpeechConstant.STREAM_TYPE, "3");
// 设置播放合成音频打断音乐播放,默认为true
mTts.setParameter(SpeechConstant.KEY_REQUEST_FOCUS, "true");
// 设置音频保存路径,保存音频格式支持pcm、wav,设置路径为sd卡请注意WRITE_EXTERNAL_STORAGE权限
// 注:AUDIO_FORMAT参数语记需要更新版本才能生效
mTts.setParameter(SpeechConstant.AUDIO_FORMAT, "wav");
mTts.setParameter(SpeechConstant.TTS_AUDIO_PATH, Environment.getExternalStorageDirectory()+"/msc/tts.wav");
}