diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java index c0ff663..777bc27 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileAdapter.java @@ -13,7 +13,10 @@ import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; import com.thankvinci.CloudKey.Fragment.FileManageFragment; +import com.thankvinci.CloudKey.MainActivity; import com.thankvinci.CloudKey.R; +import com.thankvinci.CloudKey.Utils.FileHandler; +import com.thankvinci.CloudKey.Utils.FileThread; import org.apache.commons.codec.digest.DigestUtils; @@ -67,12 +70,10 @@ public class FileAdapter extends RecyclerView.Adapter { }else{ //Toast.makeText(v.getContext(),fitem.getName()+" "+fitem.isCompress(),Toast.LENGTH_SHORT).show(); if (fitem.isCompress()){ - try { - String filemd5 = DigestUtils.md5Hex(new FileInputStream(builder.toString())); - Toast.makeText(v.getContext(),"MD5码为:\n"+filemd5,Toast.LENGTH_LONG).show(); - } catch (IOException e) { - e.printStackTrace(); - } + FileHandler fileHandler = new FileHandler((MainActivity)v.getContext()); + Thread ft = new Thread(new FileThread(fileHandler,builder.toString(),null,0)); + ft.start(); + Toast.makeText(v.getContext(),"线程正在处理,请稍后",Toast.LENGTH_LONG).show(); }else{ Toast.makeText(v.getContext(),"没有打开除文件夹和压缩包以外的功能",Toast.LENGTH_SHORT).show(); } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java index babd67f..043e73a 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Files/FileUtils.java @@ -1,6 +1,11 @@ package com.thankvinci.CloudKey.Files; +import org.apache.commons.codec.digest.DigestUtils; + import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; @@ -24,5 +29,8 @@ public class FileUtils { }); } //获取文件的MD5码值 - public static void getFileMD5(File f){} + public static String getFileMD5(String path) throws IOException { + String filemd5 = DigestUtils.md5Hex(new FileInputStream(path)); + return filemd5; + } } diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java index 3f7d1e5..503a1b0 100644 --- a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Fragment/FileManageFragment.java @@ -19,6 +19,7 @@ import com.thankvinci.CloudKey.Files.FileAdapter; import com.thankvinci.CloudKey.Files.FileItem; import com.thankvinci.CloudKey.Files.FileUtils; import com.thankvinci.CloudKey.R; +import com.thankvinci.CloudKey.Utils.MyUtils; import java.io.File; import java.util.ArrayList; @@ -58,6 +59,14 @@ public class FileManageFragment extends Fragment { path_edit.setText(dir); path_edit.setSelection(dir.length()); loadDirectory(); + + path_edit.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + MyUtils.copyToClipboard(getActivity(),path_edit.getText().toString()); + Toast.makeText(getActivity(),"当前路径已复制到剪贴板",Toast.LENGTH_SHORT).show(); + } + }); } public String getDir(){ return dir; diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java new file mode 100644 index 0000000..3acd6ac --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileHandler.java @@ -0,0 +1,27 @@ +package com.thankvinci.CloudKey.Utils; + +import android.app.Activity; +import android.os.Handler; +import android.os.Message; +import android.widget.Toast; + +public class FileHandler extends Handler { + //定义功能选择的常量 获取MD5和解压 + final static int FUNCTION_GET_MD5 = 0; + final static int FUNCTION_DECOMPRESS = 1; + + private Activity activity; + + public FileHandler(Activity activity){ + this.activity = activity; + } + @Override + public void handleMessage(Message msg) { + super.handleMessage(msg); + switch (msg.what){ + case FUNCTION_GET_MD5: + Toast.makeText(activity,msg.getData().getString("md5"),Toast.LENGTH_SHORT).show(); + break; + } + } +} diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java new file mode 100644 index 0000000..97bd68a --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/FileThread.java @@ -0,0 +1,50 @@ +package com.thankvinci.CloudKey.Utils; + +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; + +import com.thankvinci.CloudKey.Files.FileUtils; + +import java.io.IOException; + +public class FileThread implements Runnable{ + + final static int FUNCTION_GET_MD5 = 0; + final static int FUNCTION_DECOMPRESS = 1; + + private String srcPath,desPath,md5; + private Handler handler; + + private int function; + + public FileThread(Handler handler,String srcPath,String desPath,final int FUNCTION){ + this.handler = handler; + this.srcPath = srcPath; + this.desPath = desPath; + this.function = FUNCTION; + } + @Override + public void run(){ + Message msg = new Message(); + Bundle data = new Bundle(); + switch (function){ + case FUNCTION_GET_MD5: + try { + md5 = FileUtils.getFileMD5(srcPath); + data.putString("md5",md5); + msg.what = FUNCTION_GET_MD5; + msg.setData(data); + handler.sendMessage(msg); + } catch (IOException e) { + e.printStackTrace(); + } + + break; + case FUNCTION_DECOMPRESS: + break; + default: break; + } + } + +} diff --git a/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java new file mode 100644 index 0000000..3a63760 --- /dev/null +++ b/CloudKey/app/src/main/java/com/thankvinci/CloudKey/Utils/MyUtils.java @@ -0,0 +1,12 @@ +package com.thankvinci.CloudKey.Utils; + +import android.app.Activity; +import android.content.ClipboardManager; +import android.content.Context; + +public class MyUtils { + public static void copyToClipboard(Activity activity,String str){ + ClipboardManager cmb = (ClipboardManager)activity.getSystemService(Context.CLIPBOARD_SERVICE); + cmb.setText(str); + } +} diff --git a/开发历程.md b/开发历程.md index 9238c84..c25bec8 100644 --- a/开发历程.md +++ b/开发历程.md @@ -223,4 +223,26 @@ public static final View.OnClickListener createNavigateOnClickListener(@IdRes in 将loadRoot和loadDirectory两个方法合并为loadDirectory(),本质上都是加载一个目录 -发现不管怎么加载都是根目录的内容,随后发现是之前的一个错误想法:在当前的fragment刷新布局,然后原来的布局压栈,虽然找到了navigation的方法,但是为了节约资源将FileAdapter设置为单例模式没有改回来. \ No newline at end of file +发现不管怎么加载都是根目录的内容,随后发现是之前的一个错误想法:在当前的fragment刷新布局,然后原来的布局压栈,虽然找到了navigation的方法,但是为了节约资源将FileAdapter设置为单例模式没有改回来. + +**2021/6/11** + +实现获取文件md5码的功能,使用到的库是:implementation group: 'commons-codec', name: 'commons-codec', version: '1.15' + +**2021/6/11** + +发现获取文件md5码的过程是在主线程中,当文件过大时,主线程阻塞,设置为子线程执行,之后的文件解压同理 + +涉及到线程和handler就得回到之前对handler的规范 + +本程序有两个线程,一个是NetThread,另一个是FileThread,同样就有两个Handler + +先完成FileThread和FileHandler + + FileThread主要处理 获取文件md5码和解压 + +FileHandler负责将获取到的md5码发到NetThread,然后将得到的密码输出到密码输入框 + +**2021/6/12** + +完成了子线程中获取md5并发到主线程的功能 \ No newline at end of file