package com.example.weishu.contentprovider_management; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import android.util.Log; /** * content:// * * @author weishu * @date 16/7/11. */ public class StubContentProvider extends ContentProvider { private static final String TAG = "StubContentProvider"; public static final String AUTHORITY = "com.example.weishu.contentprovider_management.StubContentProvider"; @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //noinspection ConstantConditions return getContext().getContentResolver().query(getRealUri(uri), projection, selection, selectionArgs, sortOrder); } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { //noinspection ConstantConditions return getContext().getContentResolver().insert(getRealUri(uri), values); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } /** * 为了使得插件的ContentProvder提供给外部使用,我们需要一个StubProvider做中转; * 如果外部程序需要使用插件系统中插件的ContentProvider,不能直接查询原来的那个uri * 我们对uri做一些手脚,使得插件系统能识别这个uri; * * 这里的处理方式如下: * * 原始查询插件的URI应该为: * content://plugin_auth/path/query * * 如果需要查询插件,需要修改为: * * content://stub_auth/plugin_auth/path/query * * 也就是,我们把插件ContentProvider的信息放在URI的path中保存起来; * 然后在StubProvider中做分发。 * * 当然,也可以使用QueryParamerter,比如: * content://plugin_auth/path/query/ -> content://stub_auth/path/query?plugin=plugin_auth * @param raw 外部查询我们使用的URI * @return 插件真正的URI */ private Uri getRealUri(Uri raw) { String rawAuth = raw.getAuthority(); if (!AUTHORITY.equals(rawAuth)) { Log.w(TAG, "rawAuth:" + rawAuth); } String uriString = raw.toString(); uriString = uriString.replaceAll(rawAuth + '/', ""); Uri newUri = Uri.parse(uriString); Log.i(TAG, "realUri:" + newUri); return newUri; } }