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>