android 管理系统 案例,Android中使用ContentProvider管理系统资源的实例

这个示例展示了如何在Android应用中使用ContentProvider来管理联系人信息,包括添加新联系人和查看现有联系人的详细信息。同时,也提供了查询和添加多媒体内容(如图片)的示例,利用MediaStore Uri操作外部存储的音频和图片文件。
摘要由CSDN通过智能技术生成

ContentProvider管理联系人的实例:

package com.android.xiong.getsystemcontentprovidertest;

import java.util.ArrayList;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.ContentUris;

import android.content.ContentValues;

import android.database.Cursor;

import android.net.Uri;

import android.os.Bundle;

import android.provider.ContactsContract;

import android.provider.ContactsContract.CommonDataKinds.Email;

import android.provider.ContactsContract.CommonDataKinds.Phone;

import android.provider.ContactsContract.CommonDataKinds.StructuredName;

import android.provider.ContactsContract.Data;

import android.provider.ContactsContract.RawContacts;

import android.view.Gravity;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.AbsListView.LayoutParams;

import android.widget.BaseExpandableListAdapter;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ExpandableListAdapter;

import android.widget.ExpandableListView;

import android.widget.TextView;

import android.widget.Toast;

public class MainActivity extends Activity {

private Button bt1, bt2;

private ExpandableListView exp1;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

bt1 = (Button) findViewById(R.id.bt1);

bt1.setOnClickListener(new LookPresonClick());

bt2 = (Button) findViewById(R.id.bt2);

bt2.setOnClickListener(new AddPersonClick());

}

class AddPersonClick implements OnClickListener {

@Override

public void onClick(View v) {

// 获取程序界面中的桑文本框

String name = ((EditText) findViewById(R.id.ed1)).getText()

.toString();

String phone = ((EditText) findViewById(R.id.ed2)).getText()

.toString();

String email = ((EditText) findViewById(R.id.ed3)).getText()

.toString();

// 创建一个空的ContentValue

ContentValues values = new ContentValues();

// 向RawContacts.CONTNT_URI执行一个空值插入

// 目的是获取系统返回的rawContactId

Uri rawContactsUri = getContentResolver().insert(

RawContacts.CONTENT_URI, values);

long rawContactId = 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();

}

}

class LookPresonClick implements OnClickListener {

@Override

public void onClick(View v) {

// 定义两个List来封装系统联系人信息,指定联系人的电话,email等详情

final ArrayList names = new ArrayList();

final ArrayList> details = new ArrayList>();

// 使用ContentResolver查找联系人数据

Cursor cursor = getContentResolver().query(

ContactsContract.Contacts.CONTENT_URI, null, null, null,

null);

// 遍历结果 获取系统所有联系人信息

while (cursor.moveToNext()) {

// 获取联系人ID

String contactid = cursor.getString(cursor

.getColumnIndex(ContactsContract.Contacts._ID));

// 获取联系人的名字

String name = cursor

.getString(cursor

.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

names.add(name);

// 使用ContentResolver查找联系人的电话号码

Cursor phones = getContentResolver().query(

ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

null,

ContactsContract.CommonDataKinds.Phone.CONTACT_ID

+ "= ?", new String[] { contactid }, null);

ArrayList detail = new ArrayList();

// 遍历查询结果,获取该联系人的多个电话

while (phones.moveToNext()) {

// 获取查询的结果中的电话号码列

String phoneNumber = phones

.getString(phones

.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

detail.add("电话号码是:" + phoneNumber);

}

phones.close();

// 使用ContentResolver查找联系人的E-mail地址

Cursor emails = getContentResolver().query(

ContactsContract.CommonDataKinds.Email.CONTENT_URI,

null,

ContactsContract.CommonDataKinds.Email.CONTACT_ID

+ " =?", new String[] { contactid }, null);

// 遍历查询结果,获取该联系人的多个email地址

while (emails.moveToNext()) {

// 获取查询的结果中email地址中列的数据

String emailAddress = emails

.getString(emails

.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

detail.add("email是:" + emailAddress);

}

emails.close();

details.add(detail);

}

cursor.close();

// 加载result.xml界面布局代表的视图

View resultDialog = getLayoutInflater().inflate(R.layout.result,

null);

exp1 = (ExpandableListView) resultDialog.findViewById(R.id.exp1);

// 创建一个ExpandableListAdapter对象

ExpandableListAdapter adapter = new BaseExpandableListAdapter() {

@Override

public boolean isChildSelectable(int groupPosition,

int childPosition) {

// TODO Auto-generated method stub

return true;

}

@Override

public boolean hasStableIds() {

// TODO Auto-generated method stub

return true;

}

@Override

public View getGroupView(int groupPosition, boolean isExpanded,

View convertView, ViewGroup parent) {

TextView text = getTextVeiw();

text.setText(getGroup(groupPosition).toString());

return text;

}

@Override

public long getGroupId(int groupPosition) {

// TODO Auto-generated method stub

return groupPosition;

}

@Override

public int getGroupCount() {

// TODO Auto-generated method stub

return names.size();

}

@Override

public Object getGroup(int groupPosition) {

// TODO Auto-generated method stub

return names.get(groupPosition);

}

@Override

public int getChildrenCount(int groupPosition) {

// TODO Auto-generated method stub

return details.get(groupPosition).size();

}

private TextView getTextVeiw() {

AbsListView.LayoutParams lp = new LayoutParams(

ViewGroup.LayoutParams.MATCH_PARENT, 64);

TextView textview = new TextView(MainActivity.this);

textview.setLayoutParams(lp);

textview.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);

textview.setPadding(36, 0, 0, 0);

textview.setTextSize(20);

return textview;

}

@Override

public View getChildView(int groupPosition, int childPosition,

boolean isLastChild, View convertView, ViewGroup parent) {

TextView textview = getTextVeiw();

textview.setText(getChild(groupPosition, childPosition)

.toString());

return textview;

}

@Override

public long getChildId(int groupPosition, int childPosition) {

// TODO Auto-generated method stub

return childPosition;

}

@Override

public Object getChild(int groupPosition, int childPosition) {

return details.get(groupPosition).get(childPosition);

}

};

exp1.setAdapter(adapter);

// 使用对话框来显示查询结果

new AlertDialog.Builder(MainActivity.this).setView(resultDialog)

.setPositiveButton("确定", null).show();

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

android:id="@+id/ed1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="输入联系人姓名"/>

android:id="@+id/ed2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="输入联系人电话"/>

android:id="@+id/ed3"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="输入联系人email"/>

android:id="@+id/bt2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="添加联系人信息"/>

android:id="@+id/bt1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="查看联系人" />

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/exp1"

android:layout_width="match_parent"

android:layout_height="wrap_content" >

使用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:存储在内部设备上的音频文件

实例:

package com.example.mediaprovidertest;

import java.io.IOException;

import java.io.OutputStream;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import android.app.Activity;

import android.app.AlertDialog;

import android.content.ContentValues;

import android.database.Cursor;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.net.Uri;

import android.os.Bundle;

import android.provider.MediaStore.Images.Media;

import android.view.Menu;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.Button;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.SimpleAdapter;

import android.widget.TextView;

public class MainActivity extends Activity {

private Button bt1, bt2;

private ListView list1;

ArrayList names = new ArrayList();

ArrayList descs = new ArrayList();

ArrayList filenames = new ArrayList();

@Override

protected void onCreate(Bundle savedInstanceState) {

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(new OnClickListener() {

@Override

public void onClick(View v) {

// 清空names、desc、fileName集合里原有的数据

names.clear();

descs.clear();

filenames.clear();

// 通过ContentResolver查询所有图片信息

Cursor curos = getContentResolver().query(

Media.EXTERNAL_CONTENT_URI, null, null, null, null);

while (curos.moveToNext()) {

// 获取图片显示的名字

String name = curos.getString(curos

.getColumnIndex(Media.DISPLAY_NAME));

// 获取图片的详细信息、

String desc = 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(new String(data, 0, data.length - 1));

}

// 创建一个List集合的元素是map

List> listitems = new ArrayList>();

// 将names、descs两个集合对象的数据转换到map集合

for (int i = 0; i < names.size(); i++) {

Map listitem = new HashMap();

listitem.put("name", names.get(i));

listitem.put("desc", descs.get(i));

listitems.add(listitem);

}

SimpleAdapter simple = new SimpleAdapter(MainActivity.this,

listitems, R.layout.items, new String[] { "name",

"desc" }, new int[] { R.id.txt1, R.id.txt2 });

list1.setAdapter(simple);

}

});

list1.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView> arg0, View arg1, int arg2,

long arg3) {

// 加载view.xml界面布局代表视图

View view = getLayoutInflater().inflate(R.layout.view, null);

// 获取viewDialog中ImageView组件

ImageView image1 = (ImageView) view.findViewById(R.id.image1);

// 设置image显示指定的图片

image1.setImageBitmap(BitmapFactory.decodeFile(filenames

.get(arg2)));

// 使用对话框显示用户单击的图片

new AlertDialog.Builder(MainActivity.this).setView(view)

.setPositiveButton("确定", null).show();

}

});

bt2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 创建ContentValues对象,准备插入数据

ContentValues values = new ContentValues();

values.put(Media.DISPLAY_NAME, "jinta");

values.put(Media.DESCRIPTION, "金塔");

values.put(Media.MIME_TYPE, "image/jpeg");

// 插入数据对应的Uri

Uri uri = getContentResolver().insert(

Media.EXTERNAL_CONTENT_URI, values);

// 加载应用程序下的jinta图片

Bitmap bitmap = BitmapFactory.decodeResource(

MainActivity.this.getResources(), R.drawable.jinta);

OutputStream os = null;

try {

// 获取刚插入的数据的Uri对应的输出流

os = getContentResolver().openOutputStream(uri);

// 将bitmap图片保存到Uri对应的数据节点中

bitmap.compress(Bitmap.CompressFormat.JPEG, 100, os);

os.close();

} catch (IOException io) {

io.printStackTrace();

}

}

});

}

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.main, menu);

return true;

}

}

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical"

tools:context=".MainActivity" >

android:id="@+id/bt1"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="查看图片"/>

android:id="@+id/bt2"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="添加图片"/>

android:id="@+id/list"

android:layout_width="match_parent"

android:layout_height="wrap_content">

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/txt1"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

android:id="@+id/txt2"

android:layout_width="match_parent"

android:layout_height="wrap_content"/>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/image1"

android:layout_width="match_parent"

android:layout_height="match_parent" />

### 回答1: 我们可以用AndroidContentProvider来实现一个联系人应用,比如我们可以使用ContentProvider来访问系统的联系人数据库,并且可以添加、删除或者更新联系人信息。我们可以这样实现:1.定义ContentProvider:public class ContactProvider extends ContentProvider { @Override public boolean onCreate() { // 初始化ContentProvider } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 查询联系人 } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // 删除联系人 } ### 回答2: 案例:音乐播放器 1. 首先,我们需要创建一个继承自ContentProvider的类,该类将扮演音乐播放器的数据提供者的角色。我们可以命名为MusicProvider。 2. 在MusicProvider,我们需要定义一些常量来表示提供的数据的URI、表名等信息。例如,我们可以定义一个URI来表示音乐列表,另一个URI来表示当前播放的音乐等。 3. 在MusicProvider,我们还需要定义一些数据库操作所需的方法,例如查询、插入、更新和删除。这些方法将根据接收到的URI来执行相应的操作,并返回操作的结果。 4. 在MusicProvider,我们需要创建一个SQLiteOpenHelper实例来管理数据库的创建和升级。通过重写onCreate方法,我们可以在数据库第一次创建时执行一些初始化操作,例如创建音乐表并插入一些初始数据。 5. 在MusicProvider,我们还需要重写getType方法来返回所提供数据的MIME类型。这将告诉Android系统该如何处理访问该数据的请求。 6. 在完成MusicProvider的编写后,我们可以在应用的其他组件使用ContentResolver来和MusicProvider进行交互。通过使用ContentResolver的query、insert、update和delete方法,我们可以向MusicProvider查询、插入、更新和删除数据。 7. 例如,在应用的播放界面,我们可以使用ContentResolver来查询当前播放的音乐信息,并将其显示在界面上。 8. 同样地,在应用的音乐列表界面,我们可以使用ContentResolver来查询音乐列表,并将结果显示在列表。 通过将音乐播放器的数据封装为ContentProvider,我们可以方便地实现数据的共享和访问。不同的应用程序可以通过ContentResolver来访问并操作MusicProvider提供的音乐数据,实现数据的共享和协同工作。此外,通过ContentProvider,我们还可以在不同的应用程序之间实现数据的共享和交互,例如将一个应用的音乐列表分享给其他应用来播放。 ### 回答3: Android ContentProviderAndroid的一种组件,用于在不同应用之间共享数据。一个典型的ContentProvider案例是实现一个联系人的管理应用,它可以让用户查看、添加和编辑联系人信息。 首先,需要创建一个ContentProvider类,继承自android.content.ContentProvider,并实现其的几个关键方法,如onCreate、query、insert、update和delete等。在这个联系人管理应用,可以定义一个ContactsProvider类来实现这些方法。 然后,在AndroidManifest.xml文件注册这个ContentProvider,声明相应的权限和数据表。 在ContactsProvider,可以定义联系人的数据库表结构,并在onCreate方法创建该数据库。可以使用SQLiteOpenHelper类来帮助管理数据库的创建、更新和访问。 query方法用于查询联系人数据,可以通过Uri参数指定需要查询的数据。可以使用ContentResolver来调用这个方法,并在回调方法处理查询结果。 insert方法用于插入新的联系人数据,可以通过Uri参数指定插入的位置。也需要使用ContentResolver来调用这个方法,并在回调方法处理插入结果。 update方法用于更新联系人数据,可以通过Uri参数指定需要更新的数据。同样,需要使用ContentResolver来调用这个方法,并在回调方法处理更新结果。 delete方法用于删除联系人数据,可以通过Uri参数指定需要删除的数据。需要使用ContentResolver来调用这个方法,并在回调方法处理删除结果。 通过这个联系人管理应用的ContentProvider,其他应用可以通过ContentResolver访问和修改联系人数据。这样,不同的应用程序可以共享同一个联系人数据库,实现联系人数据的统一管理。 总之,Android ContentProvider提供了一种机制,让不同的应用程序可以共享数据。通过上述联系人管理应用的案例,可以更好地理解和使用ContentProvider
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值