APP 语音播报功能问题排查
问题现象:
APP 收到消息后,有震动,但没有语音播报。
进一步:自定义 Loader 同步代码后,可以语音播报。但打包正式包安装后仍然无语音播报。
问题排查过程:
跟踪 Logcat 看到错误日志如下,报错:
Caused by: java.lang.SecurityException: getDeviceId: Neither user 10173 nor current process has android.permission.READ_PHONE_STATE.
2022-04-25 17:41:45.274 25494-25494/? I/app3c: ——-here 1 at test_voice_speak.html:72
2022-04-25 17:41:45.294 25494-25494/? I/app3c: ——-value: 测试语音播报 at test_voice_speak.html:73
2022-04-25 17:41:45.324 25494-25494/? W/System.err: java.lang.reflect.InvocationTargetException
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at com.uzmap.pkg.uzcore.uzmodule.b$a.a(Unknown Source:2)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at com.uzmap.pkg.uzcore.uzmodule.b$1.run(Unknown Source:14)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at android.os.Handler.handleCallback(Handler.java:793)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at android.os.Handler.dispatchMessage(Handler.java:98)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at android.os.Looper.loop(Looper.java:173)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6698)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at java.lang.reflect.Method.invoke(Native Method)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
2022-04-25 17:41:45.324 25494-25494/? W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: Caused by: java.lang.SecurityException: getDeviceId: Neither user 10173 nor current process has android.permission.READ_PHONE_STATE.
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at android.os.Parcel.readException(Parcel.java:1951)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at android.os.Parcel.readException(Parcel.java:1897)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.android.internal.telephony.ITelephony$Stub$Proxy.getDeviceId(ITelephony.java:4823)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at android.telephony.TelephonyManager.getDeviceId(TelephonyManager.java:994)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.unisound.common.k.c(Unknown Source:8)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.unisound.common.k.a(Unknown Source:47)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.unisound.sdk.au.(Unknown Source:61)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.unisound.client.SpeechSynthesizer.(Unknown Source:0)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: at com.snake.otherofflinespeak.OtherOffLineSpeakModule.jsmethod_speak(OtherOffLineSpeakModule.java:84)
2022-04-25 17:41:45.325 25494-25494/? W/System.err: … 10 more
2022-04-25 17:41:45.326 25494-25494/? I/app3c: ——-here 3 at test_voice_speak.html:84
检查权限,所有 ~~~~ 能给的权限都给到应用了。
但发现,“获取手机信息”的权限,没地方可以分配给该应用。
config.xml 文件已有手机信息的权限,但感觉未生效。
我发了一个帖子:https://developer.yonyou.com/forum.php?mod=viewthread&tid=209515
参考帖子:https://developer.yonyou.com/thread-110959-1-1.html
看官方文档对 requestPermission 的 api 信息:https://docs.apicloud.com/Client-API/api#requestPermission
最终问题定位:动态权限申请。
解决办法:
1、修改编译目标版本:修改 res/manifest.xml,没有就新增该文件。
2、增加动态权限申请:
// 权限的相关操作:权限的判断、申请
function checkPhonePermission(){
var permission = 'phone';
var resultList = api.hasPermission({
list: [permission]
});
if (resultList[0].granted) {
// 已授权,可以继续下一步操作
console.log("-------已授权");
} else {
api.confirm({
msg: '应用需要您的授权才能支持语言播报',
buttons: ['取消', '去设置']
}, function(ret) {
console.log("-------" +JSON.stringify(ret));
if (ret.buttonIndex == 2) {
api.requestPermission({
list: [permission],
}, function(res) {
console.log("-------" +JSON.stringify(res));
if (res.list[0].granted) {
// 已授权,可以继续下一步操作
console.log("-------申请后,已授权");
}
});
}
});
}
}
3、云编译界面增加电话权限