Android中使用ContentProvider管理系统资源的实例
ContentProvider管理联系人的实例:
packagecom.android.xiong.getsystemcontentprovidertest; importjava.util.ArrayList; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.content.ContentUris; importandroid.content.ContentValues; importandroid.database.Cursor; importandroid.net.Uri; importandroid.os.Bundle; importandroid.provider.ContactsContract; importandroid.provider.ContactsContract.CommonDataKinds.Email; importandroid.provider.ContactsContract.CommonDataKinds.Phone; importandroid.provider.ContactsContract.CommonDataKinds.StructuredName; importandroid.provider.ContactsContract.Data; importandroid.provider.ContactsContract.RawContacts; importandroid.view.Gravity; importandroid.view.Menu; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.view.ViewGroup; importandroid.widget.AbsListView; importandroid.widget.AbsListView.LayoutParams; importandroid.widget.BaseExpandableListAdapter; importandroid.widget.Button; importandroid.widget.EditText; importandroid.widget.ExpandableListAdapter; importandroid.widget.ExpandableListView; importandroid.widget.TextView; importandroid.widget.Toast; publicclassMainActivityextendsActivity{ privateButtonbt1,bt2; privateExpandableListViewexp1; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt1=(Button)findViewById(R.id.bt1); bt1.setOnClickListener(newLookPresonClick()); bt2=(Button)findViewById(R.id.bt2); bt2.setOnClickListener(newAddPersonClick()); } classAddPersonClickimplementsOnClickListener{ @Override publicvoidonClick(Viewv){ //获取程序界面中的桑文本框 Stringname=((EditText)findViewById(R.id.ed1)).getText() .toString(); Stringphone=((EditText)findViewById(R.id.ed2)).getText() .toString(); Stringemail=((EditText)findViewById(R.id.ed3)).getText() .toString(); //创建一个空的ContentValue ContentValuesvalues=newContentValues(); //向RawContacts.CONTNT_URI执行一个空值插入 //目的是获取系统返回的rawContactId UrirawContactsUri=getContentResolver().insert( RawContacts.CONTENT_URI,values); longrawContactId=ContentUris.parseId(rawContactsUri); values.clear(); values.put(Data.RAW_CONTACT_ID,rawContactId); //设置内容类型 values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE); //设置联系人名字 values.put(StructuredName.GIVEN_NAME,name); //向联系人Uri添加联系人名字 getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI,values); values.clear(); values.put(Data.RAW_CONTACT_ID,rawContactId); values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE); //设置联系人的电话 values.put(Phone.NUMBER,phone); //设置电话类型 values.put(Phone.TYPE,Phone.TYPE_MOBILE); //向联系人电话Uri添加电话号码 getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI,values); values.clear(); values.put(Data.RAW_CONTACT_ID,rawContactId); values.put(Data.MIMETYPE,Email.CONTENT_ITEM_TYPE); //设置联系人的email地址 values.put(Email.DATA,email); //设置email的类型 values.put(Email.TYPE,Email.TYPE_WORK); getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI,values); Toast.makeText(MainActivity.this,"添加联系人信息成功",Toast.LENGTH_LONG) .show(); } } classLookPresonClickimplementsOnClickListener{ @Override publicvoidonClick(Viewv){ //定义两个List来封装系统联系人信息,指定联系人的电话,email等详情 finalArrayList<String>names=newArrayList<String>(); finalArrayList<ArrayList<String>>details=newArrayList<ArrayList<String>>(); //使用ContentResolver查找联系人数据 Cursorcursor=getContentResolver().query( ContactsContract.Contacts.CONTENT_URI,null,null,null, null); //遍历结果获取系统所有联系人信息 while(cursor.moveToNext()){ //获取联系人ID Stringcontactid=cursor.getString(cursor .getColumnIndex(ContactsContract.Contacts._ID)); //获取联系人的名字 Stringname=cursor .getString(cursor .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); names.add(name); //使用ContentResolver查找联系人的电话号码 Cursorphones=getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"=?",newString[]{contactid},null); ArrayList<String>detail=newArrayList<String>(); //遍历查询结果,获取该联系人的多个电话 while(phones.moveToNext()){ //获取查询的结果中的电话号码列 StringphoneNumber=phones .getString(phones .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); detail.add("电话号码是:"+phoneNumber); } phones.close(); //使用ContentResolver查找联系人的E-mail地址 Cursoremails=getContentResolver().query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID +"=?",newString[]{contactid},null); //遍历查询结果,获取该联系人的多个email地址 while(emails.moveToNext()){ //获取查询的结果中email地址中列的数据 StringemailAddress=emails .getString(emails .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); detail.add("email是:"+emailAddress); } emails.close(); details.add(detail); } cursor.close(); //加载result.xml界面布局代表的视图 ViewresultDialog=getLayoutInflater().inflate(R.layout.result, null); exp1=(ExpandableListView)resultDialog.findViewById(R.id.exp1); //创建一个ExpandableListAdapter对象 ExpandableListAdapteradapter=newBaseExpandableListAdapter(){ @Override publicbooleanisChildSelectable(intgroupPosition, intchildPosition){ //TODOAuto-generatedmethodstub returntrue; } @Override publicbooleanhasStableIds(){ //TODOAuto-generatedmethodstub returntrue; } @Override publicViewgetGroupView(intgroupPosition,booleanisExpanded, ViewconvertView,ViewGroupparent){ TextViewtext=getTextVeiw(); text.setText(getGroup(groupPosition).toString()); returntext; } @Override publiclonggetGroupId(intgroupPosition){ //TODOAuto-generatedmethodstub returngroupPosition; } @Override publicintgetGroupCount(){ //TODOAuto-generatedmethodstub returnnames.size(); } @Override publicObjectgetGroup(intgroupPosition){ //TODOAuto-generatedmethodstub returnnames.get(groupPosition); } @Override publicintgetChildrenCount(intgroupPosition){ //TODOAuto-generatedmethodstub returndetails.get(groupPosition).size(); } privateTextViewgetTextVeiw(){ AbsListView.LayoutParamslp=newLayoutParams( ViewGroup.LayoutParams.MATCH_PARENT,64); TextViewtextview=newTextView(MainActivity.this); textview.setLayoutParams(lp); textview.setGravity(Gravity.CENTER_VERTICAL|Gravity.LEFT); textview.setPadding(36,0,0,0); textview.setTextSize(20); returntextview; } @Override publicViewgetChildView(intgroupPosition,intchildPosition, booleanisLastChild,ViewconvertView,ViewGroupparent){ TextViewtextview=getTextVeiw(); textview.setText(getChild(groupPosition,childPosition) .toString()); returntextview; } @Override publiclonggetChildId(intgroupPosition,intchildPosition){ //TODOAuto-generatedmethodstub returnchildPosition; } @Override publicObjectgetChild(intgroupPosition,intchildPosition){ returndetails.get(groupPosition).get(childPosition); } }; exp1.setAdapter(adapter); //使用对话框来显示查询结果 newAlertDialog.Builder(MainActivity.this).setView(resultDialog) .setPositiveButton("确定",null).show(); } } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } }
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <EditText android:id="@+id/ed1" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入联系人姓名"/> <EditText android:id="@+id/ed2" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入联系人电话"/> <EditText android:id="@+id/ed3" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="输入联系人email"/> <Button android:id="@+id/bt2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加联系人信息"/> <Button android:id="@+id/bt1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看联系人"/> </LinearLayout>
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ExpandableListView android:id="@+id/exp1" android:layout_width="match_parent" android:layout_height="wrap_content"> </ExpandableListView> </LinearLayout>
使用ContentProvider管理多媒体内容
Android为多媒体提供的Uri:
1、MediaStore.Audio.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的音频文件
2、MediaStore.Audio.Mdia.INTERNAL_CONTENT_URI:存储在手机内部上的音频文件
3、MediaStore.Images.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的图片文件
4、MediaStore.Images.Mdia.INTERNAL_CONTENT_URI:存储在内部设备上的图片文件
5、MediaStore.Video.Mdia.EXTERNAL_CONTENT_URI:存储在外部设备上的音频文件
6、MediaStore.Video.Mdia.INTERNAL_CONTENT_URI:存储在内部设备上的音频文件
实例:
packagecom.example.mediaprovidertest; importjava.io.IOException; importjava.io.OutputStream; importjava.util.ArrayList; importjava.util.HashMap; importjava.util.List; importjava.util.Map; importandroid.app.Activity; importandroid.app.AlertDialog; importandroid.content.ContentValues; importandroid.database.Cursor; importandroid.graphics.Bitmap; importandroid.graphics.BitmapFactory; importandroid.net.Uri; importandroid.os.Bundle; importandroid.provider.MediaStore.Images.Media; importandroid.view.Menu; importandroid.view.View; importandroid.view.View.OnClickListener; importandroid.widget.AdapterView; importandroid.widget.AdapterView.OnItemClickListener; importandroid.widget.Button; importandroid.widget.ImageView; importandroid.widget.ListView; importandroid.widget.SimpleAdapter; importandroid.widget.TextView; publicclassMainActivityextendsActivity{ privateButtonbt1,bt2; privateListViewlist1; ArrayList<String>names=newArrayList<String>(); ArrayList<String>descs=newArrayList<String>(); ArrayList<String>filenames=newArrayList<String>(); @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); bt1=(Button)findViewById(R.id.bt1); bt2=(Button)findViewById(R.id.bt2); list1=(ListView)findViewById(R.id.list); bt1.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //清空names、desc、fileName集合里原有的数据 names.clear(); descs.clear(); filenames.clear(); //通过ContentResolver查询所有图片信息 Cursorcuros=getContentResolver().query( Media.EXTERNAL_CONTENT_URI,null,null,null,null); while(curos.moveToNext()){ //获取图片显示的名字 Stringname=curos.getString(curos .getColumnIndex(Media.DISPLAY_NAME)); //获取图片的详细信息、 Stringdesc=curos.getString(curos .getColumnIndex(Media.DESCRIPTION)); //将图片名保存的位置数据 byte[]data=curos.getBlob(curos .getColumnIndex(Media.DATA)); //将图片名添加到names集合中 names.add(name); //将图片描述添加到desc集合中 descs.add(desc); //将图片保存路径添加到fileNames集合中 filenames.add(newString(data,0,data.length-1)); } //创建一个List集合的元素是map List<Map<String,Object>>listitems=newArrayList<Map<String,Object>>(); //将names、descs两个集合对象的数据转换到map集合 for(inti=0;i<names.size();i++){ Map<String,Object>listitem=newHashMap<String,Object>(); listitem.put("name",names.get(i)); listitem.put("desc",descs.get(i)); listitems.add(listitem); } SimpleAdaptersimple=newSimpleAdapter(MainActivity.this, listitems,R.layout.items,newString[]{"name", "desc"},newint[]{R.id.txt1,R.id.txt2}); list1.setAdapter(simple); } }); list1.setOnItemClickListener(newOnItemClickListener(){ @Override publicvoidonItemClick(AdapterView<?>arg0,Viewarg1,intarg2, longarg3){ //加载view.xml界面布局代表视图 Viewview=getLayoutInflater().inflate(R.layout.view,null); //获取viewDialog中ImageView组件 ImageViewimage1=(ImageView)view.findViewById(R.id.image1); //设置image显示指定的图片 image1.setImageBitmap(BitmapFactory.decodeFile(filenames .get(arg2))); //使用对话框显示用户单击的图片 newAlertDialog.Builder(MainActivity.this).setView(view) .setPositiveButton("确定",null).show(); } }); bt2.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //创建ContentValues对象,准备插入数据 ContentValuesvalues=newContentValues(); values.put(Media.DISPLAY_NAME,"jinta"); values.put(Media.DESCRIPTION,"金塔"); values.put(Media.MIME_TYPE,"image/jpeg"); //插入数据对应的Uri Uriuri=getContentResolver().insert( Media.EXTERNAL_CONTENT_URI,values); //加载应用程序下的jinta图片 Bitmapbitmap=BitmapFactory.decodeResource( MainActivity.this.getResources(),R.drawable.jinta); OutputStreamos=null; try{ //获取刚插入的数据的Uri对应的输出流 os=getContentResolver().openOutputStream(uri); //将bitmap图片保存到Uri对应的数据节点中 bitmap.compress(Bitmap.CompressFormat.JPEG,100,os); os.close(); }catch(IOExceptionio){ io.printStackTrace(); } } }); } @Override publicbooleanonCreateOptionsMenu(Menumenu){ //Inflatethemenu;thisaddsitemstotheactionbarifitispresent. getMenuInflater().inflate(R.menu.main,menu); returntrue; } }
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity"> <Button android:id="@+id/bt1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查看图片"/> <Button android:id="@+id/bt2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="添加图片"/> <ListView android:id="@+id/list" android:layout_width="match_parent" android:layout_height="wrap_content"></ListView> </LinearLayout>
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/txt1" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/txt2" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout>
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ImageView android:id="@+id/image1" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>