From: TrillGates Date: Mon, 5 Apr 2021 03:53:08 +0000 (+0800) Subject: completed voice file transfer to send. X-Git-Url: http://git.snicker.com.cn/?a=commitdiff_plain;h=ccb7d1608133921a95b7db213212db67afad0f95;p=protocol_srv.git completed voice file transfer to send. --- diff --git a/app/src/main/java/com/enqualcomm/support/CoreService.java b/app/src/main/java/com/enqualcomm/support/CoreService.java index befd41c5..63505d4c 100644 --- a/app/src/main/java/com/enqualcomm/support/CoreService.java +++ b/app/src/main/java/com/enqualcomm/support/CoreService.java @@ -987,7 +987,7 @@ public class CoreService extends Service { //观察微聊消息变化 //有新消息就发送出去 ContentResolver resolver = runtime.getContextProxy().getResolver(); - WeTalkMsgObserver weTalkMsgObserver = new WeTalkMsgObserver(null, resolver); + WeTalkMsgObserver weTalkMsgObserver = new WeTalkMsgObserver(mHandler, resolver); resolver.registerContentObserver( Uri.parse(FZDMessageProvider.MESSAGES_SEND), true, weTalkMsgObserver ); 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 5b9ee2eb..82e25d21 100644 --- a/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java +++ b/app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java @@ -26,7 +26,9 @@ public class FZDMessageProvider extends ContentProvider { private static final int MATH_CODE_TABLE = 1; - private static UriMatcher sUriMatcher; + private static final UriMatcher sUriMatcher; + + private final Object mLock = new Object(); static { sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); @@ -67,62 +69,63 @@ public class FZDMessageProvider extends ContentProvider { @Override public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) { - int match = sUriMatcher.match(uri); - if (match == MATH_CODE_TABLE) { - //观察的地方根据来源,如果是UI,则观察来源是收到的信息 - //如果是发送的地方则观察来源是发送的信息 - SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); - //处理插入 - long id = writableDatabase.insert(FZDDatabaseHelper.tMessage, null, values); - //通知观察者数据更新了 - Uri parse = Uri.parse(MESSAGES + "/" + id); - //如果是发送的,那么就发出此条通知 - if (values != null) { - int out = values.getAsInteger("in_or_out"); - ////状态:0表示未读,1表示未读,2表示未发送,3表示发送中,4表示发送失败,5表示发送成功 - int state = values.getAsInteger("state"); - //往外发送 - if (out == 2 && state == 2) { - Uri sendNotify = Uri.parse(MESSAGES_SEND + "/" + id); - //发出通知 - Objects.requireNonNull(getContext()).getContentResolver().notifyChange(sendNotify, null); + synchronized (mLock) { + int match = sUriMatcher.match(uri); + if (match == MATH_CODE_TABLE) { + //观察的地方根据来源,如果是UI,则观察来源是收到的信息 + //如果是发送的地方则观察来源是发送的信息 + SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); + //处理插入 + long id = writableDatabase.insert(FZDDatabaseHelper.tMessage, null, values); + //通知观察者数据更新了 + Uri parse = Uri.parse(MESSAGES + "/" + id); + //如果是发送的,那么就发出此条通知 + if (values != null) { + int out = values.getAsInteger("in_or_out"); + ////状态:0表示未读,1表示未读,2表示未发送,3表示发送中,4表示发送失败,5表示发送成功 + int state = values.getAsInteger("state"); + //往外发送 + if (out == 2 && state == 2) { + Uri sendNotify = Uri.parse(MESSAGES_SEND + "/" + id); + //发出通知 + Objects.requireNonNull(getContext()).getContentResolver().notifyChange(sendNotify, null); + } } + ICLogger.d("notify other observer..." + parse); + Objects.requireNonNull(getContext()).getContentResolver().notifyChange(parse, null); + return parse; } - ICLogger.d("notify other observer..." + parse); - Objects.requireNonNull(getContext()).getContentResolver().notifyChange(parse, null); - writableDatabase.close(); - return parse; + return null; } - return null; } @Override public int delete(@NonNull Uri uri, @Nullable String selection, @Nullable String[] selectionArgs) { - int match = sUriMatcher.match(uri); - if (match == MATH_CODE_TABLE) { - //删除数据 - SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); - int delete = writableDatabase.delete(FZDDatabaseHelper.tMessage, selection, selectionArgs); - writableDatabase.close(); - return delete; + synchronized (mLock) { + int match = sUriMatcher.match(uri); + if (match == MATH_CODE_TABLE) { + //删除数据 + SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); + return writableDatabase.delete(FZDDatabaseHelper.tMessage, selection, selectionArgs); + } + return 0; } - return 0; } @Override public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) { - int match = sUriMatcher.match(uri); - if (match == MATH_CODE_TABLE) { - //TODO:通知UI更新 - //更新数据 - SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); - int update = writableDatabase.update(FZDDatabaseHelper.tMessage, values, selection, selectionArgs); - writableDatabase.close(); - return update; + synchronized (mLock) { + int match = sUriMatcher.match(uri); + if (match == MATH_CODE_TABLE) { + //TODO:通知UI更新 + //更新数据 + SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase(); + return writableDatabase.update(FZDDatabaseHelper.tMessage, values, selection, selectionArgs); + } + return 0; } - 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 06f62545..362885c5 100644 --- a/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java +++ b/app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java @@ -8,9 +8,12 @@ import android.os.Handler; import com.enqualcomm.support.provider.FZDMessageProvider; import com.enqualcomm.support.utils.ICLogger; +import com.ic.protocols.protocolAPIHelper; +import com.ic.protocols.protocol_fzd; public class WeTalkMsgObserver extends ContentObserver { private final ContentResolver mResolver; + private final Handler mHandler; /** * Creates a content observer. @@ -20,24 +23,28 @@ public class WeTalkMsgObserver extends ContentObserver { */ public WeTalkMsgObserver(Handler handler, ContentResolver resolver) { super(handler); + this.mHandler = handler; this.mResolver = resolver; } @Override - public void onChange(boolean selfChange, Uri uri) { + public void onChange(final boolean selfChange, final Uri uri) { super.onChange(selfChange, uri); - ICLogger.d("on message insert to send == > " + uri); - //查询到数据,给到fzd协议上传数据 - String lastPathSegment = uri.getLastPathSegment(); - ICLogger.d("lastPathSegment == > " + lastPathSegment); - Cursor query = mResolver.query(Uri.parse(FZDMessageProvider.MESSAGES), null, "_id=?", - new String[]{lastPathSegment}, null, null); - if (query != null && query.moveToNext()) { - String content = query.getString(query.getColumnIndex("content")); - ICLogger.d("content --- > " + content); - query.close(); - //交给fzd协议吧,让它去发送消息 - //TODO: - } + mHandler.post(() -> { + ICLogger.d("on message insert to send == > " + uri); + //查询到数据,给到fzd协议上传数据 + String lastPathSegment = uri.getLastPathSegment(); + ICLogger.d("lastPathSegment == > " + lastPathSegment); + Cursor query = mResolver.query(Uri.parse(FZDMessageProvider.MESSAGES), null, "_id=?", + new String[]{lastPathSegment}, null, null); + if (query != null && query.moveToNext()) { + String content = query.getString(query.getColumnIndex("content")); + ICLogger.d("content --- > " + content); + query.close(); + //交给fzd协议吧,让它去发送消息 + protocol_fzd fzd = protocolAPIHelper.getProtocolfzd_handler(); + fzd.sendVoice(content, lastPathSegment); + } + }); } } diff --git a/app/src/main/java/com/enqualcomm/support/utils/Util.java b/app/src/main/java/com/enqualcomm/support/utils/Util.java index b73bac5a..ccbdd58d 100644 --- a/app/src/main/java/com/enqualcomm/support/utils/Util.java +++ b/app/src/main/java/com/enqualcomm/support/utils/Util.java @@ -28,6 +28,7 @@ import com.ic.protocols.protocolAPIHelper; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -1021,7 +1022,30 @@ public class Util { // 0X5D --> 0X7D 0X03 // 0X2C --> 0X7D 0X04 // 0X2A --> 0X7D 0X05 - //TODO: + //先挖个坑 + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + byte a = 0X7D; + for (byte b : source) { + if (b == 0X7D) { + outputStream.write(a); + outputStream.write(0X01); + } else if (b == 0X5B) { + outputStream.write(a); + outputStream.write(0X02); + } else if (b == 0X5D) { + outputStream.write(a); + outputStream.write(0X03); + } else if (b == 0X2C) { + outputStream.write(a); + outputStream.write(0X04); + } else if (b == 0X2A) { + outputStream.write(a); + outputStream.write(0X05); + } else { + outputStream.write(b); + } + } + return outputStream.toByteArray(); } else { // 0X7D 0X01 --> 0X7D // 0X7D 0X02 --> 0X5B @@ -1077,8 +1101,6 @@ public class Util { } return bestResult; } - //把文件写出来,对比一下先吧。 - return result; } public static boolean parseToVoicePacketSent(VoiceContent voiceContent) { 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 3356ed2e..4ddc6a60 100644 --- a/app/src/main/java/com/ic/protocols/protocol_fzd.java +++ b/app/src/main/java/com/ic/protocols/protocol_fzd.java @@ -31,7 +31,9 @@ import com.enqualcomm.support.utils.TimeUtil; import com.enqualcomm.support.utils.Util; import com.enqualcomm.support.utils.regexUtil; +import java.io.ByteArrayOutputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Date; @@ -65,6 +67,52 @@ public class protocol_fzd { public static final int defaultServerPort = 9000; private final SharedPreferences sharedPreferences; + /** + * 发送语音消息,微聊的,注意转码 + * + * @param content 声音地址 + * @param voiceId 数据库里的_id,用于更新状态 + */ + public void sendVoice(String content, String voiceId) { + File file = new File(content); + if (!file.exists()) { + //TODO:直接删除数据库记录 + } else { + //存在的话,那么做数据转换,然后上传数据 + try { + FileInputStream fileInputStream = new FileInputStream(file); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buffer = new byte[1024]; + int len; + while ((len = fileInputStream.read(buffer)) != -1) { + byteArrayOutputStream.write(buffer, 0, len); + } + //全部写到byteArrayOutputStream里,然后对byteArrayOutputStream进行遍历转换 + byte[] bytes = byteArrayOutputStream.toByteArray(); + byte[] result = Util.fzdTransfer(bytes, true); + //写出到一个地方,用于检查是否有转换正确 + //File fileOut = new File("/storage/emulated/0/ic_we_talk_record_out/" + System.currentTimeMillis() + ".amr"); + //if (!fileOut.exists()) { + // fileOut.getParentFile().mkdirs(); + // fileOut.createNewFile(); + //} + //FileOutputStream fos = new FileOutputStream(fileOut); + //fos.write(result); + //fos.flush(); + //fos.close(); + //以上代码,验证成功,说明转换是对的 + //更新数据库状态 + + //发送消息 + //TODO: + } catch (Exception e) { + e.printStackTrace(); + } + + //更新状态 + } + } + public enum CMD_TYPE { /*终端发起*/ //链路保持数据