2011.09.07(4)——— android 跨进程通信之content provider
参考:http://blog.csdn.net/yan8024/article/details/6444368
1、自定义provider 包含两个查询:全名查询和模糊查询
package com.HelloWorld;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import android.content.ContentProvider;import android.content.ContentValues;import android.content.Context;import android.content.UriMatcher;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.net.Uri;import android.os.Environment;public class MyProvider extends ContentProvider { private final static String DB_DIR = "lp"; private final static String DB_NAME = "contacts.db"; private final static String TABLE_NAME = "PRMContacts"; private Context mContext; private SQLiteDatabase db ; private static final String AUTHORITY = "com.helloword.myprovider" ; private static UriMatcher uriMatcher; private static final int ONE = 1 ; private static final int MORE = 2 ; static { // 添加访问ContentProvider的Uri uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, "one" , ONE); uriMatcher.addURI(AUTHORITY, "more/*" , MORE); } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public boolean onCreate() { mContext = getContext(); db = openDatabase(); return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { Cursor cursor = null; System.out.println("query"); switch(uriMatcher.match(uri)){ case ONE: cursor = db.query(TABLE_NAME, projection, selection, selectionArgs, null, null, sortOrder); break; case MORE: String word = uri.getPathSegments().get(1); cursor = db.rawQuery("select * from "+TABLE_NAME+" where displayname like ?", new String[]{word+"%"}); break; default: throw new IllegalArgumentException("无效参数"); } return cursor; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } private SQLiteDatabase openDatabase() { if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){ FileOutputStream fos = null; InputStream is = null; try { String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/"+DB_DIR; // 获得dictionary.db文件的绝对路径 String databaseFilename = path + "/" + DB_NAME; File dir = new File(path); if(!dir.exists()){ dir.mkdir(); } File db = new File(databaseFilename); if(!db.exists()){ fos = new FileOutputStream(db); is = mContext.getResources().openRawResource(R.raw.contacts); byte[] buffer = new byte[1024]; int length = 0; while((length = is.read(buffer))!=-1){ fos.write(buffer, 0, length); } } SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFilename, null); return database; } catch (Exception e){ }finally{ if(fos!=null){ try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if(is!=null){ try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } return null; }}
xml注册:
<receiver android:name=".MyBroadcast" > <intent-filter> <action android:name="com.lp.MyBroadcast"/> </intent-filter> </receiver> <provider android:name=".MyProvider" android:authorities="com.helloword.myprovider" />
权限:
<!-- 在SDCard中创建与删除文件权限 --> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> <!-- 往SDCard写入数据权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、另一个应用调用:
private Button find; private TextView name; private static final String ONE = "content://com.helloword.myprovider/one" ; private static final String MORE = "content://com.helloword.myprovider/more" ;find.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String str = name.getText().toString(); if(str!=null){ //findTelByName(str); findTelsByName(str); } }}); private void findTelByName(String name){ Uri uri = Uri.parse(ONE); Cursor cursor = getContentResolver().query(uri, null, "displayname=?", new String[]{name}, null); String result = "没有找到电话"; if(cursor!=null){ cursor.moveToNext(); result = cursor.getString(cursor.getColumnIndex("telnum")); } Toast.makeText(this, result, 1).show(); } private void findTelsByName(String name){ Uri uri = Uri.parse(MORE+"/"+name); Cursor cursor = getContentResolver().query(uri, null, null, null, null); String result = ""; if(cursor!=null){ while(cursor.moveToNext()){ result += cursor.getString(cursor.getColumnIndex("telnum")); result += ","; } } if(!result.equals("")) Toast.makeText(this, result, 1).show(); }