//观察微聊消息变化
//有新消息就发送出去
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
);
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);
@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;
}
}
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.
*/
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);
+ }
+ });
}
}
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
// 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
}
return bestResult;
}
- //把文件写出来,对比一下先吧。
- return result;
}
public static boolean parseToVoicePacketSent(VoiceContent voiceContent) {
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;
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 {
/*终端发起*/
//链路保持数据