日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xposed 配置如何传入指定模块(ContentProvider)

發(fā)布時間:2023/12/31 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xposed 配置如何传入指定模块(ContentProvider) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

當(dāng)我們編寫有界面的xposed模塊時,我們所給用戶提供了可以配置的數(shù)據(jù),但是配置的界面是在當(dāng)前進(jìn)程,而執(zhí)行的hook代碼在另外一個進(jìn)程,那么怎么傳遞這些數(shù)據(jù)呢?

根據(jù)研究有如下三個方法
1.XSharedPreferences(android 7.0以后便不能用了)
2.文件(不確定目標(biāo)程序是否開啟權(quán)限,也不適用)
3.contentprovider (可用)

所以最后就決定了使用contentprovider

Uri

首先我們需要了解Uri,Uri由兩部分組成 authority和path
authority:用來區(qū)分不同的程序,一般以包名命名
path:對同一程序中的表的區(qū)分
Uri前部需要添加協(xié)議說明
例如:content://com.xxx.xxx/user(com.xxx.xxx中的user表)
如果我們希望查詢user表中id為1的數(shù)據(jù)應(yīng)該這樣寫

content://com.xxx.xxx/user/1 *:表示任意長度的字符 content://com.xxx.xxx/* \#:表示任意長度的數(shù)字 content://com.xxx.xxx/user/#

ContentResolver

要想使用contentprovider,就需要借助到contentresolver。通過context.getContentResolver();來獲取該類。其實(shí)較為常用的方法有四種 insert,updata,delete,query

query:

Cursor querys = getContentResolver().query(Uri.parse("content://com.xxx.xxx/user"), null, null, null, null);if (querys != null) {while (querys.moveToNext()) {querys.getString(querys.getColumnIndex("packname")));//獲取數(shù)據(jù)中的packname字段的值}querys.close(); query(uri,projection,selection,selectionArgs,sortorder) uri:獲取到的uri projection:查詢的列名 selection:查詢的條件 例如“packname=?” selecionArgs:查詢條件的值 例如:new String[]{"123"} sortotder:排序的方式

insert

ContentValues contentValues = new ContentValues();contentValues.put("packname", pageitens.get(position).packname);context.getContentResolver().insert(parse, contentValues); 我的表設(shè)計(jì)的簡單 只有兩個字段 一個id(自增) 一個packname

update

ContentValues contentValues = new ContentValues();contentValues.put("packname", pageitens.get(position).packname);context.getContentResolver().update(parse, contentValues,“packname=?”,new String[]{"123"}); 這個也比較好理解 update(uri,value,selection,selectinArgs) uri:獲取到的uri value:要修改的數(shù)據(jù) selection:查詢的條件 例如“packname=?” selecionArgs:查詢條件的值 例如:new String[]{"123"}

delete

context.getContentResolver().delete(parse, "packname=?", new String[]{pageitens.get(position).packname}); delete(uri,selection,selectinArgs) uri:獲取到的uri selection:查詢的條件 例如“packname=?” selecionArgs:查詢條件的值 例如:new String[]{"123"}

ContentPeovider

public class TestContentProvider extends ContentProvider {public static final String AUTHO = "com.xxx.xxx";public static final int USER = 1;public static final int USERITEM = 2;public static final int USERITEM1 = 3;private DBHelper dbHelper;private UriMatcher uriMatcher;{//用來篩選uriuriMatcher = new UriMatcher(UriMatcher.NO_MATCH);uriMatcher.addURI(AUTHO, "user", USER);//#表示任意數(shù)字 *表示任意長度字符uriMatcher.addURI(AUTHO, "user/#", USERITEM);uriMatcher.addURI(AUTHO, "*", USERITEM1);}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// Implement this to handle requests to delete one or more rows.SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();int deleteint = 0;switch (uriMatcher.match(uri)) {//根據(jù)uri篩選表case USER://刪除數(shù)據(jù)deleteint = writableDatabase.delete("user", selection, selectionArgs);break;}return deleteint;}@Overridepublic String getType(Uri uri) {/*** MIME兩種類型* 1.uri以路徑結(jié)尾 前接vnd.android.cursor.dir/vnd.authority.path* 2.uri以id結(jié)尾 后接vnd.android.cursor.item/vnd.authority.path*/switch (uriMatcher.match(uri)) {case USER:return "vnd.android.cursor.dir/vnd.com.xxx.xxx/user";case USERITEM:return "vnd.android.cursor.item/vnd.com.xxx.xxx/user";case USERITEM1:return "vnd.android.cursor.item/vnd.com.xxx.xxx/user";default:break;}return null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();Uri inserturi = null;switch (uriMatcher.match(uri)) {//根據(jù)uri篩選表case USER://添加數(shù)據(jù)long user = writableDatabase.insert("user", null, values);inserturi = Uri.parse("content://" + AUTHO + "/user/" + user);break;default:throw new IllegalStateException("Unexpected value: " + uriMatcher.match(uri));}return inserturi;}@Overridepublic boolean onCreate() {//初始化數(shù)據(jù)庫dbHelper = new DBHelper(getContext());return true;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {SQLiteDatabase readableDatabase = dbHelper.getReadableDatabase();Cursor cursor = null;//根據(jù)uri篩選表switch (uriMatcher.match(uri)) {case USER:cursor = readableDatabase.query("user", projection, selection, selectionArgs, null, null, sortOrder);break;}return cursor;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {SQLiteDatabase writableDatabase = dbHelper.getWritableDatabase();int updatint = 0;switch (uriMatcher.match(uri)) {case USER:updatint = writableDatabase.update("user", values, selection, selectionArgs);break;}return updatint;} }

重點(diǎn)講解兩個方法 UriMatcher,gettype,query(增刪改查都差不多)
UriMatcher

UriMatcher主要是用來通過uri來篩選表 1.new UriMatcher(UriMatcher.NO_MATCH);//創(chuàng)建實(shí)例 2.uriMatcher.addURI(AUTHO, "user", 參數(shù)3); 將uri規(guī)則添加進(jìn)去 AUTHO:authority “user”:表明 參數(shù)3:用于后面區(qū)分不同的uri(int類型) 3.switch (uriMatcher.match(uri)) {//根據(jù)uri篩選表case 參數(shù)3://刪除數(shù)據(jù)deleteint = writableDatabase.delete("user", selection, selectionArgs);break;}通過uriMatcher.match(uri)獲取到對于的adduri中的參數(shù)3

getType

MIME兩種類型* 1.uri以路徑結(jié)尾 前接vnd.android.cursor.dir/vnd.authority.path* 2.uri以id結(jié)尾 后接vnd.android.cursor.item/vnd.authority.path*/代碼中有案例

最后記得在AndroidManifest中對剛剛寫的ContentProvider進(jìn)行注冊 就可以了

<providerandroid:name=".TestContentProvider"android:authorities="com.xxx.xxx"android:enabled="true"android:exported="true" />

在hook代碼中通過ContentResolver根據(jù)Uri進(jìn)行數(shù)據(jù)的操作即可

總結(jié)

以上是生活随笔為你收集整理的xposed 配置如何传入指定模块(ContentProvider)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。