MatrixCursor

http://www.cnblogs.com/topcoderliu/archive/2011/04/26/2029576.html


ContentProvider对外共享数据的时候的query()方法是需要一个cursor的。 

但是当ContentProvider不是从数据库中去的数据,而又需要返回cursor的时候就需要MatrixCursor。 

ContentProvider对外共享数据的时候的query()方法是需要一个cursor的,
但是如果没有数据库,而项目又需要从ContentProvider读取数据的时候怎么办?
更糟糕的是其他方法操作也都是需要cursor的。
此时就需要MatrixCursor了。相当有趣,它相当于为你模拟了一个表。

@Override
 
public Cursor query(Uri uri, String[] projection, String selection,
    String[] selectionArgs, String sortOrder) {
   String[] tableCursor = new String[] { "name" , "job" , "salary" };
   MatrixCursor cursor = new MatrixCursor(tableCursor);
   cursor.addRow( new Object[] { "1111" , "1111" , "1111" });
   return cursor;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Java编写的完整Shizuku内容提供器的示例代码,主要是演示如何使用Shizuku API来访问受保护的系统资源: ```java import android.content.ContentProvider; import android.content.ContentValues; import android.content.Context; import android.content.UriMatcher; import android.database.Cursor; import android.database.MatrixCursor; import android.net.Uri; import android.os.Binder; import android.os.Bundle; import android.os.Process; import android.os.UserHandle; import android.util.Log; import android.widget.Toast; import java.util.Arrays; import java.util.List; import moe.shizuku.api.ShizukuApi; public class MyContentProvider extends ContentProvider { private static final String TAG = "MyContentProvider"; private static final String AUTHORITY = "com.example.myapp.provider"; private static final UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); private static final int TYPE_STRING = 1; private static final int TYPE_INT = 2; private static final int TYPE_BOOLEAN = 3; private static final int TYPE_FLOAT = 4; private static final int TYPE_LONG = 5; private static final int CODE_STRING = 1; private static final int CODE_INT = 2; private static final int CODE_BOOLEAN = 3; private static final int CODE_FLOAT = 4; private static final int CODE_LONG = 5; private static final String KEY_NAME = "name"; private static final String KEY_TYPE = "type"; private static final String KEY_VALUE = "value"; static { uriMatcher.addURI(AUTHORITY, "string/*", CODE_STRING); uriMatcher.addURI(AUTHORITY, "int/*", CODE_INT); uriMatcher.addURI(AUTHORITY, "boolean/*", CODE_BOOLEAN); uriMatcher.addURI(AUTHORITY, "float/*", CODE_FLOAT); uriMatcher.addURI(AUTHORITY, "long/*", CODE_LONG); } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { String name = uri.getLastPathSegment(); int type = uriMatcher.match(uri); if (type <= 0) { throw new IllegalArgumentException("Unsupported URI: " + uri); } if (ShizukuApi.checkSelfPermission() != ShizukuApi.PERMISSION_GRANTED) { throw new SecurityException("Missing Shizuku permission"); } switch (type) { case CODE_STRING: String value = getStringValue(name); MatrixCursor cursor = new MatrixCursor(new String[]{KEY_NAME, KEY_TYPE, KEY_VALUE}); cursor.addRow(new Object[]{name, TYPE_STRING, value}); return cursor; case CODE_INT: int intValue = getIntValue(name); MatrixCursor cursor1 = new MatrixCursor(new String[]{KEY_NAME, KEY_TYPE, KEY_VALUE}); cursor1.addRow(new Object[]{name, TYPE_INT, intValue}); return cursor1; case CODE_BOOLEAN: boolean booleanValue = getBooleanValue(name); MatrixCursor cursor2 = new MatrixCursor(new String[]{KEY_NAME, KEY_TYPE, KEY_VALUE}); cursor2.addRow(new Object[]{name, TYPE_BOOLEAN, booleanValue}); return cursor2; case CODE_FLOAT: float floatValue = getFloatValue(name); MatrixCursor cursor3 = new MatrixCursor(new String[]{KEY_NAME, KEY_TYPE, KEY_VALUE}); cursor3.addRow(new Object[]{name, TYPE_FLOAT, floatValue}); return cursor3; case CODE_LONG: long longValue = getLongValue(name); MatrixCursor cursor4 = new MatrixCursor(new String[]{KEY_NAME, KEY_TYPE, KEY_VALUE}); cursor4.addRow(new Object[]{name, TYPE_LONG, longValue}); return cursor4; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } @Override public String getType(Uri uri) { switch (uriMatcher.match(uri)) { case CODE_STRING: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".string"; case CODE_INT: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".int"; case CODE_BOOLEAN: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".boolean"; case CODE_FLOAT: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".float"; case CODE_LONG: return "vnd.android.cursor.item/vnd." + AUTHORITY + ".long"; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } } @Override public Uri insert(Uri uri, ContentValues values) { throw new UnsupportedOperationException("Not supported"); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { throw new UnsupportedOperationException("Not supported"); } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { throw new UnsupportedOperationException("Not supported"); } private String getStringValue(String name) { try { Bundle result = ShizukuApi.transact("com.android.providers.settings", null, "GET_system", new Class[]{String.class}, new Object[]{name}, Bundle.class); if (result != null) { return result.getString("value"); } } catch (Throwable e) { Log.e(TAG, "getStringValue: ", e); } return null; } private int getIntValue(String name) { try { Bundle result = ShizukuApi.transact("com.android.providers.settings", null, "GET_system", new Class[]{String.class}, new Object[]{name}, Bundle.class); if (result != null) { return result.getInt("value"); } } catch (Throwable e) { Log.e(TAG, "getIntValue: ", e); } return 0; } private boolean getBooleanValue(String name) { try { Bundle result = ShizukuApi.transact("com.android.providers.settings", null, "GET_system", new Class[]{String.class}, new Object[]{name}, Bundle.class); if (result != null) { return result.getBoolean("value"); } } catch (Throwable e) { Log.e(TAG, "getBooleanValue: ", e); } return false; } private float getFloatValue(String name) { try { Bundle result = ShizukuApi.transact("com.android.providers.settings", null, "GET_system", new Class[]{String.class}, new Object[]{name}, Bundle.class); if (result != null) { return result.getFloat("value"); } } catch (Throwable e) { Log.e(TAG, "getFloatValue: ", e); } return 0; } private long getLongValue(String name) { try { Bundle result = ShizukuApi.transact("com.android.providers.settings", null, "GET_system", new Class[]{String.class}, new Object[]{name}, Bundle.class); if (result != null) { return result.getLong("value"); } } catch (Throwable e) { Log.e(TAG, "getLongValue: ", e); } return 0; } } ``` 在此示例中,我们使用Shizuku API来访问受保护的系统资源,例如系统设置。我们使用UriMatcher来匹配传入的URI,并根据请求的类型调用相应的方法来获取相应的值。我们还检查了Shizuku权限,如果权限缺失,则会抛出SecurityException。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值