ret = true;
}
- isUsingCustomServer = ret;
+ //isUsingCustomServer = ret;
+ isUsingCustomServer = false;
String serverip = "";
int serverport = 0;
import android.app.PendingIntent;
import android.app.Service;
import android.content.BroadcastReceiver;
+import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
+import android.net.Uri;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import com.enqualcomm.support.bean.SleepRecord;
import com.enqualcomm.support.bean.StringMessage;
import com.enqualcomm.support.bean.heartRateStatus;
+import com.enqualcomm.support.provider.FZDMessageProvider;
import com.enqualcomm.support.service.AntiMonitorService;
import com.enqualcomm.support.service.CheckSIM;
import com.enqualcomm.support.service.Deliver;
import com.enqualcomm.support.service.KeepAlive;
import com.enqualcomm.support.service.SendChatMessage;
import com.enqualcomm.support.service.SilentManager;
+import com.enqualcomm.support.service.WeTalkMsgObserver;
import com.enqualcomm.support.service.base.AbstractConnectionService;
import com.enqualcomm.support.service.base.AbstractInvokeHandlerService;
import com.enqualcomm.support.utils.AlarmHelper;
//设置断网状态
Util.setSystemProperties("persist.sys.server_connected", "false");
+ //观察微聊消息变化
+ //有新消息就发送出去
+ ContentResolver resolver = runtime.getContextProxy().getResolver();
+ WeTalkMsgObserver weTalkMsgObserver = new WeTalkMsgObserver(null, resolver);
+ resolver.registerContentObserver(
+ Uri.parse(FZDMessageProvider.MESSAGES_SEND), true, weTalkMsgObserver
+ );
//启动结束设置标志位,让心率和体温检测可以正常执行。
server_starting = false;
@Override
public void test() {
//触发测试
- // StringMessage MEMBERS = protocol_fzd.MEMBERS();
+ // StringMessage MEMBERS = protocol_fzd.MEMBERS();
//Deliver.sendLocationMSG(MEMBERS);
}
package com.enqualcomm.support.bean;\r
\r
import java.util.ArrayList;\r
-import java.util.List;\r
\r
-public class BLEInfo {\r
+public class BLEInfo {\r
public String ble_area_id="";\r
\r
public ArrayList<String> btMacList=new ArrayList<>();\r
public static final String mType = "type";
public static final String mState = "state";
public static final String mInOrOut = "in_or_out";
+ public static final String mCategory = "category";
public static final String mRemoteNum = "remote_num";
public static final String mCreateTime = "create_time";
public static final String mUpdateTime = "update_time";
tMessage +
" (" +
mId +
- " integer primary key, " +
+ " integer primary key autoincrement, " +
mContent +
" text, " +
mType +
" integer, " +
+ mCategory +
+ " integer, " +
mState +
" integer, " +
mInOrOut +
- " integer "+
+ " integer, " +
mRemoteNum +
- " text, "+
+ " text, " +
mCreateTime +
" date, " +
- mUpdateTime+
+ mUpdateTime +
" date)";
ICLogger.d(createMsg);
db.execSQL(createMsg);
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import com.enqualcomm.support.utils.ICLogger;
+
+import java.util.Objects;
+
public class FZDMessageProvider extends ContentProvider {
//添加规则
- private static final String PATH = "message";
- private static final String AUTHORITY = "com.ic.fzd.we-talk";
- private static final String MESSAGES = "content://" + AUTHORITY + "/" + PATH;
+ public static final String PATH = "message";
+ public static final String AUTHORITY = "com.ic.fzd.we-talk";
+ public static final String MESSAGES = "content://" + AUTHORITY + "/" + PATH;
+ public static final String MESSAGES_SEND = "content://" + AUTHORITY + ".send" + "/" + PATH;
private FZDDatabaseHelper mDatabase;
@Nullable ContentValues values) {
int match = sUriMatcher.match(uri);
if (match == MATH_CODE_TABLE) {
- //TODO:通知观察者数据更新了
//观察的地方根据来源,如果是UI,则观察来源是收到的信息
//如果是发送的地方则观察来源是发送的信息
SQLiteDatabase writableDatabase = mDatabase.getWritableDatabase();
//处理插入
- long insert = writableDatabase.insert(FZDDatabaseHelper.tMessage, null, values);
+ 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);
writableDatabase.close();
- return Uri.parse(AUTHORITY + "/" + PATH + "/" + insert);
+ return parse;
}
return null;
}
}
@Override
- public int update(@NonNull Uri uri, @Nullable ContentValues values, @Nullable String selection, @Nullable String[] selectionArgs) {
+ 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);
\r
\r
public class AudioService implements MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {\r
- private MediaPlayer mMediaPlayer;\r
-\r
- private static AudioService mAudioService=null;\r
- private static MediaRecorder mRecorder=null;\r
- public AudioService() { initMediaPlayer(); }\r
-\r
- public static AudioService getInstance(){\r
- if (mAudioService==null)\r
- mAudioService=new AudioService();\r
- return mAudioService;\r
- }\r
- private void initMediaPlayer() {\r
- release();\r
- this.mMediaPlayer = new MediaPlayer();\r
- this.mMediaPlayer.setOnCompletionListener(this);\r
- this.mMediaPlayer.setOnErrorListener(this);\r
- }\r
- \r
- public void onCompletion(MediaPlayer paramMediaPlayer) { release(); }\r
- \r
- public boolean onError(MediaPlayer paramMediaPlayer, int paramInt1, int paramInt2) {\r
- release();\r
- return false;\r
- }\r
- \r
- public void pause() {\r
- if (this.mMediaPlayer != null)\r
- this.mMediaPlayer.pause(); \r
- }\r
- \r
- public void play(AssetManager paramAssetManager, String paramString) {\r
- ICLogger.i("mMediaPlayer play");\r
- if (this.mMediaPlayer == null)\r
- initMediaPlayer(); \r
- this.mMediaPlayer.reset();\r
- try {\r
- AssetFileDescriptor assetFileDescriptor = paramAssetManager.openFd(paramString);\r
- this.mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());\r
- assetFileDescriptor.close();\r
- this.mMediaPlayer.prepare();\r
- this.mMediaPlayer.start();\r
- return;\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- return;\r
- } \r
- }\r
- \r
- public void play(String paramString) {\r
- if (this.mMediaPlayer == null)\r
- initMediaPlayer(); \r
- this.mMediaPlayer.reset();\r
- try {\r
- this.mMediaPlayer.setDataSource(paramString);\r
- this.mMediaPlayer.prepare();\r
- this.mMediaPlayer.start();\r
- return;\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- return;\r
- } \r
- }\r
- \r
- public void play(String paramString, boolean paramBoolean) {\r
- if (this.mMediaPlayer == null)\r
- initMediaPlayer(); \r
- this.mMediaPlayer.reset();\r
- try {\r
- this.mMediaPlayer.setDataSource(paramString);\r
- this.mMediaPlayer.prepareAsync();\r
- this.mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {\r
- public void onPrepared(MediaPlayer param1MediaPlayer) { AudioService.this.mMediaPlayer.start(); }\r
- });\r
- return;\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- return;\r
- } \r
- }\r
- \r
- public void rePlay() {\r
- if (this.mMediaPlayer != null)\r
- this.mMediaPlayer.start(); \r
- }\r
- \r
- public void release() {\r
- if (this.mMediaPlayer != null) {\r
- this.mMediaPlayer.setOnCompletionListener(null);\r
- this.mMediaPlayer.setOnErrorListener(null);\r
- this.mMediaPlayer.release();\r
- this.mMediaPlayer = null;\r
- } \r
- }\r
- \r
- public void stop() {\r
- if (this.mMediaPlayer != null && this.mMediaPlayer.isPlaying())\r
- this.mMediaPlayer.stop(); \r
- }\r
-\r
-\r
-\r
- public void startRecord(String FileName) {\r
- if (mRecorder==null)\r
- mRecorder = new MediaRecorder();\r
- mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);\r
- mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);\r
- mRecorder.setOutputFile(FileName);\r
- mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);\r
- try {\r
- mRecorder.prepare();\r
- } catch (IOException e) {\r
- ICLogger.e( "prepare() failed");\r
+ private MediaPlayer mMediaPlayer;\r
+\r
+ private static AudioService mAudioService = null;\r
+ private static MediaRecorder mRecorder = null;\r
+\r
+ public AudioService() {\r
+ initMediaPlayer();\r
+ }\r
+\r
+ public static AudioService getInstance() {\r
+ if (mAudioService == null)\r
+ mAudioService = new AudioService();\r
+ return mAudioService;\r
+ }\r
+\r
+ private void initMediaPlayer() {\r
+ release();\r
+ this.mMediaPlayer = new MediaPlayer();\r
+ this.mMediaPlayer.setOnCompletionListener(this);\r
+ this.mMediaPlayer.setOnErrorListener(this);\r
+ }\r
+\r
+ public void onCompletion(MediaPlayer paramMediaPlayer) {\r
+ release();\r
+ }\r
+\r
+ public boolean onError(MediaPlayer paramMediaPlayer, int paramInt1, int paramInt2) {\r
+ release();\r
+ return false;\r
+ }\r
+\r
+ public void pause() {\r
+ if (this.mMediaPlayer != null)\r
+ this.mMediaPlayer.pause();\r
+ }\r
+\r
+ public void play(AssetManager paramAssetManager, String paramString) {\r
+ ICLogger.i("mMediaPlayer play");\r
+ if (this.mMediaPlayer == null)\r
+ initMediaPlayer();\r
+ this.mMediaPlayer.reset();\r
+ try {\r
+ AssetFileDescriptor assetFileDescriptor = paramAssetManager.openFd(paramString);\r
+ this.mMediaPlayer.setDataSource(assetFileDescriptor.getFileDescriptor(), assetFileDescriptor.getStartOffset(), assetFileDescriptor.getLength());\r
+ assetFileDescriptor.close();\r
+ this.mMediaPlayer.prepare();\r
+ this.mMediaPlayer.start();\r
+ return;\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return;\r
+ }\r
+ }\r
+\r
+ public void play(String paramString) {\r
+ if (this.mMediaPlayer == null)\r
+ initMediaPlayer();\r
+ this.mMediaPlayer.reset();\r
+ try {\r
+ this.mMediaPlayer.setDataSource(paramString);\r
+ this.mMediaPlayer.prepare();\r
+ this.mMediaPlayer.start();\r
+ return;\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return;\r
+ }\r
+ }\r
+\r
+ public void play(String paramString, boolean paramBoolean) {\r
+ if (this.mMediaPlayer == null)\r
+ initMediaPlayer();\r
+ this.mMediaPlayer.reset();\r
+ try {\r
+ this.mMediaPlayer.setDataSource(paramString);\r
+ this.mMediaPlayer.prepareAsync();\r
+ this.mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {\r
+ public void onPrepared(MediaPlayer param1MediaPlayer) {\r
+ AudioService.this.mMediaPlayer.start();\r
+ }\r
+ });\r
+ return;\r
+ } catch (Exception e) {\r
+ e.printStackTrace();\r
+ return;\r
+ }\r
+ }\r
+\r
+ public void rePlay() {\r
+ if (this.mMediaPlayer != null)\r
+ this.mMediaPlayer.start();\r
+ }\r
+\r
+ public void release() {\r
+ if (this.mMediaPlayer != null) {\r
+ this.mMediaPlayer.setOnCompletionListener(null);\r
+ this.mMediaPlayer.setOnErrorListener(null);\r
+ this.mMediaPlayer.release();\r
+ this.mMediaPlayer = null;\r
+ }\r
+ }\r
+\r
+ public void stop() {\r
+ if (this.mMediaPlayer != null && this.mMediaPlayer.isPlaying())\r
+ this.mMediaPlayer.stop();\r
+ }\r
+\r
+\r
+ public void startRecord(String FileName) {\r
+ if (mRecorder == null)\r
+ mRecorder = new MediaRecorder();\r
+ mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);\r
+ mRecorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);\r
+ mRecorder.setOutputFile(FileName);\r
+ mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);\r
+ try {\r
+ mRecorder.prepare();\r
+ } catch (IOException e) {\r
+ ICLogger.e("prepare() failed");\r
+ }\r
+ mRecorder.start();\r
}\r
- mRecorder.start();\r
- }\r
\r
- public void stopRecord( ) {\r
- if (mRecorder!=null ) {\r
- mRecorder.stop();\r
- mRecorder.release();\r
+ public void stopRecord() {\r
+ if (mRecorder != null) {\r
+ mRecorder.stop();\r
+ mRecorder.release();\r
+ }\r
}\r
- }\r
}\r
\r
sendloopruning = true;
if (getAndSendMsgFromQueue()) {
//数据发送成功,则5秒后进行下一轮发送(while 循环用sleep会很占资源造成死锁
- mSendMSGHandler.postDelayed(delaySendMSG, 5000L);
+ mSendMSGHandler.postDelayed(this, 5000L);
} else {
//没有数据可以发送,则退出sendLoop
sendloopruning = false;
//尝试次数大于5 ,可能是还没有发送过数据,或者超过重试次数,暂停提取queue中数据进,下次心跳再开始发送
if (CheckCount > 5) {
ICLogger.i("checkSrvResponse CheckCount=" + CheckCount + " Timeout or cmd is null, skip ");
-
//C5要的临时版本,去掉盲点续传。
-
if (Config.discard_cmd_after_retryfailed) {
if (msgWait.getIndex() >= 0) {
//有些协议需要对盲点数据进行修改(盲点数据可能是不同的topic),在此对数据修改后更新数据库
}
str = stringBuilder.toString();
ICLogger.i("send cached cmd : \n" + str);
- }else{ //如果网络服务器未链接,则表示数据不需要传,
+ } else { //如果网络服务器未链接,则表示数据不需要传,
//但是有些协议要求此数据 需要转变为 盲点续传数据(已经是盲点的跳过)
mRuntime.getDbHelper().updateCMDRecordForUD2(0, msgSent); //重发时无网络 //把UD改为UD2 保存到数据库
}
mLock.unlock();
}
}
+ ICLogger.d("getAndSendMsgFromQueue == > ret == > " + ret);
return ret;
}
long id = mRuntime.getDbHelper().insertCMDRecord(Msg);
Msg.setIndex((int) id);
dumpMessage(Msg);
- if(checkNetwork()) {
+ if (checkNetwork()) {
triggerSendThread();
- }else{
-
- mRuntime.getDbHelper().updateCMDRecordForUD2(0, Msg); //把UD改为UD2 保存到数据库
+ } else {
+ mRuntime.getDbHelper().updateCMDRecordForUD2(0, Msg); //把UD改为UD2 保存到数据库
}
} else {
String recordfilepath = Util.getRecordfilePath(mRuntime, TimeUtil.getSystemTime3());
int recordtime = Integer.parseInt(paramStringMessage.isFromCache().trim());
- mSendMSGHandler.post(new Runnable() {
- @Override
- public void run() {
- AudioService.getInstance().startRecord(recordfilepath);
- }
- });
- mSendMSGHandler.postDelayed(new Runnable() {
- @Override
- public void run() {
- AudioService.getInstance().stopRecord();
- ICLogger.i("Monitor Record to send " + recordfilepath);
- //创建voiceConent并添加到数据
- /**
- * * * 1 语音—— 1.监听语音 * 2.SOS语音 * 3.扩展
- * * * 2 图片—— 1.签到图片 * 2.指令图片 * 3.设备图片 * 4.扩展
- */
- final VoiceContent voiceContent = VoiceContent.placeHolderOut(CONTACT_CATEGORY_GROUP, "123", recordfilepath, 1, 1);
-
- // 把voiceContent拆解成1024的分包
- Util.parseToVoicePacketSent(voiceContent);
- //trigger 分包发送
- if (CoreService.getInstance().getConnection() != null)
- CoreService.getInstance().getConnection().DeliverCMDMessageToSystem("SentVoicePacket", "");
- }
+ mSendMSGHandler.post(() -> AudioService.getInstance().startRecord(recordfilepath));
+ mSendMSGHandler.postDelayed(() -> {
+ AudioService.getInstance().stopRecord();
+ ICLogger.i("Monitor Record to send " + recordfilepath);
+ //创建voiceConent并添加到数据
+ /**
+ * * * 1 语音—— 1.监听语音 * 2.SOS语音 * 3.扩展
+ * * * 2 图片—— 1.签到图片 * 2.指令图片 * 3.设备图片 * 4.扩展
+ */
+ final VoiceContent voiceContent = VoiceContent.placeHolderOut(CONTACT_CATEGORY_GROUP, "123", recordfilepath, 1, 1);
+ // 把voiceContent拆解成1024的分包
+ Util.parseToVoicePacketSent(voiceContent);
+ //trigger 分包发送
+ if (CoreService.getInstance().getConnection() != null)
+ CoreService.getInstance().getConnection().DeliverCMDMessageToSystem("SentVoicePacket", "");
}, recordtime * 1000);
-
return true;
}
-
return false;
}
--- /dev/null
+package com.enqualcomm.support.service;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.database.Cursor;
+import android.net.Uri;
+import android.os.Handler;
+
+import com.enqualcomm.support.provider.FZDMessageProvider;
+import com.enqualcomm.support.utils.ICLogger;
+
+public class WeTalkMsgObserver extends ContentObserver {
+ private final ContentResolver mResolver;
+
+ /**
+ * Creates a content observer.
+ *
+ * @param handler The handler to run {@link #onChange} on, or null if none.
+ * @param resolver
+ */
+ public WeTalkMsgObserver(Handler handler, ContentResolver resolver) {
+ super(handler);
+ this.mResolver = resolver;
+ }
+
+ @Override
+ public void onChange(boolean selfChange, 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:
+ }
+ }
+}
import com.enqualcomm.support.bean.Silent;
import com.enqualcomm.support.bean.StringMessage;
import com.enqualcomm.support.provider.FZDMembersProvider;
+import com.enqualcomm.support.provider.FZDMessageProvider;
import com.enqualcomm.support.service.HeartRateManager;
import com.enqualcomm.support.utils.Connection;
import com.enqualcomm.support.utils.ICLogger;
if (regexUtil.isFZDCMD(cmdMap.get(key), cmd)) {
ICLogger.d("key is == > " + key);
if (key == CMD_TYPE.TK) {
- handlerVoiceContent(totalByte);
+ handlerGroupChatVoiceContent(totalByte);
} else {
String data = content.replace(CMDHEADER, "").replace(cmd, "").replace(CMDEND, "");
if (data.startsWith(CMDSPLIT)) {
return allByte;
}
- private void handlerVoiceContent(byte[] bytes) {
+ private void handlerGroupChatVoiceContent(byte[] bytes) {
try {
ICLogger.d("voice length == > " + bytes.length);
String cmdStr = new String(bytes);
} catch (IOException e) {
ICLogger.d("playVoice: ERROR ");
}
- //TODO:
+ //包存到数据库中,这是群聊的内容,没有联系人的
+ ContentResolver resolver = mRuntime.getContextProxy().getResolver();
+ ContentValues contentValues = new ContentValues();
+ //路径
+ contentValues.put("content", amrFilepath);
+ //类型为声音
+ contentValues.put("type", 1);
+ //状态:0表示未读
+ contentValues.put("state", 0);
+ //接受还是发送,1表示来信
+ contentValues.put("in_or_out", 1);
+ //对方号码是没有的
+ contentValues.put("remote_num", "");
+ contentValues.put("create_time", System.currentTimeMillis());
+ contentValues.put("update_time", System.currentTimeMillis());
+ resolver.insert(Uri.parse(FZDMessageProvider.MESSAGES), contentValues);
//回复服务器状态
mConnection.send(TK("1"));
} catch (Exception e) {
//解析数据
String textData = Util.decodeUnicode2Utf8(data);
ICLogger.d("message data == > " + textData);
- //TODO:
+ ContentResolver resolver = mRuntime.getContextProxy().getResolver();
+ ContentValues values = new ContentValues();
+ //路径
+ values.put("content", textData);
+ //类型为2表示的是文本
+ values.put("type", 2);
+ //状态:0表示未读
+ values.put("state", 0);
+ //接受还是发送,1表示来信
+ values.put("in_or_out", 1);
+ //对方号码是没有的
+ values.put("remote_num", "");
+ values.put("create_time", System.currentTimeMillis());
+ values.put("update_time", System.currentTimeMillis());
+ //字段:内容,类型,来源,分类,是否已读,联系人ID
+ resolver.insert(Uri.parse(FZDMessageProvider.MESSAGES), values);
//入数据库
mConnection.send(MESSAGE());
}