Closed speanut-land closed 5 years ago
可以参考代码中展示消息 widget 的逻辑,参见 message_item_factory.dart 的 messageItem 方法,具体如下
Widget messageItem() { if (message.content is TextMessage) { return textMessageItem(); } else if (message.content is ImageMessage){ return imageMessageItem(); } else if (message.content is VoiceMessage) { return voiceMessageItem(); } else { return Text("无法识别消息 "+message.content.getObjectName()); } }
如果能够正常的使用 我会关闭这个issues 感谢作者的及时回复!!
可以参考代码中展示消息 widget 的逻辑,参见 message_item_factory.dart 的 messageItem 方法,具体如下
Widget messageItem() { if (message.content is TextMessage) { return textMessageItem(); } else if (message.content is ImageMessage){ return imageMessageItem(); } else if (message.content is VoiceMessage) { return voiceMessageItem(); } else { return Text("无法识别消息 "+message.content.getObjectName()); } }
询问作者 用flutter_sound录取音频(不是example中的audio_recorder) 然后通过IM插件发送语音之后 ios 会退出程序 以下是发送音频的代码
void onSendVoiceMessage(String voicePath) async {
VoiceMessage voiceMessage = VoiceMessage();
voiceMessage.localPath = voicePath;
Message msg = await RongcloudImPlugin.sendMessage(
RCConversationType.Private,
id,
voiceMessage);
}
通过flutter_sound生成的本地音频路径为 file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
不知是否符合 还有一个就是之前下载example是可以运行的 现在不知是否是audio_recorder这个插件的问题example也无法运行 经过下午的测试 可以正常的发送图片与文本信息 希望作者看看是什么问题🙏🙏
初步猜测可能是本地路径的问题,audio_recorder 录制的是没有 ”file://“ 头的,Android 需要加 ”file://“ 头,iOS 不需要,但是根据你上面的描述,貌似 flutter_sound 全都是给加了 ”file://“,可能是这个原因,可以按照这个思路排查 但是如果需要具体的定位问题,请提供必要的 log
初步猜测可能是本地路径的问题,audio_recorder 录制的是没有 ”file://“ 头的,Android 需要加 ”file://“ 头,iOS 不需要,但是根据你上面的描述,貌似 flutter_sound 全都是给加了 ”file://“,可能是这个原因,可以按照这个思路排查 但是如果需要具体的定位问题,请提供必要的 log
flutter: 按下按钮啦
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
flutter: 抬起手指啦
flutter: 停止录音
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
flutter: 发送语音
flutter: file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a
[RC-Flutter-IM] iOS sendMessage start param:{
content = "{\"localPath\":\"file:///private/var/mobile/Containers/Data/Application/1B1FBC1F-C130-49FE-8873-ECB7C99322F6/tmp/sound.m4a\",\"duration\":null,\"extra\":null}";
conversationType = 1;
objectName = "RC:HQVCMsg";
pushContent = "";
pushData = "";
targetId = 1154228491220512769;
}
Lost connection to device.
Exited (sigterm)
用的是IOS真机测试 用flutter_sound可以本地保存语音并且可以播放 但调用IM发送语音接口就退出系统 不知这样的log是否可行
现在又发现一个小小的问题 , 当发出文本信息后,无法判断是否发送成功,按照参照文档和example发送文本的状态码每次只能够得到10 也就是正在发送,但无法判断文本是否到达 (通过轮询也不现实吧?)
一:语音消息发送崩溃的问题,有两种方案,任选一试试
ios/Runner.xcworkspace
直接运行,看一下是否能够拿到崩溃堆栈
二:无法知道消息发送结果
发送消息的接口会直接返回消息对象,状态是发送中,这样页面可以先行展示消息内容
然后会触发 onMessageSend 回调,告知刚发的消息的具体发送状态一:语音消息发送崩溃的问题,有两种方案,任选一试试
- flutter_sound 录制的语音路径携带了 "file://" 头,iOS 试一下把 “file://” 头去掉试试
- 通过 flutter 命令运行项目可能无法拿到崩溃的堆栈,建议使用 Xcode 打开
ios/Runner.xcworkspace
直接运行,看一下是否能够拿到崩溃堆栈 二:无法知道消息发送结果 发送消息的接口会直接返回消息对象,状态是发送中,这样页面可以先行展示消息内容 然后会触发 onMessageSend 回调,告知刚发的消息的具体发送状态
2019-09-10 19:28:35.438350+0800 Runner[16388:2799816] flutter: 按下按钮啦
2019-09-10 19:28:35.939799+0800 Runner[16388:2799816] flutter: file:///private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a
2019-09-10 19:28:42.633428+0800 Runner[16388:2799816] flutter: 抬起手指啦
2019-09-10 19:28:43.173115+0800 Runner[16388:2799816] flutter: 停止录音
2019-09-10 19:28:43.173314+0800 Runner[16388:2799816] flutter: file:///private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a
2019-09-10 19:28:43.175733+0800 Runner[16388:2799816] flutter: 发送语音
2019-09-10 19:28:43.197701+0800 Runner[16388:2799652] [RC-Flutter-IM] iOS sendMessage start param:{
content = "{\"localPath\":\"/private/var/mobile/Containers/Data/Application/6E73882E-38EC-429F-886E-6E68DA077B1F/tmp/sound.m4a\",\"duration\":null,\"extra\":null}";
conversationType = 1;
objectName = "RC:HQVCMsg";
pushContent = "";
pushData = "";
targetId = 1154228491220512769;
}
2019-09-10 19:28:43.198006+0800 Runner[16388:2799652] -[NSNull longValue]: unrecognized selector sent to instance 0x2079017e0
libc++abi.dylib: terminate_handler unexpectedly threw an exception
(lldb)
通过去除file://发现依旧是无法使用 然后用xcode来操作得出以上的log 以上是xcode的错误堆栈
VoiceMessage msg = VoiceMessage.obtain(path, duration); 可以参考上面的这个代码,根据描述是语音的时长没有给 语音时长是必要的参数,用来 UI 显示
经过测试后发现在IOS上用flutter_sound来录音,会自动带上file:// 导致无法发送语音,感谢作者的帮助🙏🙏 ,语音那里是看到文档没有以为和图片一样加上一个路径就可以了,没想过得需要duration ,最后想说说example是很不错的,几乎所有的API上面都有,如果有和我一样蠢的小伙伴可以考虑仔细看看example ,可能AudioRecorder这个第三方插件用不了,这个插件有毒,但可以考虑使用flutter_sound,再次感谢作者的快速解答
为了快速解决问题,在寻求帮助的时候,请提供以下信息,方便我们快速定位问题
[✓] Android toolchain - develop for Android devices (Android SDK version 29.0.2) • Android SDK at /Users/speanut/Library/Android/sdk • Android NDK location not configured (optional; useful for native profiling support) • Platform android-29, build-tools 29.0.2 • Java binary at: /Applications/Android Studio.app/Contents/jre/jdk/Contents/Home/bin/java • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405) • All Android licenses accepted.
[✓] Xcode - develop for iOS and macOS (Xcode 10.2.1) • Xcode at /Applications/Xcode.app/Contents/Developer • Xcode 10.2.1, Build version 10E1001 • CocoaPods version 1.7.3
[✓] iOS tools - develop for iOS devices • ios-deploy 1.9.4
[✓] Android Studio (version 3.5) • Android Studio at /Applications/Android Studio.app/Contents • Flutter plugin version 38.2.3 • Dart plugin version 191.8423 • Java version OpenJDK Runtime Environment (build 1.8.0_202-release-1483-b49-5587405)
[✓] Connected device (1 available) • speanut • 925d906d24fc7bfc700785e65ca0a0da59662cd8 • ios • iOS 12.3
• No issues found!