在上班时间一边接sdk ,一边总结接入语音sdk中出现的一些问题。拿来和大家分享一下, 不会写得很详细。
官方的sdk例子值得了解,并可以解决很多问题。
我在这里例举出几个自己犯下的错误 跟大家一起分享。
1.报单例创建失败的问题,参考 http://bbs.xfyun.cn/forum.php?mod=viewthread&tid=9688
2.AndoridJavaException: android.view.ViewRootImpl$CalledFromWrongThreadException :only the original thread that created a view hiearchy can touch its views.错误,
主要是在非UI层调用,如何解决。将内容写在 runOnUiThread 里可以解决问题,实际上的问题 :http://blog.csdn.net/vivianyouyi/article/details/51781141 ,我的问题是将Toast在Unity 调用的方法里直接调用。
3.导入jar包到Unity 里面的, build 之后运行发现报错说找不到引用, 要去看一下 讯飞的libs库是否导入到了Unity 的lib 库中(不能连文件夹一起拷,会有问题),讯飞Demo下有一个JsonParser 需要导入到Eclipse工程目录下,
4. 压缩问题, 因为讯飞支持的语音格式为wav 和pcm ,要支持语音发送的话得先压缩 ,我这里将pcm 格式转换为amr格式,你会发现还需要引用一个文件AmrInputStream,但是找不到这个文件,其实是有的,去sdk 目录全局搜索, 然后把文件找到了放到工程中 ,不能修改AmrInputStream的包名。
public byte[] pcm2amr()
throws IOException
{
InputStream inStream = new FileInputStream("/msc/mAudio.pcm");
AmrInputStream aStream = new AmrInputStream(inStream);
File file = new File("/msc/mAudio1" + ".amr");
file.createNewFile();
OutputStream out = new FileOutputStream(file);
byte[] x = new byte[1024];
out.write(35);
out.write(33);
out.write(65);
out.write(77);
out.write(82);
out.write(10);
int len;
while ((len = aStream.read(x)) > 0)
{
out.write(x, 0, len);
}
out.close();
aStream.close();
/*读取字节流*/
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1024);
byte[] b = new byte[1024];
int n;
while((n = fis.read(b))!= -1){
bos.write(b,0,n);
}
fis.close();
bos.close();
byte[] buffer = bos.toByteArray();
return buffer;
}
Android向Unity发送信息: UnityPlayer.UnitySendMessage("场景中的物体名", "场景中的物体名上挂在的任意名称Script里面的方法名", "传递内容”);
Unity向Android发送消息:
private AndroidJavaObject _ajo;
#if UNITY_ANDROID && !UNITY_EDITOR
AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
if (ajc != null)
{
_ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");
}
#endif
_ajo.Call<返回值>("方法名",params);
本文没有仔细检查或许还有很多问题, 大致犯的错误就这么多,仅供参考。后面再完善吧 。