completed voice file transfer to send.
authorTrillGates <williamtrillgates@gmail.com>
Mon, 5 Apr 2021 03:53:08 +0000 (11:53 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Mon, 5 Apr 2021 03:53:08 +0000 (11:53 +0800)
app/src/main/java/com/enqualcomm/support/CoreService.java
app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java
app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java
app/src/main/java/com/enqualcomm/support/utils/Util.java
app/src/main/java/com/ic/protocols/protocol_fzd.java

index befd41c..63505d4 100644 (file)
@@ -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
         );
index 5b9ee2e..82e25d2 100644 (file)
@@ -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;
     }
 }
index 06f6254..362885c 100644 (file)
@@ -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);
+            }
+        });
     }
 }
index b73bac5..ccbdd58 100644 (file)
@@ -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) {
index 3356ed2..4ddc6a6 100644 (file)
@@ -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 {
         /*终端发起*/
         //链路保持数据