take a pic for remote.
authorTrillGates <williamtrillgates@gmail.com>
Wed, 7 Apr 2021 11:32:11 +0000 (19:32 +0800)
committerTrillGates <williamtrillgates@gmail.com>
Wed, 7 Apr 2021 11:32:11 +0000 (19:32 +0800)
app/src/main/java/com/enqualcomm/support/bean/StringMessage.java
app/src/main/java/com/enqualcomm/support/provider/FZDMessageProvider.java
app/src/main/java/com/enqualcomm/support/service/Deliver.java
app/src/main/java/com/enqualcomm/support/service/WeTalkMsgObserver.java
app/src/main/java/com/ic/protocols/protocol_fzd.java

index 908495f..f32cb10 100644 (file)
@@ -3,95 +3,110 @@ package com.enqualcomm.support.bean;
 import java.util.ArrayList;\r
 \r
 public class StringMessage {\r
-  //暂时未用\r
-  ArrayList<byte[]> bs;\r
-\r
-  //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。\r
-  private String cache;\r
-\r
-  //数据库中的index\r
-  private int index=-1;\r
-\r
-  //命令日期\r
-  private String date=null;\r
-\r
-  //命令时间\r
-  private String time=null;\r
-  //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用\r
-  protected String[] fragments;\r
-\r
-  //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复\r
-  private int sentFlag;\r
-\r
-  //除mqtt协议可以使用\r
-  public StringMessage(String paramString) {\r
-    this.cache = paramString;\r
-    this.sentFlag = 0;\r
-  }\r
-\r
-  public String getDate(){\r
-    return date;\r
-  }\r
-\r
-  public String getTime(){\r
-    return time;\r
-  }\r
-\r
-  public int getIndex(){\r
-    return index;\r
-  }\r
-\r
-  public void setIndex(int i){\r
-    index=i;\r
-  }\r
-\r
-  public void setDate(String date1,String time1){\r
-    date=date1;\r
-    time=time1;\r
-  }\r
-  //mqtt协议使用 设置topic\r
-  public StringMessage(String[] paramArrayOfString) { this(paramArrayOfString, 0); }\r
-\r
-\r
-  //暂时未用,二进制数据备用\r
-  public StringMessage(String[] paramArrayOfString, ArrayList<byte[]> paramArrayList) {\r
-    this.fragments = paramArrayOfString;\r
-    this.bs = paramArrayList;\r
-    this.sentFlag=0;\r
-  }\r
-\r
-  //mqtt协议使用,设置topic 以及 发送标志\r
-  public StringMessage(String[] paramArrayOfString, int paramBoolean) {\r
-    this.fragments = paramArrayOfString;\r
-    this.sentFlag = paramBoolean;\r
-  }\r
-\r
-  //设置发送flag\r
-  public void setSentFlag(int f){\r
-    sentFlag=f;\r
-  }\r
-\r
-  //获取发送flag\r
-  public int haveSent(){\r
-    return sentFlag;\r
-  }\r
-\r
-  //未用\r
-  public String[] all() { return this.fragments; }\r
-\r
-  //获取topic内容\r
-  public String cmd() { return this.fragments[0]; }\r
-\r
-  //获取协议消息主体内容\r
-  public String isFromCache() { return this.cache; }\r
-\r
-  //更新协议消息主体内容\r
-  public void refresh(String paramString) { this.cache = paramString; }\r
-\r
-  //未用\r
-  public int size() { return (this.fragments != null) ? this.fragments.length : 0; }\r
-\r
-  //未用\r
-  public ArrayList<byte[]> source() { return this.bs; }\r
+    //暂时未用\r
+    ArrayList<byte[]> bs;\r
+\r
+    //目前作为消息主体,除了mqtt协议还需要一个topic(fragments[0]) , 其他协议就是要发送的内容本身。\r
+    private String cache;\r
+\r
+    //数据库中的index\r
+    private int index = -1;\r
+\r
+    //命令日期\r
+    private String date = null;\r
+\r
+    //命令时间\r
+    private String time = null;\r
+    //mqtt协议中第一条就是 topic,其他协议中就是cmdname或者无用\r
+    protected String[] fragments;\r
+\r
+    //发送标志(表示已经接收到服务器返回消息) , 0 未发送, 1 发送等回复, 2 已回复\r
+    private int sentFlag;\r
+\r
+    //除mqtt协议可以使用\r
+    public StringMessage(String paramString) {\r
+        this.cache = paramString;\r
+        this.sentFlag = 0;\r
+    }\r
+\r
+    public String getDate() {\r
+        return date;\r
+    }\r
+\r
+    public String getTime() {\r
+        return time;\r
+    }\r
+\r
+    public int getIndex() {\r
+        return index;\r
+    }\r
+\r
+    public void setIndex(int i) {\r
+        index = i;\r
+    }\r
+\r
+    public void setDate(String date1, String time1) {\r
+        date = date1;\r
+        time = time1;\r
+    }\r
+\r
+    //mqtt协议使用 设置topic\r
+    public StringMessage(String[] paramArrayOfString) {\r
+        this(paramArrayOfString, 0);\r
+    }\r
+\r
+\r
+    //暂时未用,二进制数据备用\r
+    public StringMessage(String[] paramArrayOfString, ArrayList<byte[]> paramArrayList) {\r
+        this.fragments = paramArrayOfString;\r
+        this.bs = paramArrayList;\r
+        this.sentFlag = 0;\r
+    }\r
+\r
+    //mqtt协议使用,设置topic 以及 发送标志\r
+    public StringMessage(String[] paramArrayOfString, int paramBoolean) {\r
+        this.fragments = paramArrayOfString;\r
+        this.sentFlag = paramBoolean;\r
+    }\r
+\r
+    //设置发送flag\r
+    public void setSentFlag(int f) {\r
+        sentFlag = f;\r
+    }\r
+\r
+    //获取发送flag\r
+    public int haveSent() {\r
+        return sentFlag;\r
+    }\r
+\r
+    //未用\r
+    public String[] all() {\r
+        return this.fragments;\r
+    }\r
+\r
+    //获取topic内容\r
+    public String cmd() {\r
+        return this.fragments[0];\r
+    }\r
+\r
+    //获取协议消息主体内容\r
+    public String isFromCache() {\r
+        return this.cache;\r
+    }\r
+\r
+    //更新协议消息主体内容\r
+    public void refresh(String paramString) {\r
+        this.cache = paramString;\r
+    }\r
+\r
+    //未用\r
+    public int size() {\r
+        return (this.fragments != null) ? this.fragments.length : 0;\r
+    }\r
+\r
+    //未用\r
+    public ArrayList<byte[]> source() {\r
+        return this.bs;\r
+    }\r
 }\r
 \r
index 0d3a5fb..1172344 100644 (file)
@@ -87,7 +87,7 @@ public class FZDMessageProvider extends ContentProvider {
                     ////状态:0表示未读,1表示未读,2表示未发送,3表示发送中,4表示发送失败,5表示发送成功
                     int state = values.getAsInteger("state");
                     //往外发送
-                    if (out == 2 && state == 2) {
+                    if (out == FZDDatabaseHelper.InOrOut.out && state == FZDDatabaseHelper.MessageState.NO_SEND) {
                         Uri sendNotify = Uri.parse(MESSAGES_SEND + "/" + id);
                         //发出通知
                         Objects.requireNonNull(getContext()).getContentResolver().notifyChange(sendNotify, null);
index 0fef380..1a61b49 100644 (file)
@@ -460,11 +460,11 @@ public class Deliver extends AbstractConnectionService {
             //类型为声音
             contentValues.put("type", FZDDatabaseHelper.MessageType.PIC);
             //状态:0表示未读
-            contentValues.put("state", 0);
+            contentValues.put("state", FZDDatabaseHelper.MessageState.NO_SEND);
             //文件时长
             contentValues.put("duration", 0);
             //接受还是发送,1表示来信
-            contentValues.put("in_or_out", 1);
+            contentValues.put("in_or_out", FZDDatabaseHelper.InOrOut.out);
             //对方号码是没有的
             contentValues.put("remote_num", "");
             contentValues.put("create_time", System.currentTimeMillis());
index e49c8b7..c6cbcbc 100644 (file)
@@ -6,6 +6,7 @@ import android.database.Cursor;
 import android.net.Uri;
 import android.os.Handler;
 
+import com.enqualcomm.support.provider.FZDDatabaseHelper;
 import com.enqualcomm.support.provider.FZDMessageProvider;
 import com.enqualcomm.support.utils.ICLogger;
 import com.ic.protocols.protocolAPIHelper;
@@ -44,10 +45,17 @@ public class WeTalkMsgObserver extends ContentObserver {
                 String remoteNum = query.getString(query.getColumnIndex("remote_num"));
                 int duration = query.getInt(query.getColumnIndex("duration"));
                 ICLogger.d("content --- > " + content);
+                //todo:还有类型也要查询出来
+                int type = query.getInt(query.getColumnIndex("type"));
                 query.close();
                 //交给fzd协议吧,让它去发送消息
                 protocol_fzd fzd = protocolAPIHelper.getProtocolfzd_handler();
-                fzd.sendVoice(duration, remoteNum, content, lastPathSegment);
+                if (type == FZDDatabaseHelper.MessageType.VOICE) {
+                    fzd.sendVoice(duration, remoteNum, content, lastPathSegment);
+                } else if (type == FZDDatabaseHelper.MessageType.PIC) {
+                    //图片数据
+                    fzd.sendPicture(remoteNum, content, lastPathSegment);
+                }
             }
         });
     }
index 08f83a5..b1b83df 100644 (file)
@@ -237,6 +237,106 @@ public class protocol_fzd {
         return (int) ((duration / 1000) + 1);
     }
 
+    /**
+     * 发送图片的功能
+     * 当终端收到 rcapture 指令后,触发拍照功能并执行上传 img 指令。
+     * 终端发送:[XT*334588000000156*len*img,x,y,z] 参数 x 为 5:远程拍照。参数 x 为 6:主动拍照(将在聊天消息里展现)。
+     * 参数 y 表示 :时间(年月日时分秒:160429110950)
+     * 参数 z 为照片内容 图片数据遇到以下左边的数据需转译成右边的数据
+     * 0X7D --> 0X7D 0X01
+     * 0X5B --> 0X7D 0X02
+     * 0X5D --> 0X7D 0X03
+     * 0X2C --> 0X7D 0X04
+     * 0X2A --> 0X7D 0X05
+     * 注:后面的微聊和语音指令包一样,对数据内容作相应转码处理
+     * 平台回复: [XT*334588000000156*0003*img]
+     *
+     * @param remoteNum 远程ID,如果是聊天的话,可能可以用得上
+     * @param imagePath 这是图片路径
+     * @param imageId   数据库记录的Id
+     */
+    public void sendPicture(String remoteNum, String imagePath, String imageId) {
+        //TODO:
+        File file = new File(imagePath);
+        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 outFile = new File("/storage/emulated/0/Pictures/test.jpg");
+                //FileOutputStream fos = new FileOutputStream(outFile);
+                //fos.write(result);
+                //fos.close();
+                ICLogger.d("remote id == > " + remoteNum);
+                ByteArrayOutputStream bos = new ByteArrayOutputStream();
+                String cmd = cmdMap.get(CMD_TYPE.img);
+                //发送消息
+                String timeStr = String.valueOf(System.currentTimeMillis());
+                int cmdLength = cmd.length() + CMDSPLIT.length() + "5".length() + CMDSPLIT.length()
+                        + timeStr.length() + CMDSPLIT.length() + result.length;
+
+                ICLogger.d("cmdLength == > " + cmdLength);
+                String header = genHeader(cmdLength, cmd);
+                StringBuilder sb = new StringBuilder();
+                if (doEncryption) {
+                    String keyHeader = keyheader(cmd, cmdLength);
+                    sb.append(CMDHEADER).append(keyHeader).append(header);
+                } else {
+                    sb.append(CMDHEADER).append(header);
+                }
+                //头部构造好了,添加逗号
+                sb.append(CMDSPLIT);
+                //追加x
+                sb.append("5");
+                sb.append(CMDSPLIT);
+                //追加Y
+                sb.append(timeStr);
+                sb.append(CMDSPLIT);
+                //转成byte
+                bos.write(sb.toString().getBytes());
+                //追加数据Z
+                bos.write(result);
+                //追加结尾
+                bos.write(CMDEND.getBytes());
+                //发送数据
+                mConnection.send(cmd, bos.toByteArray());
+                bos.reset();
+                bos.close();
+                //更新数据库状态
+                ContentValues contentValues = new ContentValues();
+                contentValues.put("state", 5);
+                mRuntime.getContextProxy().getResolver().update(
+                        Uri.parse(FZDMessageProvider.MESSAGES),
+                        contentValues,
+                        "_id=?",
+                        new String[]{imageId}
+                );
+            } catch (Exception e) {
+                e.printStackTrace();
+                ContentValues contentValues = new ContentValues();
+                contentValues.put("state", 4);
+                mRuntime.getContextProxy().getResolver().update(
+                        Uri.parse(FZDMessageProvider.MESSAGES),
+                        contentValues,
+                        "_id=?",
+                        new String[]{imageId}
+                );
+            }
+        }
+    }
+
     public enum CMD_TYPE {
         /*终端发起*/
         //链路保持数据
@@ -277,6 +377,7 @@ public class protocol_fzd {
         REMIND,//闹钟设置指令
         TK,//对讲功能(微聊发送语音)
         TKOne,//一对一微聊
+        TKIMG,//聊天图片
         PHL,//设置电话本+白名单(最多 50 条)
         wdstart,//远程测温
         bldstart,//远程测血压
@@ -337,6 +438,7 @@ public class protocol_fzd {
         cmdMap.put(CMD_TYPE.REMIND, "REMIND");
         cmdMap.put(CMD_TYPE.TK, "TK");
         cmdMap.put(CMD_TYPE.TKOne, "TKOne");
+        cmdMap.put(CMD_TYPE.TKIMG, "TKIMG");
         cmdMap.put(CMD_TYPE.PHL, "PHL");
         cmdMap.put(CMD_TYPE.wdstart, "wdstart");
         cmdMap.put(CMD_TYPE.bldstart, "bldstart");
@@ -421,7 +523,12 @@ public class protocol_fzd {
             return "";
     }
 
-    //[6fb043e7f6bb5f107319e3f3822d7124IC*860316012050026*0126*UD,210318,163421,A,33.0227161,N,114.0202817,E,2.98,0.0,0.0,5,039,095,35,00,0100018,5,1,460,00,18899,190839372,44,18899,81,43,18899,56,39,18899,458,38,18899,497,33,5,AP1,fc:d7:33:c8:77:d2,-57,AP2,1c:60:de:28:03:b4,-65,AP3,a4:2b:8c:89:62:91,-68,AP4,cc:2d:21:e2:46:a8,-68,AP5,be:dd:c2:47:04:2b,-70]
+    //[6fb043e7f6bb5f107319e3f3822d7124IC*860316012050026*0126*UD,210318,163421,
+    // A,33.0227161,N,114.0202817,E,2.98,0.0,0.0,5,039,
+    // 095,35,00,0100018,5,1,460,00,18899,190839372,44,18899,
+    // 81,43,18899,56,39,18899,458,38,18899,497,33,5,AP1,
+    // fc:d7:33:c8:77:d2,-57,AP2,1c:60:de:28:03:b4,-65,
+    // AP3,a4:2b:8c:89:62:91,-68,AP4,cc:2d:21:e2:46:a8,-68,AP5,be:dd:c2:47:04:2b,-70]
     public StringMessage genUD2FromUD(StringMessage ud) {
         String cmd, data, tmp;
         tmp = ud.isFromCache();
@@ -491,6 +598,8 @@ public class protocol_fzd {
                         handlerGroupChatVoiceContent(totalByte);
                     } else if (key == CMD_TYPE.TKOne) {
                         handlerOneChatVoiceContent(totalByte);
+                    } else if (key == CMD_TYPE.TKIMG) {
+                        handleImage(totalByte);
                     } else {
                         String data = content.replace(CMDHEADER, "").replace(cmd, "").replace(CMDEND, "");
                         if (data.startsWith(CMDSPLIT)) {
@@ -505,6 +614,15 @@ public class protocol_fzd {
         return true;
     }
 
+    /**
+     * 图片下发
+     *
+     * @param totalByte
+     */
+    private void handleImage(byte[] totalByte) {
+        ICLogger.d("on image down...");
+    }
+
     /**
      * 一对一微聊
      *
@@ -1380,6 +1498,9 @@ public class protocol_fzd {
                 handleCapture(mRuntime);
                 mConnection.DeliverCMDMessageToSystem("rcapture", cmd);
                 break;
+            case CALL:
+                //TODO:
+                break;
         }
         return ret;