contentProvider在电话联系人中应用

1、手机中系统应用都提供了contentProvider方法,用于跨应用调用数据,电话联系人常用类ContactsContract.Contacts   主程序如下

package com.jackie.contactsproject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MyDemo extends Activity {
	private ListView contactsList = null;
	private Cursor result = null;
	private List<Map<String, Object>> contacts = null;
	private SimpleAdapter simple = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.main);
		this.contactsList = (ListView) super.findViewById(R.id.contactsList);
		this.result = super.getContentResolver().query(
				ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
		MyDemo.this.startManagingCursor(this.result);
		contacts = new ArrayList<Map<String, Object>>();
		for (this.result.moveToFirst(); !this.result.isAfterLast(); this.result
				.moveToNext()) {
			Map<String, Object> contact = new HashMap<String, Object>();
			contact.put("_id", this.result.getInt(this.result
					.getColumnIndex(ContactsContract.Contacts._ID)));
			contact.put("name", this.result.getString(this.result
					.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
			contacts.add(contact);
		}
		simple = new SimpleAdapter(MyDemo.this, this.contacts,
				R.layout.contacts, new String[] { "_id", "name" }, new int[] {
						R.id._id, R.id.name });
		this.contactsList.setAdapter(this.simple);
		super.registerForContextMenu(this.contactsList);
	}

	@Override
	public boolean onContextItemSelected(MenuItem item) {
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
				.getMenuInfo();
		int position = info.position; // 取得操作的位置
		String contactsId = this.contacts.get(position).get("_id").toString();
		switch (item.getItemId()) { // 经行菜单的操作
		case Menu.FIRST + 1: // 查看详情
			String phoneSelection = ContactsContract.CommonDataKinds.Phone.CONTACT_ID
					+ "=?";
			String[] phoneSelectionArgs = new String[] { contactsId };
			Cursor c = super.getContentResolver().query(
					ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,            //管理联系人的手机号码的uri
					phoneSelection, phoneSelectionArgs, null);
			StringBuffer buf = new StringBuffer();
			buf.append("电话号码是:");
			for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
				buf.append(
						c.getString(c
								.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)))
						.append("、");
			}
			Toast.makeText(this, buf, Toast.LENGTH_SHORT).show();
			break;
		case Menu.FIRST + 2: // 删除
			super.getContentResolver().delete(
					Uri.withAppendedPath(
							ContactsContract.Contacts.CONTENT_URI,     //管理联系人的uri   与手机号码的uri有区别
							contactsId), null, null);
		this.contacts.remove(position);  //删除集合数据项
		this.simple.notifyDataSetChanged(); //通知改变
		Toast.makeText(this, "数据已删除!", Toast.LENGTH_SHORT).show();
			break;

		}

		return super.onContextItemSelected(item);
	}

	@Override
	public void onCreateContextMenu(ContextMenu menu, View v,
			ContextMenuInfo menuInfo) { // 创建上下文菜单
		super.onCreateContextMenu(menu, v, menuInfo);
		menu.setHeaderTitle("联系人操作");
		menu.add(menu.NONE, menu.FIRST + 1, 1, "查看详情");
		menu.add(menu.NONE, menu.FIRST + 2, 2, "删除信息");
	}

}

布局文件如下main.xml和contacts.xml

<LinearLayout xmlns: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=".MyDemo" >

    <TextView
        android:id="@+id/mainInfo"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="60px"
        android:text="联系人列表" />
    <ListView 
        android:id="@+id/contactsList"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>


<TableLayout xmlns: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"
    tools:context=".MyDemo" >
    <TableRow >
    <TextView
        android:id="@+id/_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:textSize="40px"
            />
    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="20dp"
        android:textSize="40px"/>
    </TableRow>
</TableLayout>

2、利用contentProvider取得通话记录 主程序如下
package com.jackie.callsproject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MyDemo extends Activity {
	private ListView callList = null;
	private Cursor result = null;
	private SimpleAdapter simple = null;
	private List<Map<String, Object>> calls = null;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.main);
		this.callList = (ListView) super.findViewById(R.id.callList);
		this.result = super.getContentResolver().query(
				CallLog.Calls.CONTENT_URI, null, null, null, null);
		System.out.println("******"+this.result.getCount());
		this.startManagingCursor(this.result);
		this.calls = new ArrayList<Map<String, Object>>();
		for (this.result.moveToFirst(); !this.result.isAfterLast(); this.result
				.moveToNext()) {
			Map<String, Object> call = new HashMap<String, Object>();
			call.put("_id", this.result.getInt(this.result
					.getColumnIndex(CallLog.Calls._ID)));
			String tempName = this.result.getString(this.result
					.getColumnIndex(CallLog.Calls.CACHED_NAME));
			if (tempName == null || "".equals(tempName)) {
				tempName = "未知";
			}
			call.put("name", tempName);
			call.put("number", this.result.getString(this.result
					.getColumnIndex(CallLog.Calls.NUMBER)));
			calls.add(call);
		}
		this.simple = new SimpleAdapter(this, this.calls, R.layout.calls,
				new String[] { "_id", "name", "number" }, new int[] { R.id._id,
						R.id.name, R.id.number });
		this.callList.setAdapter(this.simple);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.my_demo, menu);
		return true;
	}
}
Cursor本来就是集合,再进行集合取值、赋值,设置适配器很麻烦,现提供了SimpleCursorAdapter类可以对Cursor进行封装,并直接用于显示

package com.jackie.callsproject;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.view.Menu;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;

public class MyDemo extends Activity {
	private ListView callList = null;
	private Cursor result = null;
    private ListAdapter listAdapter=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.main);
		this.callList = (ListView) super.findViewById(R.id.callList);
		this.result = super.getContentResolver().query(
				CallLog.Calls.CONTENT_URI, null, null, null, null);
		System.out.println("******"+this.result.getCount());
		this.startManagingCursor(this.result);
		String[] calls=new String[]{CallLog.Calls._ID,CallLog.Calls.CACHED_NAME,CallLog.Calls.NUMBER};
		int[] entries=new int[]{R.id._id,R.id.name,R.id.number};
		this.listAdapter=new SimpleCursorAdapter(this,R.layout.calls,this.result,calls,entries);
		this.callList.setAdapter(this.listAdapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.my_demo, menu);
		return true;
	}

}

ContentProvider可以将一个应用程序的数据操作交给外部处理


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ContentProviderAndroid用于管理数据的一种机制,它可以将数据存储在SQLite数据库、文件系统或者其他任何数据源,并提供给其他应用程序进行访问。在Android联系人信息也是通过ContentProvider来管理的。 Android系统提供了一个ContactsProvider来管理联系人信息,它提供了一系列API来访问和操作联系人信息。应用程序可以使用这些API来读取、添加、删除和更新联系人信息。 在使用ContactsProvider时,需要先获取一个ContentResolver对象,然后调用它的query、insert、delete和update等方法来访问和操作联系人信息。例如,可以使用以下代码获取所有联系人的姓名和电话号码: ``` ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)); Cursor phoneCursor = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id, null, null); while (phoneCursor.moveToNext()) { String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); } phoneCursor.close(); } cursor.close(); ``` 这段代码会遍历所有联系人,并输出它们的姓名和电话号码。当然,还可以使用其他API来添加、删除和更新联系人信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值