通讯录的制作过程中,熟悉数据库的使用是最为关键的,网上有很多开源代码可以借鉴,以下是我借鉴了一些开源代码实现的通话记录。
1、界面布局(tonghua_item.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/contact_record_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00000000">
<LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#c0c0c0">
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通话记录"
android:textSize="30dip"
android:textColor="#000"
android:layout_gravity="center"/>
</LinearLayout>
<ListView
android:id="@+id/call_log_list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/LinearLayout1"
android:cacheColorHint="#000000"
android:fadingEdge="none"
android:scrollingCache="false"
android:visibility="visible" /><strong>
</strong><FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/LinearLayout1">"
<ListView
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/LinearLayout1"
android:cacheColorHint="#000000"
android:background="#ff666666" />
<ImageButton
android:id="@+id/bohao_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@android:drawable/ic_dialog_dialer"
android:background="@drawable/btn_bg_bohao_pan"
android:layout_gravity="center|bottom"
android:padding="20dp"
android:layout_marginBottom="20dp"/>
</FrameLayout>
<LinearLayout
android:id="@+id/bohaopan"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/dialNum1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num1_ic"
android:tag="1" />
<Button
android:id="@+id/dialNum2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num2_ic"
android:tag="2" />
<Button
android:id="@+id/dialNum3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num3_ic"
android:tag="3" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/dialNum4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num4_ic"
android:tag="4" />
<Button<strong>
</strong> android:id="@+id/dialNum5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num5_ic"
android:tag="5" />
<Button
android:id="@+id/dialNum6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num6_ic"
android:tag="6" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/dialNum7"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num7_ic"
android:tag="7" />
<Button
android:id="@+id/dialNum8"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num8_ic"
android:tag="8" />
<Button
android:id="@+id/dialNum9"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num9_ic"
android:tag="9" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<Button
android:id="@+id/dialx"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/dialx_ic"
android:tag="*" />
<Button
android:id="@+id/dialNum0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/num0_ic"
android:tag="0" />
<Button
android:id="@+id/dialj"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/dialj_ic"
android:tag="#" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/dial_input_bg"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingLeft="10dip"
android:paddingRight="10dip" >
<Button
android:id="@+id/phone_view"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginRight="10dip"
android:background="@drawable/dial_input_btn"
android:gravity="center"
android:textAppearance="?android:textAppearanceLarge"
android:textColor="#ffffff" />
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/dial_delete3" />
</LinearLayout>
</LinearLayout>
</RelativeLayout>
2、tonghua_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<ImageView
android:id="@+id/image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="5dip"
android:layout_marginRight="5dip" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/image"
android:orientation="vertical" >
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="#ffffff"
android:textSize="20dip"
android:layout_marginTop="6dip"/>
<TextView
android:id="@+id/text3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceSmall"
android:textColor="#cccccc"
android:textSize="20dip"
android:layout_marginBottom="6dip"/>
</LinearLayout>
<TextView
android:id="@+id/call_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginLeft="10dip"
android:layout_marginRight="10dip"
android:background="@drawable/ic_calllog_call_normal"/>
<ImageView
android:id="@+id/fg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@+id/call_btn"
/>
<TextView
android:id="@+id/text2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@+id/fg"
android:textColor="#ffffff"
/>
</RelativeLayout>
3、代码实现(tonghuajilu.java)
package com.example.bohao;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.example.bohao.CallLogBean;
import com.example.bohao.DialAdapter;
import com.example.R;
import android.app.Activity;
import android.app.ListActivity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
import android.graphics.Bitmap;
import android.media.AudioManager;
import android.media.SoundPool;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.CallLog;
import android.provider.CallLog.Calls;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.Telephony.Sms;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
public class tonghuajilu extends Activity implements OnClickListener{
private MyAsyncQueryHandler asyncQuery;
private List<CallLogBean> callLogs;
private DialAdapter adapter;
private ListView mListView;
public Context mContext;
private ImageButton bohao_show;
private LinearLayout bohaopan;
private Button phone_view;
private AudioManager am;
private SoundPool spool;
private ListView callLogList;
private Button delete;
private Map<Integer, Integer> map = new HashMap<Integer, Integer>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tonghua_view);
mListView = (ListView)this.findViewById(R.id.list);
phone_view = (Button) findViewById(R.id.phone_view);
bohaopan = (LinearLayout) findViewById(R.id.bohaopan);
bohao_show = (ImageButton)this.findViewById(R.id.bohao_show);
callLogList = (ListView)findViewById(R.id.call_log_list);
bohao_show.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
dialPadShow();
}
});
am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
spool = new SoundPool(11, AudioManager.STREAM_SYSTEM, 5);
asyncQuery = new MyAsyncQueryHandler(getContentResolver());
phone_view.setOnClickListener(this);
delete = (Button) findViewById(R.id.delete);
delete.setOnClickListener(this);
delete.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
phone_view.setText("");
return false;
}
});
for (int i = 0; i < 12; i++) {
View v = findViewById(R.id.dialNum1 + i);
v.setOnClickListener(this);
}
init();
}
/*
* 展示出键盘
*/
public void dialPadShow() {
// TODO Auto-generated method stub
if(bohaopan.getVisibility() == View.VISIBLE){
bohaopan.setVisibility(View.GONE);
bohao_show.setVisibility(View.VISIBLE);
}else{
bohaopan.setVisibility(View.VISIBLE);
bohao_show.setVisibility(View.INVISIBLE);
}
}
private void init() {
// TODO Auto-generated method stub
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,
};
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) {
super.onQueryComplete(token, cookie, cursor);
if (cursor != null && cursor.getCount() > 0) {
callLogs = new ArrayList<CallLogBean>();
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);
}
}
}
}
private void setAdapter(List<CallLogBean> callLogs) {
adapter = new DialAdapter(this,callLogs);
mListView.setAdapter(adapter);
/*
* 触碰到键盘以外的地方,收起(隐藏)键盘。
*/
mListView.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
if(scrollState == OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){
if(bohaopan.getVisibility() == View.VISIBLE){
//隐藏键盘关键代码
bohaopan.setVisibility(View.GONE);
bohao_show.setVisibility(View.VISIBLE);
}
}
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
mListView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
});
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.dialNum0:
/*
* phone_view 允许输入的字符长度不超过12
*/
if (phone_view.getText().length() < 12) {
play(1);
input(v.getTag().toString());
}
break;
case R.id.dialNum1:
if (phone_view.getText().length() < 12) {
play(1);
input(v.getTag().toString());
}
break;
case R.id.dialNum2:
if (phone_view.getText().length() < 12) {
play(2);
input(v.getTag().toString());
}
break;
case R.id.dialNum3:
if (phone_view.getText().length() < 12) {
play(3);
input(v.getTag().toString());
}
break;
case R.id.dialNum4:
if (phone_view.getText().length() < 12) {
play(4);
input(v.getTag().toString());
}
break;
case R.id.dialNum5:
if (phone_view.getText().length() < 12) {
play(5);
input(v.getTag().toString());
}
break;
case R.id.dialNum6:
if (phone_view.getText().length() < 12) {
play(6);
input(v.getTag().toString());
}
break;
case R.id.dialNum7:
if (phone_view.getText().length() < 12) {
play(7);
input(v.getTag().toString());
}
break;
case R.id.dialNum8:
if (phone_view.getText().length() < 12) {
play(8);
input(v.getTag().toString());
}
break;
case R.id.dialNum9:
if (phone_view.getText().length() < 12) {
play(9);
input(v.getTag().toString());
}
break;
case R.id.dialx:
if (phone_view.getText().length() < 12) {
play(11);
input(v.getTag().toString());
}
break;
case R.id.dialj:
if (phone_view.getText().length() < 12) {
play(12);
input(v.getTag().toString());
}
break;
case R.id.delete:
delete();
break;
case R.id.phone_view:
/*
*得到的字符数需要不少于3位才能拨打
*/
if (phone_view.getText().toString().length() >= 3) {
call(phone_view.getText().toString());
}
break;
default:
break;
}
}
private void play(int id) {
int max = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
int current = am.getStreamVolume(AudioManager.STREAM_MUSIC);
float value = (float)0.7 / max * current;
spool.setVolume(spool.play(id, value, value, 0, 0, 1f), value, value);
}
private void input(String str) {
/*
* 循环:与上述代码中的case 形成循环,连续单击键盘,保留之前获得字符,并加上新获得的。
*/
String p = phone_view.getText().toString();
phone_view.setText(p + str);
}
private void delete() {
String p = phone_view.getText().toString();
if(p.length()>0){
/*
* 循环,通俗点讲就是:返回0,相当于字符串右移一位,左边补一位0
*/
phone_view.setText(p.substring(0, p.length()-1));
}
}
private void call(String phone) {
Uri uri = Uri.parse("tel:" + phone);
Intent it = new Intent(Intent.ACTION_CALL, uri);
startActivity(it);
}
}
package com.example.bohao;
import java.util.List;
import com.example.R;
import android.R.color;
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;
public class DialAdapter extends BaseAdapter{
private Context mContext;
private List<CallLogBean> callLogs;
private LayoutInflater inflater;
public DialAdapter(Context mContext,List<CallLogBean> callLogs){
this.mContext = mContext;
this.callLogs = callLogs;
this.inflater = LayoutInflater.from(mContext);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
//return callLogs.size();
return callLogs!=null? callLogs.size():0;
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return callLogs.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView == null){
convertView = inflater.inflate(R.layout.tonghua_item, null);
holder = new ViewHolder();
holder.image = (ImageView)convertView.findViewById(R.id.image);
holder.text1 = (TextView)convertView.findViewById(R.id.text1);
holder.text2 = (TextView)convertView.findViewById(R.id.text2);
holder.text3 = (TextView)convertView.findViewById(R.id.text3);
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.image.setBackgroundResource(android.R.drawable.sym_call_incoming);
break;
case 2:
holder.image.setBackgroundResource(android.R.drawable.sym_call_outgoing);
break;
case 3:
holder.image.setBackgroundResource(android.R.drawable.sym_call_missed);
break;
}
holder.text1.setText(callLog.getName());
holder.text2.setText(callLog.getDate());
holder.text3.setText(callLog.getNumber());
addViewListener(holder.call_btn, callLog, position);
return convertView;
}
private class ViewHolder{
ImageView image;
TextView text1;
TextView text2;
TextView text3;
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);
mContext.startActivity(intent);
}
});
}
}
之前说过源码下载链接在这里贴出
http://download.csdn.net/detail/poulfei/9546236,需要的朋友拿走吧