当前位置: 代码迷 >> Android >> 2011.09.07(四)——— android 跨进程通信之content provider
  详细解决方案

2011.09.07(四)——— android 跨进程通信之content provider

热度:62   发布时间:2016-05-01 18:54:25.0
2011.09.07(4)——— android 跨进程通信之content provider
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();    }


  相关解决方案