android通讯录之通话记录

通讯录的制作过程中,熟悉数据库的使用是最为关键的,网上有很多开源代码可以借鉴,以下是我借鉴了一些开源代码实现的通话记录。

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,需要的朋友拿走吧

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值