`
iaiai
  • 浏览: 2145008 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android 联系人选择Widget

阅读更多
先看一下目录结构:


AndroidManifest.xml配置文件:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.iaiai.activity" android:versionCode="1"
	android:versionName="1.0">
	<uses-sdk android:minSdkVersion="8" />

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<activity android:name="ContactSelectorWidget"
			android:label="@string/contact_title">
			<intent-filter>
				<action android:name="android.intent.action.MAIN" />
				<category android:name="android.intent.category.LAUNCHER" />
			</intent-filter>
		</activity>
	</application>
	<!-- 读取联系人 -->
	<uses-permission android:name="android.permission.READ_CONTACTS" />
	<!-- 写入联系人 -->
	<uses-permission android:name="android.permission.WRITE_CONTACTS" />
	<!-- 在SD卡中创建文件与删除文件权限 -->
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
	<!-- 往SD卡中写入数据权限 -->
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<!-- 电话拨号 -->
	<uses-permission android:name="android.permission.CALL_PHONE" />
	<!-- 访问网络 -->
	<uses-permission android:name="android.permission.INTERNET" />
	<!-- 访问Wi-Fi网络 -->
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>

values/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">iaiai - Contact</string>
    <string name="contact_title">iaiai - Contact</string>
</resources>

values-zh-rCN/strings.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">丸子联系人</string>
    <string name="contact_title">丸子联系人</string>
</resources>

contact.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="horizontal" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<ListView android:layout_width="fill_parent"
		android:layout_height="wrap_content" android:id="@+id/contactListView">
	</ListView>
</LinearLayout>

contact_list.xml布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="wrap_content" android:id="@+id/contactItems"
	android:paddingBottom="5dip" android:paddingLeft="12dip"
	android:paddingTop="5dip" android:paddingRight="12dip">
	<ImageView android:id="@+id/contact_img"
		android:layout_width="wrap_content" android:layout_height="wrap_content"
		android:layout_alignParentLeft="true"></ImageView>
	<TextView android:layout_height="wrap_content"
		android:layout_width="wrap_content" android:id="@+id/contact_name"
		android:textSize="20dip" android:paddingTop="12px"
		android:layout_marginLeft="70px">
	</TextView>
	<CheckBox android:id="@+id/contact_checkbox"
		android:layout_width="wrap_content" android:layout_height="wrap_content"
		android:layout_alignParentRight="true" android:focusable="false"></CheckBox>
</RelativeLayout>

ContactSelectorWidget.java类:
package com.iaiai.activity;

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

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;
import android.widget.Toast;

import com.iaiai.activity.adapter.ContactCheckBoxAdapter;

public class ContactSelectorWidget extends Activity {

	public static final String CONTACT_NAME = "NAME"; // 保存的名字

	public static final String CONTACT_ID = "ID"; // ID

	public static final String CONTACT_FACE = "FACE"; // 头像

	private ContactCheckBoxAdapter contactCheckBoxAdapter; // 配置适配器

	private ListView list;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.contact);

		list = (ListView) findViewById(R.id.contactListView);

		// 配置适配器
		contactCheckBoxAdapter = new ContactCheckBoxAdapter(this, getData()); // 布局里的控件id
		// 添加并且显示
		list.setAdapter(contactCheckBoxAdapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(Menu.NONE, 1, 0, android.R.string.ok);
		menu.add(Menu.NONE, 2, 0, android.R.string.cancel);
		return super.onCreateOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		switch (item.getItemId()) {
		case 1:
			Toast.makeText(
					this,
					"selector:"
							+ contactCheckBoxAdapter.onSelectorData().size(),
					Toast.LENGTH_LONG).show();
			break;
		case 2:
			Toast.makeText(this, android.R.string.cancel, Toast.LENGTH_LONG)
					.show();
			break;
		default:
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	/**
	 * 获取联系人
	 * 
	 * @return
	 */
	private List<Map<String, Object>> getData() {
		// 组织数据源
		List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
		ContentResolver contentResolver = getContentResolver();
		Cursor cursor = contentResolver.query(
				ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
		while (cursor.moveToNext()) {
			String id = cursor.getString(cursor
					.getColumnIndex(ContactsContract.Contacts._ID)); // id
			String name = cursor.getString(cursor
					.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); // 姓名

			Map<String, Object> map = new HashMap<String, Object>();
			map.put(CONTACT_ID, id);
			map.put(CONTACT_NAME, name);
			map.put(CONTACT_FACE, getContactBitmap(id));
			list.add(map);
		}
		cursor.close(); // 关闭
		return list;
	}

	/**
	 * 获得联系人头像
	 * 
	 * @param id
	 *            联系人id
	 * @return
	 */
	private Bitmap getContactBitmap(String id) {
		ContentResolver cr = getContentResolver();
		Uri uri = ContentUris.withAppendedId(
				ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
		InputStream input = ContactsContract.Contacts
				.openContactPhotoInputStream(cr, uri);
		if (input == null) {
			// Log.e("star","input is null");
			InputStream is = getResources().openRawResource(R.drawable.icon);
			BitmapDrawable bmpDraw = null;
			bmpDraw = new BitmapDrawable(is);
			Bitmap aa = null;
			aa = bmpDraw.getBitmap();
			Bitmap newb = Bitmap.createScaledBitmap(aa, 50, 50, false);
			return newb;
		} else {
			Bitmap contactPhoto = BitmapFactory.decodeStream(input);
			Bitmap newb = Bitmap
					.createScaledBitmap(contactPhoto, 50, 50, false);
			return newb;
		}
	}
}

ContactCheckBoxAdapter.java类:
package com.iaiai.activity.adapter;

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

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.iaiai.activity.ContactSelectorWidget;
import com.iaiai.activity.R;

public class ContactCheckBoxAdapter extends BaseAdapter {

	private LayoutInflater mInflater;

	private List<Map<String, Object>> listData; // 数据

	private Map<Integer, Map<String, Object>> selectMap = new HashMap<Integer, Map<String, Object>>(); // 选择的数据

	private class ViewHolder {
		public ImageView img;
		public TextView title;
		public CheckBox checkBox;
	}

	public ContactCheckBoxAdapter(Context context,
			List<Map<String, Object>> listData) {
		this.mInflater = LayoutInflater.from(context);
		this.listData = listData;
	}

	@Override
	public int getCount() {
		return listData.size();
	}

	@Override
	public Object getItem(int position) {
		return listData.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	/**
	 * 返回选择的数据,Integer为选择的第几个
	 * 
	 * @return
	 */
	public Map<Integer, Map<String, Object>> onSelectorData() {
		return selectMap;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = mInflater.inflate(R.layout.contact_list, null);
			holder.img = (ImageView) convertView.findViewById(R.id.contact_img);
			holder.title = (TextView) convertView
					.findViewById(R.id.contact_name);
			holder.checkBox = (CheckBox) convertView
					.findViewById(R.id.contact_checkbox);
			holder.checkBox.setOnClickListener(new OnClickListener() {
				@Override
				public void onClick(View v) {
					if (selectMap.get(position) != null) {
						selectMap.remove(position);
					} else {
						selectMap.put(position, listData.get(position));
					}
				}
			});
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		holder.img.setImageBitmap((Bitmap) listData.get(position).get(
				ContactSelectorWidget.CONTACT_FACE));
		holder.title.setText(listData.get(position)
				.get(ContactSelectorWidget.CONTACT_NAME).toString());

		if (selectMap.get(position) != null) {
			holder.checkBox.setChecked(true);
		} else {
			holder.checkBox.setChecked(false);
		}

		return convertView;
	}

}


运行结果:

  • 大小: 31.8 KB
  • 大小: 15.8 KB
  • 大小: 14.1 KB
分享到:
评论

相关推荐

    Android 最近联系人软件

    Android 最近联系人软件 , widget 方式实现。

    Android40个经典源码

    10 Android 一个批量删除联系人的Demo 11 Android 指南针程序 12 Android操作数据库实例 13 android连接SQLite数据库-----增加改查+分页 14 Android游戏的心跳效果 15 Android远程登录含有loading登录效果~~完整代码...

    Android代码-NineGridView

    NineGridView 类似QQ空间,微信朋友圈,微博主页等,展示图片的九宫格控件,自动根据图片的数量确定图片大小和控件大小...使用前,对于Android Studio的用户,可以选择添加: compile 'com.lzy.widget:ninegridview:0.2

    安卓(Android)系统的秘密

    身边现在越来越多人使用上了安卓系统的手机,但是有些操作和使用...如果你对手机拨号屏幕功能性有特殊要求,Android绝对会满足你,点击联系人列表里任意一个用户,按手机menu &gt;选项,里面有关于单个联系人的详细设置

    android 的类似于QQ分组的二级列表

    import android.widget.ExpandableListView.ExpandableListContextMenuInfo; public class ExpandableListDemo extends ExpandableListActivity{ private ExpandableListAdapter adapter; //private ...

    新版Android开发教程.rar

    Android 进一步推进了 " 随时随地为每个人提供信息 " 这一企 业 目标的实现。 � Open Handset Alliance 汇集了多家业界巨头。运营商如: China Mobile 、 NTT DoCoMo 、 Vodafone 、 T-M obile 等;设备制造商如 ...

    Android高级编程--源代码

    9.1.4 在线状态和联系人列表简介 282 9.1.5 管理聊天会话 285 9.1.6 发送和接收数据信息 289 9.2 SMS简介 291 9.2.1 在应用程序中使用SMS 291 9.2.2 发送SMS信息 291 9.2.3 监听SMS消息 294 9.2.4 紧急响应...

    Android编程入门很简单.(清华出版.王勇).part1

    书名:《Android编程入门很简单》(清华大学出版社.王勇)。 压缩打包成2部分,这是第1部分。 本书是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把...第13章联系人助手 第14章个人轨迹跟踪器

    android获取联系人示例分享

    import java.util.ArrayList;import java.util.HashMap; import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.provider....import android.widget.ListVie

    《Android高级编程》

    第9章 P2P通信 9.1 Android即时消息简介 9.1.1 使用GTalk服务 9.1.2 和GTalk服务绑定 9.1.3 建立GTalk连接,开始一个IM会话 9.1.4 在线状态和联系人列表简介 9.1.5 管理聊天会话 9.1.6 发送和接收数据信息 9.2 SMS...

    Android编程入门很简单.(清华出版.王勇).part2

    书名:《Android编程入门很简单》(清华大学出版社.王勇)。 压缩打包成2部分,这是第2部分。 本书是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把...第13章联系人助手 第14章个人轨迹跟踪器

    simple-contacts-widget:另一个适用于 Android 主屏幕的简单联系人小工具

    Android 简单联系人小工具 另一个适用于主屏幕的简单联系人小工具。 该小部件具有简约的 Holo 主题。 小部件配置仅在创建时完成,如果您需要修改设置,则需要删除小部件并将其重新添加到主屏幕。 我为自己构建了这...

    《Google Android SDK开发范例大全(第3版)》.pdf

    6.3 群发拜年短信给联系人 309 6.4 开始与停止系统服务 312 6.5 通过短信发送e-mail通知 316 6.6 手机拨接状态 321 6.7 有来电,发送邮件通知 324 6.8 存储卡剩余多少容量 326 6.9 访问本机内存...

    Google Android SDK开发范例大全(第3版) 1/5

    系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...

    Google Android SDK开发范例大全(第3版) 4/5

    系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...

    Google Android SDK开发范例大全(第3版) 3/5

    系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...

    Google Android SDK开发范例大全(第3版) 5/5

    系统服务及研发的整合:网络搜索、联系人、音乐、应用程序、定制手机文件管理、记忆卡I/O存取、双向短信、闹钟服务、开机程序、来电通信互动、拜年短信、信息提醒、电池电量显示、进度显示、取得应用程序信息等。...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    6.3 群发拜年短信给联系人——ACTION_PICK与Uri对象 6.4 开始与停止系统服务——Service与Runnable整合并用 6.5 通过短信发送email通知——BroadcastReceiver与Intent整合 6.6 手机拨接状态——PhoneStateListener之...

Global site tag (gtag.js) - Google Analytics