ContentProvider的自定义及SMS和CONTACTS的内容提供者
来源:互联网 发布:linux spi驱动移植 编辑:程序博客网 时间:2024/05/17 12:02
1.自定义内容提供者
首先创建extends ContentProvider的类
package com.txs.db;import android.content.ContentProvider;import android.content.ContentValues;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;/** * 内容提供者 后门程序,提供私有的数据给别的应用程序,默认都是空实现. */public class BankDBBackdoor extends ContentProvider { public static final int SUCCESS = 1; /** * 创建一个保安,检查uri的规则,如果uri匹配失败 返回-1 */ static UriMatcher mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH); static { mUriMatcher.addURI("com.txs.db", "account", SUCCESS); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { int code = mUriMatcher.match(uri); if (code == SUCCESS) { System.out.println("delete 删除数据"); MyDBOpenHelper helper = new MyDBOpenHelper(getContext()); SQLiteDatabase db = helper.getWritableDatabase(); db.delete("account",selection , selectionArgs); //利用内容提供者的解析器,通知内容观察者数据发生了变化 getContext().getContentResolver().notifyChange(uri, null); }else{ throw new IllegalArgumentException("口令 不正确,滚犊子"); } return 0; } @Override public String getType(Uri uri) { return null; } @Override public Uri insert(Uri uri, ContentValues values) { int code = mUriMatcher.match(uri); if (code == SUCCESS) { System.out.println("insert 添加数据"); MyDBOpenHelper helper = new MyDBOpenHelper(getContext()); SQLiteDatabase db = helper.getWritableDatabase(); db.insert("account", null, values); //利用内容提供者的解析器,通知内容观察者数据发生了变化 getContext().getContentResolver().notifyChange(uri, null); }else{ throw new IllegalArgumentException("口令 不正确,滚犊子"); } return null; } @Override public boolean onCreate() { return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { int code = mUriMatcher.match(uri); if (code == SUCCESS) { System.out.println("query 查询数据"); MyDBOpenHelper helper = new MyDBOpenHelper(getContext()); SQLiteDatabase db = helper.getReadableDatabase(); return db.query("account", projection, selection, selectionArgs, null, null, sortOrder); }else{ throw new IllegalArgumentException("口令 不正确,滚犊子"); } } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { int code = mUriMatcher.match(uri); if (code == SUCCESS) { System.out.println("update 更新数据"); MyDBOpenHelper helper = new MyDBOpenHelper(getContext()); SQLiteDatabase db = helper.getWritableDatabase(); db.update("account", values, selection, selectionArgs); //利用内容提供者的解析器,通知内容观察者数据发生了变化 getContext().getContentResolver().notifyChange(uri, null); }else{ throw new IllegalArgumentException("口令 不正确,滚犊子"); } return 0; }}
ManiFest清单注册内容提供者
<provider android:name="com.txs.db.BankDBBackdoor" android:authorities="com.txs.db" android:exported="true" > </provider>
使用contentRsolver解析contentProvider
ContentResolver resolver = getContentResolver(); Uri uri = Uri.parse("content://com.txs.db/account");//和清单文件中定义的主机名保持一致
SMS通过contentProvider获取数据
Uri uri = Uri.parse("content://sms");//全部的短信 ContentResolver resolver = getContentResolver(); ContentValues values = new ContentValues(); values.put("address", "110"); values.put("date", System.currentTimeMillis()); values.put("type", 1); values.put("body", "恭喜您被评为见义勇为好市民,敢于扶老太太"); resolver.insert(uri, values);
Contacts通过contentProvider获取数据
public static List<ContactInfo> getAllContactInfos(Context context) { List<ContactInfo> infos = new ArrayList<ContactInfo>(); ContentResolver resolver = context.getContentResolver(); // 查询raw_contact表 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); Uri datauri = Uri.parse("content://com.android.contacts/data"); Cursor cursor = resolver.query(uri, new String[] { "contact_id" }, null, null, null); while (cursor.moveToNext()) { String id = cursor.getString(0); if (id != null) { ContactInfo info = new ContactInfo(); // 查询data表 Cursor datacursor = resolver.query(datauri, new String[] { "data1", "mimetype" }, "raw_contact_id=?", new String[] { id }, null); while (datacursor.moveToNext()) { String data1 = datacursor.getString(0); String mimetype = datacursor.getString(1); if ("vnd.android.cursor.item/name".equals(mimetype)) { info.setName(data1); } else if ("vnd.android.cursor.item/im".equals(mimetype)) { info.setQq(data1); } else if ("vnd.android.cursor.item/email_v2" .equals(mimetype)) { info.setEmail(data1); } else if ("vnd.android.cursor.item/phone_v2" .equals(mimetype)) { info.setPhone(data1); } } datacursor.close(); infos.add(info); } } cursor.close(); return infos; }
其他人的总结:{
二、Uri类简介
Uri代表了要操作的数据,Uri主要包含了两部分信息
①需要操作的ContentProvider
②对ContentProvider中的什么数据进行操作
组成部分
①scheme:ContentProvider的scheme已经由Android所规定为content://
②主机名(Authority):用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。建议为公司域名,保持唯一性
③路径(path):可以用来表示我们要操作的数据,路径的构建应根据业务而定:
要操作person表中id为10的记录
content://cn.xyCompany.providers.personProvider/person/10
要操作person表中id为10的记录的name字段
content://cn.xyCompany.providers.personProvider/person/10/name
要操作person表中的所有记录
content://cn.xyCompany.providers.personProvider/person
要操作的数据不一定来自数据库,也可以是文件等他存储方式,如要操作xml文件中user节点下的name节点
content://cn.xyCompany.providers.personProvider/person/10/name
把一个字符串转换成Uri,可以使用Uri类中的parse()方法
Uri uri = Uri.parse(“content://cn.xyCompany.providers.personProvider/person”)
三、UriMatcher、ContentUris和ContentResolver简介
Uri代表了要操作的数据,所以经常需要解析Uri,并从Uri中获取数据。Android系统提供了两个用于操作Uri的工具类,分别为UriMatcher 和ContentUris。掌握它们的使用会便于我们的开发工作。
UriMatcher
用于匹配Uri
①把需要匹配Uri路径全部给注册上
// 常量UriMatcher.NO_MATCH表示不匹配任何路径的返回码(-1)。
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
// 若match()方法匹配content://cn.xyCompany.providers.personProvider/person路径则返回匹配码为1
uriMatcher.addURI(“content://cn.xyCompany.providers.personProvider”,”person”, 1);
// 若match()方法匹配content://cn.xyCompany.providers.personProvider/person/10路径则返回匹配码为2
uriMatcher.addURI(“content://cn.xyCompany.providers.personProvider”,”person/#”, 1);
②注册完需要匹配的Uri后,就可以使用uriMatcher.match(uri)方法对输入的Uri进行匹配
ContentUris
ContentUris是对URI的操作类,其中的withAppendedId(uri, id)用于为路径加上ID部分,parseId(uri)方法用于从路径中获取ID部分方法很实用。
Uri insertUri = Uri.parse(“content://cn.xyCompany.providers.personProvider/person” + id);等价于
Uri insertUri = ContentUris.withAppendedId(uri, id);
ContentResolver
当外部应用需要对ContentProvider中的数据进行添加、删除、修改和查询操作时,可以使用ContentResolver 类来完成。要获取ContentResolver 对象,可以使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法来操作数据。
}
- ContentProvider的自定义及SMS和CONTACTS的内容提供者
- contentprovider 自定义内容提供者
- 自定义ContentProvider内容提供者
- 内容提供者,ContentProvider的使用
- ContentProvider内容提供者的使用
- 内容提供者ContentProvider和内容观察者ContentObserver的使用
- Android ContentProvider(内容提供者{模拟底层})和Contentresolver(内容接受者{实现对ContentProvider数据的修改})
- 监听内容提供者ContentProvider的数据变化
- anroid下的内容提供者:ContentProvider
- Android中内容提供者ContentProvider的使用
- 内容提供者ContentProvider的基本使用
- 监听内容提供者ContentProvider的数据变化
- 内容提供者ContentProvider的使用详解
- 内容提供者ContentProvider的基本使用
- 内容提供者ContentProvider的基本使用
- Android中内容提供者ContentProvider的详解
- Android 内容提供者ContentProvider的使用
- 文章标题android 的ContentProvider内容提供者
- a point worth noting is that 的理解
- 整人
- [Android随笔]BroadcastReceiver广播机制
- Android APK调用mongoose
- WAMPServer集成环境安装
- ContentProvider的自定义及SMS和CONTACTS的内容提供者
- hdu5423 Rikka with Tree(DFS)
- DataStructure-8.3-散列表的查找技术
- zoj3811 Untrusted Patrol bfs
- Opencv多通道图像混合
- 在matlab下测试libsvm工具箱
- Android studio配置使用GreenDao
- 从DT到Random Forest、GBDT
- Opencv多通道图像混合-滚动条