/** * OpenAtlasForAndroid Project * The MIT License (MIT) Copyright (OpenAtlasForAndroid) 2015 Bunny Blue,achellies * <p> * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, modify, * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to the following conditions: * <p> * The above copyright notice and this permission notice shall be included in all copies * or substantial portions of the Software. * <p> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE * FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * @author BunnyBlue **/ package com.openatlas.boot; import android.content.ContentProvider; import android.content.ContentValues; import android.database.Cursor; import android.net.Uri; import java.lang.reflect.Constructor; import java.lang.reflect.Field; /**** * Provider需要做一些处理,因为ContentProvider在Application onCreate之前初始化,so,做一个桥<br> * 告诉系统这个ContentProvider初始化完毕,都可以用了,实际上还没完成,只是一个空实现,当需要的类能加载的时候对正常的类进行实例化 * @author BunnyBlue * * *****/ public class ProviderProxy extends ContentProvider { ContentProvider mContentProvider; String mTargetProvider; /** * @param mTargetProvider 真正的ContentProvider类名 */ public ProviderProxy(String mTargetProvider) { this.mTargetProvider = mTargetProvider; } /*****验证ContentProvider实现类是否加载*****/ protected ContentProvider getContentProvider() { if (this.mContentProvider != null) { return this.mContentProvider; } try { Class<?> loadClass = Globals.getClassLoader().loadClass(mTargetProvider); if (loadClass != null) { Constructor<?> constructor = loadClass.getConstructor(); constructor.setAccessible(true); this.mContentProvider = (ContentProvider) constructor.newInstance(); Field declaredField = ContentProvider.class.getDeclaredField("mContext"); declaredField.setAccessible(true); declaredField.set(this.mContentProvider, getContext()); declaredField = ContentProvider.class.getDeclaredField("mReadPermission"); declaredField.setAccessible(true); declaredField.set(this.mContentProvider, getReadPermission()); declaredField = ContentProvider.class.getDeclaredField("mWritePermission"); declaredField.setAccessible(true); declaredField.set(this.mContentProvider, getWritePermission()); declaredField = ContentProvider.class.getDeclaredField("mPathPermissions"); declaredField.setAccessible(true); declaredField.set(this.mContentProvider, getPathPermissions()); this.mContentProvider.onCreate(); return this.mContentProvider; } } catch (Exception e) { e.printStackTrace(); } return null; } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { ContentProvider mContentProvider = getContentProvider(); if (mContentProvider != null) { return mContentProvider.query(uri, projection, selection, selectionArgs, sortOrder); } return null; } @Override public String getType(Uri uri) { ContentProvider mContentProvider = getContentProvider(); if (mContentProvider != null) { return mContentProvider.getType(uri); } return null; } @Override public Uri insert(Uri uri, ContentValues contentValues) { ContentProvider mContentProvider = getContentProvider(); if (mContentProvider != null) { return mContentProvider.insert(uri, contentValues); } return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { ContentProvider mContentProvider = getContentProvider(); if (mContentProvider != null) { return mContentProvider.delete(uri, selection, selectionArgs); } return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { ContentProvider mContentProvider = getContentProvider(); if (mContentProvider != null) { return mContentProvider.update(uri, values, selection, selectionArgs); } return 0; } }