Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android通訊錄管理(獲取聯系人、通話記錄、短信消息)(二)

Android通訊錄管理(獲取聯系人、通話記錄、短信消息)(二)

編輯:關於Android編程

Android通訊錄管理(獲取聯系人、通話記錄、短信消息)(二)


前言:上一篇博客介紹的是獲取聯系人的實現,本篇博客將介紹通話記錄的實現。


\

同樣的,你可以到這裡下載源碼:http://download.csdn.net/detail/wwj_748/6962865


界面布局:

/Contact_Demo喎?/kf/ware/vc/" target="_blank" class="keylink">vcmVzL2xheW91dC9jb250YWN0X3JlY29yZF9saXN0X3ZpZXcueG1sPGJyPgo8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">
/Contact_Demo/res/layout/contact_record_list_item.xml




    

    

        

        
    

    

    

    


定義實體類:

/Contact_Demo/src/com/suntek/contact/model/CallLogBean.java

package com.suntek.contact.model;

/**
 * 通話記錄實體類
 * 
 * @author Administrator
 * 
 */
public class CallLogBean {

	private int id;
	private String name; // 名稱
	private String number; // 號碼
	private String date; // 日期
	private int type; // 來電:1,撥出:2,未接:3
	private int count; // 通話次數

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getNumber() {
		return number;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public int getType() {
		return type;
	}

	public void setType(int type) {
		this.type = type;
	}

	public int getCount() {
		return count;
	}

	public void setCount(int count) {
		this.count = count;
	}

}


/Contact_Demo/src/com/suntek/contact/adapter/DialAdapter.java

package com.suntek.contact.adapter;

import java.util.List;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.suntek.contact.R;
import com.suntek.contact.model.CallLogBean;

/**
 * 電話記錄適配器
 * 
 * @author Administrator
 * 
 */
public class DialAdapter extends BaseAdapter {

	private Context ctx;
	private List callLogs;
	private LayoutInflater inflater;

	public DialAdapter(Context context, List callLogs) {
		this.ctx = context;
		this.callLogs = callLogs;
		this.inflater = LayoutInflater.from(context);
	}

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

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder;
		if (convertView == null) {
			convertView = inflater.inflate(R.layout.contact_record_list_item,
					null);
			holder = new ViewHolder();
			holder.call_type = (ImageView) convertView
					.findViewById(R.id.call_type);
			holder.name = (TextView) convertView.findViewById(R.id.name);
			holder.number = (TextView) convertView.findViewById(R.id.number);
			holder.time = (TextView) convertView.findViewById(R.id.time);
			holder.call_btn = (TextView) convertView
					.findViewById(R.id.call_btn);
			convertView.setTag(holder); // 緩存
		} else {
			holder = (ViewHolder) convertView.getTag();
		}

		CallLogBean callLog = callLogs.get(position);
		switch (callLog.getType()) {
		case 1:
			holder.call_type
					.setBackgroundResource(R.drawable.ic_calllog_outgoing_nomal);
			break;
		case 2:
			holder.call_type
					.setBackgroundResource(R.drawable.ic_calllog_incomming_normal);
			break;
		case 3:
			holder.call_type
					.setBackgroundResource(R.drawable.ic_calllog_missed_normal);
			break;
		}
		holder.name.setText(callLog.getName());
		holder.number.setText(callLog.getNumber());
		holder.time.setText(callLog.getDate());

		addViewListener(holder.call_btn, callLog, position);

		return convertView;
	}

	private static class ViewHolder {
		ImageView call_type;
		TextView name;
		TextView number;
		TextView time;
		TextView call_btn;
	}

	private void addViewListener(View view, final CallLogBean callLog,
			final int position) {
		view.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Uri uri = Uri.parse("tel:" + callLog.getNumber());
				Intent intent = new Intent(Intent.ACTION_CALL, uri);
				ctx.startActivity(intent);
			}
		});
	}
}

/Contact_Demo/src/com/suntek/contact/ContactRecordListActivity.java

package com.suntek.contact;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.widget.ListView;

import com.suntek.contact.adapter.DialAdapter;
import com.suntek.contact.model.CallLogBean;

/**
 * 通話記錄列表
 * 
 * @author wwj
 * 
 */
public class ContactRecordListActivity extends Activity {
	private ListView callLogListView;
	private AsyncQueryHandler asyncQuery;
	private DialAdapter adapter;
	private List callLogs;

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

		callLogListView = (ListView) findViewById(R.id.call_log_list);
		asyncQuery = new MyAsyncQueryHandler(getContentResolver());
		init();
	}

	private void init() {
		Uri uri = android.provider.CallLog.Calls.CONTENT_URI;
		// 查詢的列
		String[] projection = { CallLog.Calls.DATE, // 日期
				CallLog.Calls.NUMBER, // 號碼
				CallLog.Calls.TYPE, // 類型
				CallLog.Calls.CACHED_NAME, // 名字
				CallLog.Calls._ID, // id
		};
		asyncQuery.startQuery(0, null, uri, projection, null, null,
				CallLog.Calls.DEFAULT_SORT_ORDER);
	}

	private class MyAsyncQueryHandler extends AsyncQueryHandler {

		public MyAsyncQueryHandler(ContentResolver cr) {
			super(cr);
		}

		@Override
		protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
			if (cursor != null && cursor.getCount() > 0) {
				callLogs = new ArrayList();
				SimpleDateFormat sfd = new SimpleDateFormat("MM-dd hh:mm");
				Date date;
				cursor.moveToFirst(); // 游標移動到第一項
				for (int i = 0; i < cursor.getCount(); i++) {
					cursor.moveToPosition(i);
					date = new Date(cursor.getLong(cursor
							.getColumnIndex(CallLog.Calls.DATE)));
					String number = cursor.getString(cursor
							.getColumnIndex(CallLog.Calls.NUMBER));
					int type = cursor.getInt(cursor
							.getColumnIndex(CallLog.Calls.TYPE));
					String cachedName = cursor.getString(cursor
							.getColumnIndex(CallLog.Calls.CACHED_NAME));// 緩存的名稱與電話號碼,如果它的存在
					int id = cursor.getInt(cursor
							.getColumnIndex(CallLog.Calls._ID));

					CallLogBean callLogBean = new CallLogBean();
					callLogBean.setId(id);
					callLogBean.setNumber(number);
					callLogBean.setName(cachedName);
					if (null == cachedName || "".equals(cachedName)) {
						callLogBean.setName(number);
					}
					callLogBean.setType(type);
					callLogBean.setDate(sfd.format(date));

					callLogs.add(callLogBean);
				}
				if (callLogs.size() > 0) {
					setAdapter(callLogs);
				}
			}
			super.onQueryComplete(token, cookie, cursor);
		}
	}

	private void setAdapter(List callLogs) {
		adapter = new DialAdapter(this, callLogs);
		callLogListView.setAdapter(adapter);
	}
}


代碼是最好的解釋了,這裡使用的幾個重要的類,一個是Uri(進行查詢的通用資源標志符),一個是AsyncQueryHandler(Android提供的異步操作數據庫的類),這裡我們調用它的startQuery方法來查詢數據庫,在它onQueryComplete方法中得到數據庫返回的游標cousor,通過curor來取得數據庫對應表中的字段值。




						
		
	
				
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved