From 1f2c8556088e6c0e1148d15f2fc8a490a24b1a2e Mon Sep 17 00:00:00 2001 From: TrillGates Date: Tue, 6 Apr 2021 18:52:04 +0800 Subject: [PATCH] parse tkone cmd. --- .../support/provider/FZDMessageProvider.java | 5 +- .../support/service/WeTalkMsgObserver.java | 3 +- .../java/com/ic/protocols/protocol_fzd.java | 74 +++++++++++++------ 3 files changed, 56 insertions(+), 26 deletions(-) diff --git a/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java b/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java index 300d51f3..0d3a5fb1 100644 --- a/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java +++ b/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java @@ -124,6 +124,8 @@ public class FZDMessageProvider extends ContentProvider { synchronized (mLock) { int match = sUriMatcher.match(uri); if (match == MATH_CODE_TABLE) { + SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); + int update = writableDatabase.update(FZDDatabaseHelper.tMessage, values, selection, selectionArgs); //如果是状态变化的话通知UI监听的地方 //让UI查询一下新的状态 if (values != null) { @@ -135,8 +137,7 @@ public class FZDMessageProvider extends ContentProvider { Uri.parse(MESSAGES_ITEM + "/" + selectionArgs[0]), null); } } - SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); - return writableDatabase.update(FZDDatabaseHelper.tMessage, values, selection, selectionArgs); + return update; } return 0; } diff --git a/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java b/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java index cd04a6f6..e49c8b75 100644 --- a/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java +++ b/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java @@ -42,11 +42,12 @@ public class WeTalkMsgObserver extends ContentObserver { //对方的ID,如果这个为null,那么则是群聊 //否则是单聊 String remoteNum = query.getString(query.getColumnIndex("remote_num")); + int duration = query.getInt(query.getColumnIndex("duration")); ICLogger.d("content --- > " + content); query.close(); //交给fzd协议吧,让它去发送消息 protocol_fzd fzd = protocolAPIHelper.getProtocolfzd_handler(); - fzd.sendVoice(remoteNum, content, lastPathSegment); + fzd.sendVoice(duration, remoteNum, content, lastPathSegment); } }); } diff --git a/app/src/main/java/com/ic/protocols/protocol_fzd.java b/app/src/main/java/com/ic/protocols/protocol_fzd.java index 4b6c506c..85356cc9 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -7,6 +7,8 @@ import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; +import android.media.Ringtone; +import android.media.RingtoneManager; import android.net.Uri; import android.os.Environment; import android.os.RemoteCallbackList; @@ -72,11 +74,12 @@ public class protocol_fzd { /** * 发送语音消息,微聊的,注意转码 * + * @param duration * @param remoteNum * @param content 声音地址 * @param voiceId 数据库里的_id,用于更新状态 */ - public void sendVoice(String remoteNum, String content, String voiceId) { + public void sendVoice(int duration, String remoteNum, String content, String voiceId) { File file = new File(content); if (!file.exists()) { //TODO:直接删除数据库记录 @@ -109,9 +112,10 @@ public class protocol_fzd { //如果remoteNum为空,那么是群聊 ICLogger.d("remote id == > " + remoteNum); ByteArrayOutputStream bos = new ByteArrayOutputStream(); + String cmd; if (TextUtils.isEmpty(remoteNum)) { + cmd = cmdMap.get(CMD_TYPE.TK); //发送消息 - String cmd = cmdMap.get(CMD_TYPE.TK); int tkLength = cmd.length(); String header = genHeader(tkLength, cmd); StringBuilder sb = new StringBuilder(); @@ -129,12 +133,9 @@ public class protocol_fzd { bos.write(result); //追加结尾 bos.write(CMDEND.getBytes()); - mConnection.send(cmd, bos.toByteArray()); - bos.reset(); - bos.close(); } else { //单聊 - String cmd = cmdMap.get(CMD_TYPE.TKOne); + cmd = cmdMap.get(CMD_TYPE.TKOne); int tkLength = cmd.length(); String header = genHeader(tkLength, cmd); StringBuilder sb = new StringBuilder(); @@ -146,9 +147,24 @@ public class protocol_fzd { } //头部构造好了,添加逗号 sb.append(CMDSPLIT); - + //添加APP账号 + sb.append(remoteNum); + sb.append(CMDSPLIT); + //秒数 + ICLogger.d("duration == > " + duration); + sb.append(duration); + sb.append(CMDSPLIT); + //加入数据 + bos.write(sb.toString().getBytes()); + //数据包数据 + bos.write(result); + //结尾数据 + bos.write(CMDEND.getBytes()); } - + //发送数据 + mConnection.send(cmd, bos.toByteArray()); + bos.reset(); + bos.close(); //更新数据库状态 ContentValues contentValues = new ContentValues(); contentValues.put("state", 5); @@ -195,14 +211,14 @@ public class protocol_fzd { int frameCount = 0; int packedPos = -1; // 初始数据值 - byte[] datas = new byte[1]; + byte[] data = new byte[1]; while (pos <= length) { randomAccessFile.seek(pos); - if (randomAccessFile.read(datas, 0, 1) != 1) { + if (randomAccessFile.read(data, 0, 1) != 1) { duration = length > 0 ? ((length - 6) / 650) : 0; break; } - packedPos = (datas[0] >> 3) & 0x0F; + packedPos = (data[0] >> 3) & 0x0F; pos += packedSize[packedPos] + 1; frameCount++; } @@ -311,6 +327,7 @@ public class protocol_fzd { cmdMap.put(CMD_TYPE.FIND, "FIND"); cmdMap.put(CMD_TYPE.REMIND, "REMIND"); cmdMap.put(CMD_TYPE.TK, "TK"); + cmdMap.put(CMD_TYPE.TKOne, "TKOne"); cmdMap.put(CMD_TYPE.PHL, "PHL"); cmdMap.put(CMD_TYPE.wdstart, "wdstart"); cmdMap.put(CMD_TYPE.bldstart, "bldstart"); @@ -487,9 +504,11 @@ public class protocol_fzd { //数据格式:[XT*YYYYYYYYYYYYYYY*LEN*TKOne,App 账号,秒数,AMR 格式音频数据] String cmdStr = new String(totalByte); String[] split = cmdStr.split(","); + //处理返回的结果 + //TODO: String header = split[0]; //账号 - String count = split[1]; + String remoteId = split[1]; //秒数 String duration = split[2]; //数据包,对数据进行切割 @@ -503,7 +522,7 @@ public class protocol_fzd { new File(dir), "receive_" + System.currentTimeMillis() + ".amr"); //插入到数据库中 - voiceIn2Db(amrFilepath, FZDDatabaseHelper.MessageType.VOICE); + message2Db(remoteId, amrFilepath, FZDDatabaseHelper.MessageType.VOICE); //返回结果 mConnection.send(TKOne("1")); } catch (Exception e) { @@ -559,11 +578,10 @@ public class protocol_fzd { // ICLogger.d("playVoice: ERROR "); //} //包存到数据库中,这是群聊的内容,没有联系人的 - voiceIn2Db(amrFilepath, FZDDatabaseHelper.MessageType.VOICE); + // 群聊没有remoteId + message2Db("", amrFilepath, FZDDatabaseHelper.MessageType.VOICE); //回复服务器状态 mConnection.send(TK("1")); - //通知有消息到 - //TODO: } catch (Exception e) { e.printStackTrace(); //失败 @@ -571,15 +589,25 @@ public class protocol_fzd { } } - private void voiceIn2Db(String amrFilepath, int type) { - //计算文件时长 - int amrDuration = 0; + private void message2Db(String remoteId, String amrFilepath, int type) { try { - File file = new File(amrFilepath); - amrDuration = getAmrDuration(file); + //通知有消息到 + Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + Ringtone ringtone = RingtoneManager.getRingtone(mRuntime.getContextProxy().context, uri); + ringtone.play(); } catch (Exception e) { e.printStackTrace(); } + //计算文件时长 + int amrDuration = 0; + if (type == FZDDatabaseHelper.MessageType.VOICE) { + try { + File file = new File(amrFilepath); + amrDuration = getAmrDuration(file); + } catch (Exception e) { + e.printStackTrace(); + } + } ContentResolver resolver = mRuntime.getContextProxy().getResolver(); ContentValues contentValues = new ContentValues(); //路径 @@ -593,7 +621,7 @@ public class protocol_fzd { //接受还是发送,1表示来信 contentValues.put("in_or_out", 1); //对方号码是没有的 - contentValues.put("remote_num", ""); + contentValues.put("remote_num", remoteId); contentValues.put("create_time", System.currentTimeMillis()); contentValues.put("update_time", System.currentTimeMillis()); resolver.insert(Uri.parse(FZDMessageProvider.MESSAGES), contentValues); @@ -1253,7 +1281,7 @@ public class protocol_fzd { //解析数据 String textData = Util.decodeUnicode2Utf8(data); ICLogger.d("message data == > " + textData); - voiceIn2Db(textData, FZDDatabaseHelper.MessageType.TEXT); + message2Db("", textData, FZDDatabaseHelper.MessageType.TEXT); //入数据库 mConnection.send(MESSAGE()); } -- 2.17.1