接着,就可以使用 SQLCipher 依赖库来对微信数据库进行查询,我们需要为项目添加如下依赖,方便操作数据库 。
//我们需要对项目增加依赖implementation 'net.zetetic:android-database-sqlcipher:3.5.4@aar'
利用上面得到的密码打开加密数据库,然后查询「rcontact」表获取微信通讯录内所有的好友的微信号、昵称、用户名等数据 。
/** * 连接数据库 * <p> * 常用库介绍:【rcontact】联系人表,【message】聊天消息表 * * @param dbFile */private void openWxDb(File dbFile, String db_pwd){ //所有联系人 List<Contact> contacts = new ArrayList<>(); SQLiteDatabase.loadLibs(this); SQLiteDatabaseHook hook = new SQLiteDatabaseHook() { public void preKey(SQLiteDatabase database) { } public void postKey(SQLiteDatabase database) { atabase.rawExecSQL("PRAGMA cipher_migrate;"); //兼容2.0的数据库 } }; try { //打开数据库连接 SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase(dbFile, db_pwd, null, hook); //查询所有联系人 //过滤掉本人、群聊、公众号、服务号等一些联系人 //verifyFlag != 0:公众号、服务号 //注意黑名单用户,我-设置-隐私-通讯录黑名单 Cursor c1 = db.rawQuery( "select * from rcontact where verifyFlag =0 and type not in (2,4,8,9,33,35,256,258,512,2051,32768,32770,32776,33024,65536,65792,98304) and username not like "%@app" and username not like "%@qqim" and username not like "%@chatroom" and encryptUsername!=""", null); while (c1.moveToNext()) { String userName = c1.getString(c1.getColumnIndex("username")); String alias = c1.getString(c1.getColumnIndex("alias")); String nickName = c1.getString(c1.getColumnIndex("nickname")); int type = c1.getInt(c1.getColumnIndex("type")); contacts.add(new Contact(userName, alias, nickName)); } Log.d("xag", "微信通讯录中,联系人数目:" + contacts.size() + "个"); for (int i = 0; i < contacts.size(); i++) { Log.d("xag", contacts.get(i).getNickName()); } c1.close(); db.close(); } catch (Exception e) { Log.e("xag", "读取数据库信息失败" + e.toString()); Toast.makeText(this, "读取微信通信录失败!", Toast.LENGTH_SHORT).show(); } Toast.makeText(this, "读取微信通信录成功!", Toast.LENGTH_SHORT).show();}
推荐阅读
- Excel删除重复值,你会吗?
- “瘦金体”由谁所创?
- 谁知道彩云红,红岁红茶?[红茶]
- 梦溪笔谈是谁写的? 梦溪笔谈作者
- cache文件夹可以删除吗?
- 朱棣把皇位传给了谁?
- 汉子哥是谁?
- 人民法院审理案件由谁来审理?
- 乱七八糟的Excel空行,怎么删?
- 清朝初期中国地图 清朝第一张地图是谁绘制的