[Android开发]android 跨进程通信之content provider
16lz
2021-01-24
1、自定义provider 包含两个查询:全名查询和模糊查询
Java代码
xml注册:
Java代码
权限:
Java代码
2、另一个应用调用:
Java代码
Java代码
- packagecom.HelloWorld;
- importjava.io.File;
- importjava.io.FileOutputStream;
- importjava.io.IOException;
- importjava.io.InputStream;
- importandroid.content.ContentProvider;
- importandroid.content.ContentValues;
- importandroid.content.Context;
- importandroid.content.UriMatcher;
- importandroid.database.Cursor;
- importandroid.database.sqlite.SQLiteDatabase;
- importandroid.net.Uri;
- importandroid.os.Environment;
- publicclassMyProviderextendsContentProvider{
- privatefinalstaticStringDB_DIR="lp";
- privatefinalstaticStringDB_NAME="contacts.db";
- privatefinalstaticStringTABLE_NAME="PRMContacts";
- privateContextmContext;
- privateSQLiteDatabasedb;
- privatestaticfinalStringAUTHORITY="com.helloword.myprovider";
- privatestaticUriMatcheruriMatcher;
- privatestaticfinalintONE=1;
- privatestaticfinalintMORE=2;
- static
- {
- //添加访问ContentProvider的Uri
- uriMatcher=newUriMatcher(UriMatcher.NO_MATCH);
- uriMatcher.addURI(AUTHORITY,"one",ONE);
- uriMatcher.addURI(AUTHORITY,"more/*",MORE);
- }
- @Override
- publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
- //TODOAuto-generatedmethodstub
- return0;
- }
- @Override
- publicStringgetType(Uriuri){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicUriinsert(Uriuri,ContentValuesvalues){
- //TODOAuto-generatedmethodstub
- returnnull;
- }
- @Override
- publicbooleanonCreate(){
- mContext=getContext();
- db=openDatabase();
- returntrue;
- }
- @Override
- publicCursorquery(Uriuri,String[]projection,Stringselection,String[]selectionArgs,StringsortOrder){
- Cursorcursor=null;
- System.out.println("query");
- switch(uriMatcher.match(uri)){
- caseONE:
- cursor=db.query(TABLE_NAME,projection,selection,selectionArgs,null,null,sortOrder);
- break;
- caseMORE:
- Stringword=uri.getPathSegments().get(1);
- cursor=db.rawQuery("select*from"+TABLE_NAME+"wheredisplaynamelike?",newString[]{word+"%"});
- break;
- default:
- thrownewIllegalArgumentException("无效参数");
- }
- returncursor;
- }
- @Override
- publicintupdate(Uriuri,ContentValuesvalues,Stringselection,String[]selectionArgs){
- //TODOAuto-generatedmethodstub
- return0;
- }
- privateSQLiteDatabaseopenDatabase()
- {
- if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
- FileOutputStreamfos=null;
- InputStreamis=null;
- try
- {
- Stringpath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+DB_DIR;
- //获得dictionary.db文件的绝对路径
- StringdatabaseFilename=path+"/"+DB_NAME;
- Filedir=newFile(path);
- if(!dir.exists()){
- dir.mkdir();
- }
- Filedb=newFile(databaseFilename);
- if(!db.exists()){
- fos=newFileOutputStream(db);
- is=mContext.getResources().openRawResource(R.raw.contacts);
- byte[]buffer=newbyte[1024];
- intlength=0;
- while((length=is.read(buffer))!=-1){
- fos.write(buffer,0,length);
- }
- }
- SQLiteDatabasedatabase=SQLiteDatabase.openOrCreateDatabase(databaseFilename,null);
- returndatabase;
- }
- catch(Exceptione){
- }finally{
- if(fos!=null){
- try{
- fos.close();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- if(is!=null){
- try{
- is.close();
- }catch(IOExceptione){
- //TODOAuto-generatedcatchblock
- e.printStackTrace();
- }
- }
- }
- }
- returnnull;
- }
- }
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); } @Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean onCreate() {mContext = getContext();db = openDatabase();return true;}@Overridepublic 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;}@Overridepublic int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 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 blocke.printStackTrace();} } if(is!=null){ try {is.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();} } } } return null; }}
xml注册:
Java代码
- <receiverandroid:name=".MyBroadcast">
- <intent-filter>
- <actionandroid:name="com.lp.MyBroadcast"/>
- </intent-filter>
- </receiver>
- <providerandroid:name=".MyProvider"android:authorities="com.helloword.myprovider"/>
<receiver android:name=".MyBroadcast" ><intent-filter><action android:name="com.lp.MyBroadcast"/></intent-filter></receiver><provider android:name=".MyProvider" android:authorities="com.helloword.myprovider" />
权限:
Java代码
- <!--在SDCard中创建与删除文件权限-->
- <uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- <!--往SDCard写入数据权限-->
- <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 在SDCard中创建与删除文件权限 --><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><!-- 往SDCard写入数据权限 --><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2、另一个应用调用:
Java代码
- privateButtonfind;
- privateTextViewname;
- privatestaticfinalStringONE="content://com.helloword.myprovider/one";
- privatestaticfinalStringMORE="content://com.helloword.myprovider/more";
- find.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- Stringstr=name.getText().toString();
- if(str!=null){
- //findTelByName(str);
- findTelsByName(str);
- }
- }
- });
- privatevoidfindTelByName(Stringname){
- Uriuri=Uri.parse(ONE);
- Cursorcursor=getContentResolver().query(uri,null,"displayname=?",newString[]{name},null);
- Stringresult="没有找到电话";
- if(cursor!=null){
- cursor.moveToNext();
- result=cursor.getString(cursor.getColumnIndex("telnum"));
- }
- Toast.makeText(this,result,1).show();
- }
- privatevoidfindTelsByName(Stringname){
- Uriuri=Uri.parse(MORE+"/"+name);
- Cursorcursor=getContentResolver().query(uri,null,null,null,null);
- Stringresult="";
- if(cursor!=null){
- while(cursor.moveToNext()){
- result+=cursor.getString(cursor.getColumnIndex("telnum"));
- result+=",";
- }
- }
- if(!result.equals(""))
- Toast.makeText(this,result,1).show();
- }
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() {@Overridepublic 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(); }
更多相关文章
- 如何调用android内置图片,比如menu->add的加号图片,search的放大镜
- RK3288[android 7.1]调试笔记 去掉桌面上的谷歌搜索框
- Android(安卓)—— inflate( )使用
- adb下的tcpdump抓包方法
- qt for android 实现开机自启
- Android培训班(40)
- Android百度地图之显示地图
- Android系列之Android(安卓)命令行手动编译打包详解
- android lambda使用:Retrolambda Plugin