瀏覽代碼

store log file to local sdcard

cs 10 月之前
父節點
當前提交
3d0d916a87

+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -14,6 +14,7 @@
         android:label="@string/app_name"
         android:roundIcon="@mipmap/ic_launcher_round"
         android:supportsRtl="true"
+        android:requestLegacyExternalStorage="true"
         android:theme="@style/AppTheme">
         <activity
             android:name=".MainActivity"

+ 4 - 2
app/src/main/java/org/las2mile/okio/OkIoClient.java

@@ -63,12 +63,14 @@ public class OkIoClient extends Thread{
                         if(packet.cmd == BaseMsg.RESP_REQUEST_LOGZIP){
                             LogFileMsgResp logFileMsgResp = new LogFileMsgResp();
                             logFileMsgResp.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());
-                            Ln.e("file size:"+logFileMsgResp.fileSize+"  "+logFileMsgResp.pktNo+"/"+logFileMsgResp.pktNums);//+"   "+ " client zipfile "+logFileMsgResp.toString());
+                            Ln.e("file size:"+logFileMsgResp.fileSize+"  "+logFileMsgResp.pktNo+"/"+logFileMsgResp.pktNums+ " client zipfile "+logFileMsgResp.toString());
                             DownTaskHandler downTaskHandler = peddingDownloadTasks.get(Integer.valueOf(logFileMsgResp.taskId));
+                            int writtenPercent = downTaskHandler.store(logFileMsgResp.offset,logFileMsgResp.samples,logFileMsgResp.sampleSize,logFileMsgResp.pktNums,logFileMsgResp.pktNo,logFileMsgResp.fileSize);
+                            logFileMsgResp.zipPath = downTaskHandler.mZipPath;//用于显示文件路径
+                            logFileMsgResp.writenPercent = writtenPercent;//用于显示下载百分比
                             if(mOnOkIoMsgListener != null){
                                 mOnOkIoMsgListener.onOkIoMsg(logFileMsgResp);
                             }
-                            downTaskHandler.store(logFileMsgResp.offset,logFileMsgResp.samples,logFileMsgResp.pktNums,logFileMsgResp.pktNo,logFileMsgResp.fileSize);
                         } else if(packet.cmd == BaseMsg.RESP_LOGZIP_END){
                             LogFileEndMsgResp logFileEndMsgResp = new LogFileEndMsgResp();
                             logFileEndMsgResp.decodeData(packet.mBaseMsgBuffer, (short) packet.mBaseMsgBuffer.size());

+ 57 - 2
app/src/main/java/org/las2mile/okio/client/DownTaskHandler.java

@@ -12,11 +12,21 @@ import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
+import java.io.RandomAccessFile;
+import java.io.File;
 
 public class DownTaskHandler {
+    public static final String LOCALE_LOG_ROOT_DIR = "/sdcard/phone/";
+
     public int taskId = 0;
     int mSum = 0;
     Set<Integer> receivedPkts;
+    RandomAccessFile mZipRaFile;
+    public String mZipPath;
+
+    public DownTaskHandler(){
+        mZipRaFile = null;
+    }
 
     public static int genTaskId(){
         Date date = new Date();
@@ -36,12 +46,13 @@ public class DownTaskHandler {
         return  reqLogFileMsg;
     }
 
-    public void store(long skip,byte[] content, int pktNums, int pktNo,long fileSize) throws IOException{
+    public int store(long skip,byte[] content,int contentLen, int pktNums, int pktNo,long fileSize) throws IOException{
         mSum = pktNums;
         //output to local file
-
+        long bytesWritten = restorePartly(fileSize,skip,content,contentLen);
         //record received sub pkts;
         receivedPkts.add(pktNo);
+        return (int)(bytesWritten*1.0f/fileSize*100);
     }
 
     public BaseMsg checkLost(int taskId) throws IOException {
@@ -65,11 +76,47 @@ public class DownTaskHandler {
         }
         logFileLostMsg.taskId = taskId;
 
+        //无需补充包时,关闭本地文件
+        if(lostsize == 0){
+            if(mZipRaFile == null) {
+                mZipRaFile.close();
+            }
+        }
+
         lostPkts.clear();
 
         return logFileLostMsg;
     }
 
+    /**
+     *
+     * @param fileSize  为本地文件设定大小
+     * @param offset    每个子包写入的起始位置
+     * @param data      子包数据
+     * @param dataLen   子包长度
+     */
+    private long restorePartly(long fileSize,long offset,byte[] data,long dataLen){
+        long bytesWritten = 0;
+        try {
+            if(mZipRaFile == null) {
+                File dir = new File(LOCALE_LOG_ROOT_DIR);
+                if (!dir.exists()) {
+                    dir.mkdir();
+                }
+                File zipF = new File(dir.getPath() + "/log_"+timeToFmtStr(taskId)+".zip");
+                mZipPath = zipF.getAbsolutePath();//用于显示文件路径
+                mZipRaFile = new RandomAccessFile(zipF, "rw");
+                mZipRaFile.setLength(fileSize);
+            }
+            mZipRaFile.seek(offset);
+            mZipRaFile.write(data, 0, (int) dataLen);
+            bytesWritten = mZipRaFile.getFilePointer();
+        } catch (Exception e){
+            e.printStackTrace();
+        }
+        return bytesWritten;
+    }
+
     public static Long getStringTolong(String date, String format) {
         try {
             DateFormat fmt = new SimpleDateFormat(format);
@@ -81,4 +128,12 @@ public class DownTaskHandler {
         }
     }
 
+    public static String timeToFmtStr(long time) {
+        Long long1970 = getStringTolong("1970-01-01 00:00:00", "yyyy-MM-dd HH:mm:ss");
+        long cc_ts = time * 1000 + long1970;
+        DateFormat fmt = new SimpleDateFormat("yyyyMMdd_HHmmss");
+        String str = fmt.format(new Date(cc_ts));
+        return str;
+    };
+
 }

+ 5 - 2
app/src/main/java/org/las2mile/okio/message/resp/LogFileMsgResp.java

@@ -14,8 +14,11 @@ public class LogFileMsgResp extends BaseMsg {
     public int pktNums;
     public int pktNo;
     public byte[] samples;
-    int sampleSize;
+    public int sampleSize;
     public int offset;
+
+    public String zipPath;//用于显示文件路径,临时的,与协议无关
+    public int writenPercent;//用于显示下载百分比,临时的,与协议无关
     public LogFileMsgResp(){
         mCmd = RESP_REQUEST_LOGZIP;
     }
@@ -77,7 +80,7 @@ public class LogFileMsgResp extends BaseMsg {
                 ",pktNums=" + pktNums +
                 ", pktNo=" + pktNo +
 //                ", samples=" + Arrays.toString(samples) +
-               ","+ OkIoPacketDecode.toHexString(samples)+
+//               ","+ OkIoPacketDecode.toHexString(samples)+
                 ", sampleSize=" + sampleSize +
                 ", offset=" + offset +
                 ", mCmd=" + mCmd +

+ 13 - 2
app/src/main/java/org/las2mile/scrcpy/MainActivity.java

@@ -56,6 +56,7 @@ import android.app.AlertDialog;
 import android.content.DialogInterface;
 import android.net.Uri;
 import android.provider.Settings;
+import android.graphics.Color;
 
 
 public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCallbacks, SensorEventListener {
@@ -97,6 +98,7 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
     static final int GOT_REMOTE_VERSION = 7;
     static final int GOT_REMOTE_LOG_PROCEDURE = 8;
     static final int GOT_REMOTE_LOG_PROCEDURE_END = 9;
+    static final int GOT_REMOTE_LOG_PROCEDURE_START = 10;
 
     Handler mainHandler = new Handler(new Handler.Callback() {
         @Override
@@ -134,6 +136,12 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
                 Boolean ok = (Boolean)message.obj;
                 String str_remote_log_dlst = String.format(getResources().getString(R.string.str_remote_log_dlst),ok ? "成功":"失败");
                 TextView tv_remote_log_dlst = findViewById(R.id.tv_remote_log_dlst);
+                tv_remote_log_dlst.setTextColor(ok ? Color.BLUE : Color.RED);
+                tv_remote_log_dlst.setText(str_remote_log_dlst);
+            } else if (what == GOT_REMOTE_LOG_PROCEDURE_START){
+                TextView tv_remote_log_dlst = findViewById(R.id.tv_remote_log_dlst);
+                tv_remote_log_dlst.setTextColor(Color.GRAY);
+                String str_remote_log_dlst = String.format(getResources().getString(R.string.str_remote_log_dlst),"下载中");
                 tv_remote_log_dlst.setText(str_remote_log_dlst);
             }
             return false;
@@ -144,6 +152,9 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
         final Button btn_dl_status = findViewById(R.id.btn_dl_status);
         btn_dl_status.setOnClickListener(v -> {
             Log.e("scrcpy","Asset initDownloadBtn");
+            Message msg = new Message();
+            msg.what = GOT_REMOTE_LOG_PROCEDURE_START;
+            mainHandler.sendMessage(msg);
             scrcpy.downloadLog();
         });
     }
@@ -228,8 +239,8 @@ public class MainActivity extends FragmentActivity implements Scrcpy.ServiceCall
     public void onOkIoMsg(BaseMsg baseMsg){
         if(baseMsg instanceof LogFileMsgResp){
             LogFileMsgResp logFileMsgResp = (LogFileMsgResp)baseMsg;
-            String percentStr = Math.round((logFileMsgResp.pktNo+1)*1.0f/logFileMsgResp.pktNums * 100)+"%";
-            String str_save_log_to_local = String.format(getResources().getString(R.string.str_save_log_to_local),"sdcd/df",percentStr);
+            String percentStr = logFileMsgResp.writenPercent+"%";//Math.round((logFileMsgResp.pktNo+1)*1.0f/logFileMsgResp.pktNums * 100)+"%";
+            String str_save_log_to_local = String.format(getResources().getString(R.string.str_save_log_to_local),logFileMsgResp.zipPath,percentStr);
             Message msg = new Message();
             msg.what = GOT_REMOTE_LOG_PROCEDURE;
             msg.obj = str_save_log_to_local;