下载SQLiteSpy.exe
打开模拟器5554

打开perspective,选择DDMS

打开Devices,确认存在emulator-5554

打开file Explorer
打开data文件夹
打开data  文件夹
打开com.android.providers.telephony文件夹
打开database文件夹
导出mmssms.db 和 telephony.db

可用SQLiteSpy.exe打开mmssms.db 和 telephony.db
打开sms文件夹,可看到联系人记录

转换到java模式,打开manifest.xml
选择permission
添加用户权限userpermission
分别选择:
android.permission.READ_CONTACTS
android.permission.READ_SMS
android.permission.CALL_PHONE
此时可看到 manifest.xml 文件增加的内容为:
<uses-sdk android:minSdkVersion="15" />
    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.READ_SMS"/>
    <uses-permission android:name="android.permission.CALL_PHONE"/>


腾讯有多可怕:
如果想添加一个知道电话号码的QQ好友
先在手机上添加此联系人的电话
(可能需要等上两小时)PC上随便加个好友,出现好友推荐界面,第一行--第二行必定有新加入的手机电话号码的人员的QQ

微信、QQ、短信存在关键字过滤——智能手机基本无秘密所言(权限的允许)

打开file Explorer
打开data文件夹
打开data  文件夹
打开com.android.providers.contacts文件夹

打开database文件夹
导出contact2.db

用SQLiteSpy.exe打开contact2.db

provider是android的四大组件之一
provider是实现跨应用程序访问数据的组件
如:com.android.providers.media
不会自定义provider
provider的读取:getcontentResolver
URI 是URL 的超级
在URI 中头部可以自定义,不一定非得是http、ftp等协议
provider像是服务器
Resolver像是浏览器
靠 URI 的数据交互


项目经理、产品经理


48dp原则:通用
android:padding="4dp"   内缩
可用来设置某些文字在图片中的位置
基线对齐 android:layout_alignBaseline="@id/call_log_item_name"


可用DDMS中的emulator Control打电话给模拟器5554

Map 查找无序数据效率较高,支持put (key,Value)
装换为List是一个无序的链表
List
Set


1、在calllog日志中查看通话记录
2、通话记录的浏览(watch?)
3、通话记录的显示
4、可根据通话而改变的通话记录(通话次数+1及提前)
===============================

activity.java
package cpm.tarena.Phone;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class PhoneManagerActivity extends Activity {

//保存通话记录数据list
ContentResolver mContentResolver;
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mContentResolver= this.getContentResolver();
      //  mContentResolver.insert(url, values);
       // mContentResolver.delete(url, where, selectionArgs);
        //mContentResolver.query(uri, projection, selection, selectionArgs, sortOrder);
        //mContentResolver.query(CallLog.CONTENT_URI, null, "name== '?' and type == ?", String[] ("abc","1"), "date");
      
        //游标,读取游标数据
        Cursor mCursor= mContentResolver.query(CallLog.Calls.CONTENT_URI, null, null, null, "date");
        String[] colsName = mCursor.getColumnNames();
        
        while(mCursor.moveToNext()){
       
 
for(int i=0; i<colsName.length; i++){
       
 
Log.i("CallLog",colsName[i]+":"+mCursor.getString(i) );
       
 
}
       
 
Log.i("CallLog", "-------------------");

//String callNumber = mCursor.getString(mCursor.getColumnIndex("number"));

       }       
    }
}


添加联系人,并打出电话
可查看log日志
可新建一个CallLog,标签设为CallLog
可看到通话的联系人姓名、电话号码、通话时长等


==========================================
2、通话记录的浏览
activity.java
package cpm.tarena.Phone;

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

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class PhoneManagerActivity extends Activity {

//保存通话记录数据list
ContentResolver mContentResolver;
ArrayList<MyCallLog> mCallLogListData = new ArrayList<MyCallLog>();
 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mContentResolver= this.getContentResolver();

//  mContentResolver.insert(url, values);

// mContentResolver.delete(url, where, selectionArgs);

//mContentResolver.query(uri, projection, selection, selectionArgs, sortOrder);

//mContentResolver.query(CallLog.CONTENT_URI, null, "name== '?' and type == ?", String[] ("abc","1"), "date");

//游标,读取游标数据

Cursor mCursor= mContentResolver.query(CallLog.Calls.CONTENT_URI,new String[] {"_id","date","duration","name","number","type"} , null, null, "date desc");

String[] colsName = mCursor.getColumnNames();

DateFormat dateFormat;

while(mCursor.moveToNext()){

MyCallLog nowCallLogs = new MyCallLog();

nowCallLogs.setId(mCursor.getInt(0));

nowCallLogs.setDate(mCursor.getLong(1));

Date nowdate =  new Date(0);

if(nowdate.getTime() - (60*1000) < nowCallLogs.getDate()){

//显示刚刚

nowCallLogs.setDateFormat("刚刚");

}

else if (nowdate.getTime() - (60*1000*60) < nowCallLogs.getDate()){

//显示一小时内

nowCallLogs.setDateFormat("n分钟");

}

else if (nowdate.getTime() - (60*1000*60*24) < nowCallLogs.getDate()){

//显示今天

nowCallLogs.setDateFormat("今天");

}

else if (nowdate.getTime() - (60*1000*60*24*2) < nowCallLogs.getDate()){

//显示昨天

nowCallLogs.setDateFormat("昨天");

}

else{

// 月日 : 时分

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd hh:mm");
nowCallLogs.setDateFormat(sdf.format(new Date(nowCallLogs.getDate())));

}

nowCallLogs.setDuration(mCursor.getLong(2));

nowCallLogs.setName(mCursor.getString(3));

nowCallLogs.setTelNumber(mCursor.getString(4));

nowCallLogs.setType(mCursor.getInt(5));


mCallLogListData.add(nowCallLogs);

}

mCallLogListData.toString();

}

}
----------------------------

MyCallLog.java
package cpm.tarena.Phone;

import java.util.ArrayList;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;

public class MyCallLog {
 
//id、时间、时长、打进 打出 未接(1 2 3)、号码。。。
private int id;
private long duration;
private long date;
private int type;
private String number;
private String name;
 
private String dateFormat;
 

public String getDateFormat() {
return dateFormat;
}

public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}

public int getId() {
return id;
}

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

public long getDuration() {
return duration;
}

public void setDuration(long duration) {
this.duration = duration;
}

public long getDate() {
return date;
}

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

public int getType() {
return type;
}

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

public String getTelNumber() {
return number;
}

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

public String getName() {
return name;
}

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

===========================================
3、通话记录的显示
PhoneManager.java
package cpm.tarena.Phone;

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

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;

public class PhoneManagerActivity extends Activity {

//保存通话记录数据list
ContentResolver mContentResolver;
ArrayList<MyCallLog> mCallLogListData = new ArrayList<MyCallLog>();
 
ListView mCallLogListView;
CalllogAdapter mCallLogAdapter;
 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mContentResolver= this.getContentResolver();

//  mContentResolver.insert(url, values);

// mContentResolver.delete(url, where, selectionArgs);

//mContentResolver.query(uri, projection, selection, selectionArgs, sortOrder);

//mContentResolver.query(CallLog.CONTENT_URI, null, "name== '?' and type == ?", String[] ("abc","1"), "date");

//游标,读取游标数据

Cursor mCursor= mContentResolver.query(CallLog.Calls.CONTENT_URI,

new String[] {"_id","date","duration","name","number","type"} , null, null, "date desc");

String[] colsName = mCursor.getColumnNames();

DateFormat dateFormat;

while(mCursor.moveToNext()){

MyCallLog nowCallLogs = new MyCallLog();

nowCallLogs.setId(mCursor.getInt(0));

nowCallLogs.setDate(mCursor.getLong(1));

Date nowdate =  new Date(0);

if(nowdate.getTime() - (60*1000) < nowCallLogs.getDate()){

//显示刚刚

nowCallLogs.setDateFormat("刚刚");

}

else if (nowdate.getTime() - (60*1000*60) < nowCallLogs.getDate()){

//显示一小时内

nowCallLogs.setDateFormat("n分钟");

}

else if (nowdate.getTime() - (60*1000*60*24) < nowCallLogs.getDate()){

//显示今天

nowCallLogs.setDateFormat("今天");

}

else if (nowdate.getTime() - (60*1000*60*24*2) < nowCallLogs.getDate()){

//显示昨天

nowCallLogs.setDateFormat("昨天");

}

else{

// 月日 : 时分

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd hh:mm");
nowCallLogs.setDateFormat(sdf.format(new Date(nowCallLogs.getDate())));

}

nowCallLogs.setDuration(mCursor.getLong(2));

nowCallLogs.setName(mCursor.getString(3));

nowCallLogs.setTelNumber(mCursor.getString(4));

nowCallLogs.setType(mCursor.getInt(5));


mCallLogListData.add(nowCallLogs);

}

mCallLogListData.toString();

mCallLogListView = (ListView) findViewById(R.id.call_log_listview);

mCallLogAdapter = new CalllogAdapter(this, mCallLogListData, R.layout.calllog_list_item_layout);

mCallLogListView.setAdapter(mCallLogAdapter);

}

}
------------------------------------

MyCalllog.java
package cpm.tarena.Phone;

import java.util.ArrayList;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;

public class MyCallLog {
ArrayList<CallLog> mCallLogs= new ArrayList<CallLog>(); 
 
//id、时间、时长、打进 打出 未接(1 2 3)、号码。。。
private int id;
private long duration;
private long date;
private int type;
private String number;
private String name;
 
private String dateFormat;
 

public String getDateFormat() {
return dateFormat;
}

public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}

public int getId() {
return id;
}

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



public long getDuration() {
return duration;
}



public void setDuration(long duration) {
this.duration = duration;
}



public long getDate() {
return date;
}



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



public int getType() {
return type;
}



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



public String getTelNumber() {
return number;
}



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



public String getName() {
return name;
}



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

------------------------------------------------------------
CalllogAdaper.java
package cpm.tarena.Phone;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CalllogAdapter extends BaseAdapter{
 
Context mcontext;
List<MyCallLog> mcalllogListData;
int mitemLayoutId;
LayoutInflater mLayoutInflater;
 
public CalllogAdapter(
Context context,
List<MyCallLog> calllogListData,
int itemLayoutId)
{
mcontext= context;
mcalllogListData=  calllogListData;
mitemLayoutId= itemLayoutId;
 

mLayoutInflater = LayoutInflater.from(mcontext);

}
 

@Override
public int getCount() {
// TODO Auto-generated method stub
return mcalllogListData.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mcalllogListData.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return mcalllogListData.get(position).hashCode();
}

@Override
public View getView(int position, 
View convertView, 
ViewGroup parent) 
{

//判断是否实例化Item
if(convertView==null ){
convertView = mLayoutInflater.inflate(mitemLayoutId, null);

}
//找到需要修改的控件
TextView nameTv =(TextView) convertView.findViewById(R.id.call_log_item_name);
TextView numberTv =(TextView) convertView.findViewById(R.id.call_log_item_number);
TextView dateTv =(TextView) convertView.findViewById(R.id.call_log_item_date);
TextView typeTv =(TextView) convertView.findViewById(R.id.call_log_item_type);
 
//设置控件要显式的内同
//CalllogAdapter nowCallLog = mcalllogListData.get(position);
 
MyCallLog nowCallLogs = mcalllogListData.get(position);
 
if(null != nowCallLogs.getName()){
nameTv.setText(nowCallLogs.getName());
}
else{
nameTv.setText("未知");
}
 
if(null != nowCallLogs.getTelNumber()){
numberTv.setText(nowCallLogs.getTelNumber());
}
else{
numberTv.setText("保密");
}
 
dateTv.setText(nowCallLogs.getDateFormat());
 
switch (nowCallLogs.getType()) {
case 1:
//打进
typeTv.setBackgroundResource(R.drawable.icon_log_incoming);
break;
case 2:
//打出
typeTv.setBackgroundResource(R.drawable.icon_log_outgoing);
break;
case 3:
//未接
typeTv.setBackgroundResource(R.drawable.icon_log_missed);

break;
}

// TODO Auto-generated method stub
return convertView;
}

}

------------------------------------------------------------------------
calllog_list_item_layout.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="48dp"
    android:orientation="vertical" 
    android:background="#ccfcfc">
    
  
       <ImageView
    android:id="@+id/call_log_item_photo"
    android:layout_width="48dp"
    android:layout_height="48dp"       
    android:src="@drawable/default_thumbnail"  
    android:background="#00f"
    android:padding="4dp"/>
    
<TextView
android:id="@+id/call_log_item_type"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"       
    android:background="@drawable/icon_log_missed"
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true"  
    android:text="5"
    android:textColor="#000"
    android:gravity="center"
    android:paddingRight="24dp"/>
 
<TextView
android:id="@+id/call_log_item_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"       
    android:text="张三"
    android:paddingLeft="4dp"
    android:paddingTop="4dp"
    android:textSize="18dp"
    android:textColor="#000"
    android:layout_toRightOf="@id/call_log_item_photo"
    android:layout_alignTop="@id/call_log_item_name"/>
 
<TextView
android:id="@+id/call_log_item_number"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"       
    android:text="13717843343"
    android:textSize="16dp"
    android:paddingLeft="4dp"
    android:layout_toRightOf="@id/call_log_item_name"
    android:layout_alignBaseline="@id/call_log_item_name"/>
 
<TextView
android:id="@+id/call_log_item_date"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"       
    android:text="3小时前"

    android:textSize="16dp"
    android:paddingBottom="2dp"
    android:paddingLeft="4dp"
    android:layout_toRightOf="@id/call_log_item_photo"
    android:layout_alignBottom="@id/call_log_item_photo"/> 
        
</RelativeLayout>

----------------------------------------------------------------------
main.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="fill_parent" >

    <ListView
        android:id="@+id/call_log_listview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ListView>

    <LinearLayout
        android:visibility="gone"
        android:id="@+id/keyboard_layout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:background="#fcfcfc"
        android:orientation="vertical" >

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/keyboard_line_bg" >

            <ImageButton
                android:id="@+id/hide_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:background="#0000"
                android:src="@drawable/keyboard_hide" />

            <ImageButton
                android:id="@+id/del_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:background="#0000"
                android:src="@drawable/keyboard_backspace" />

            <Button
                android:id="@+id/call_button"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_toLeftOf="@id/del_button"
                android:layout_toRightOf="@id/hide_button"
                android:background="@drawable/dial_call_bg"
                android:ellipsize="start"
                android:text="139111111"
                android:textColor="#fff"
                android:textSize="18sp" />
        </RelativeLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/key_1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_1" />

            <ImageButton
                android:id="@+id/key_2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_2" />

            <ImageButton
                android:id="@+id/key_3"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_3" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/key_4"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_4" />

            <ImageButton
                android:id="@+id/key_5"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_5" />

            <ImageButton
                android:id="@+id/key_6"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_6" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/key_7"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_7" />

            <ImageButton
                android:id="@+id/key_8"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_8" />

            <ImageButton
                android:id="@+id/key_9"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_9" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <ImageButton
                android:id="@+id/key_star"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_star" />

            <ImageButton
                android:id="@+id/key_0"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_0" />

            <ImageButton
                android:id="@+id/key_hash"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:background="@drawable/key_bg_s"
                android:src="@drawable/keyboard_hash" />
        </LinearLayout>
    </LinearLayout>

</RelativeLayout>

=============================================
4、可根据通话而改变的通话记录(通话次数+1及提前)
PhoneManagerActivity.java
package cpm.tarena.Phone;

import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;

import android.app.Activity;
import android.content.ContentResolver;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;

public class PhoneManagerActivity extends Activity {

//保存通话记录数据list
ContentResolver mContentResolver;
ArrayList<MyCallLog> mCallLogListData = new ArrayList<MyCallLog>();
 
LinkedHashMap<String, MyCallLog> mCallLogMapData = new LinkedHashMap<String, MyCallLog>();
 
ListView mCallLogListView;
CalllogAdapter mCallLogAdapter;
 
 

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mCallLogListView = (ListView) findViewById(R.id.call_log_listview);

}


@Override
protected void onResume() {

// TODO Auto-generated method stub
super.onResume();
 

mContentResolver= this.getContentResolver();

//游标,读取游标数据

Cursor mCursor= mContentResolver.query(CallLog.Calls.CONTENT_URI,

new String[] {"_id","date","duration","name","number","type"} , null, null, "date desc");

String[] colsName = mCursor.getColumnNames();

DateFormat dateFormat;

//清空Map

mCallLogMapData.clear();

while( mCursor.moveToNext() ){

MyCallLog nowCallLogs = new MyCallLog();

nowCallLogs.setId(mCursor.getInt(0));

nowCallLogs.setDate(mCursor.getLong(1));

Date nowdate = new Date(0, 0, 0) ;

// 今天的凌晨

Date today = new Date(nowdate.getYear(), nowdate.getMonth(),nowdate.getDay());

// 时间转换规则

// 在1分钟内显示刚刚
// 60分钟内显示n分钟
// 超过60分钟,还在今天显示n小时之前
// 不在今天,在昨天24小时内显示 昨天 : 时分
// 超过昨天显示前天:时分
// 超过前天显示 月/日 时分

if(nowdate.getTime() - (60*1000) < nowCallLogs.getDate()){

//显示刚刚

nowCallLogs.setDateFormat("刚刚");

}

else if (nowdate.getTime() - (60*1000*60) < nowCallLogs.getDate()){

//显示一小时内

nowCallLogs.setDateFormat("n分钟");

}

else if (nowdate.getTime() - (60*1000*60*24) < nowCallLogs.getDate()){

//显示今天

nowCallLogs.setDateFormat("今天");

}

else if (nowdate.getTime() - (60*1000*60*24*2) < nowCallLogs.getDate()){

//显示昨天

nowCallLogs.setDateFormat("昨天");

}

else{

// 月日 : 时分

SimpleDateFormat sdf = new SimpleDateFormat("MM-dd hh:mm");
nowCallLogs.setDateFormat(sdf.format(new Date(nowCallLogs.getDate())));

}

nowCallLogs.setDuration(mCursor.getLong(2));

nowCallLogs.setName(mCursor.getString(3));

nowCallLogs.setTelNumber(mCursor.getString(4));

nowCallLogs.setType(mCursor.getInt(5));


//mCallLogListData.add(nowCallLogs);

MyCallLog mapCallLog = mCallLogMapData.get(nowCallLogs.getTelNumber());

 
if(null != mapCallLog){
int callCount = mapCallLog.getCount()+1;

mapCallLog.setCount(callCount);

}
else{
nowCallLogs.setCount(1);
mCallLogMapData.put(nowCallLogs.getTelNumber(), nowCallLogs);

}

} //while的end

//将

mCallLogListData = new ArrayList<MyCallLog>(mCallLogMapData.values());

mCallLogListData.toString();

// mCallLogListView = (ListView) findViewById(R.id.call_log_listview);

mCallLogAdapter = new CalllogAdapter(this, mCallLogListData, R.layout.calllog_list_item_layout);

mCallLogListView.setAdapter(mCallLogAdapter);

mCallLogListView.setOnItemClickListener(new OnItemClickListener(){


@Override
public void onItemClick(AdapterView<?> listView, View itemView,
int position, long itemId) {
// TODO Auto-generated method stub
MyCallLog nowCallLog = (MyCallLog)listView.getItemAtPosition(position);
// 获得要拨打出去的电话
String number = nowCallLog.getTelNumber();
Uri callUri = Uri.parse("tel:" + number);
Intent callIntent = new Intent();
callIntent.setAction(Intent.ACTION_CALL);
callIntent.setData(callUri);

startActivity(callIntent);
}

});

}//onResume的end
 
}
----------------------------------------------

MyCallLog.java
package cpm.tarena.Phone;

import java.util.ArrayList;

import android.content.ContentResolver;
import android.database.Cursor;
import android.provider.CallLog;
import android.text.format.DateFormat;
import android.util.Log;

public class MyCallLog {
ArrayList<CallLog> mCallLogs= new ArrayList<CallLog>(); 
 
//id、时间、时长、打进 打出 未接(1 2 3)、号码。。。
private int id;
private long duration;
private long date;
private int type;
private String number;
private String name;
 
private String dateFormat;
 
private int count;
 

public int getCount() {
return count;
}

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

public String getDateFormat() {
return dateFormat;
}

public void setDateFormat(String dateFormat) {
this.dateFormat = dateFormat;
}

public int getId() {
return id;
}

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

public long getDuration() {
return duration;
}

public void setDuration(long duration) {
this.duration = duration;
}

public long getDate() {
return date;
}

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

public int getType() {
return type;
}

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

public String getTelNumber() {
return number;
}

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

public String getName() {
return name;
}

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

------------------------------------------
CalllogAdapter.java
package cpm.tarena.Phone;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CalllogAdapter extends BaseAdapter{
 
Context mcontext;
List<MyCallLog> mcalllogListData;
int mitemLayoutId;
 
LayoutInflater mLayoutInflater;
 
public CalllogAdapter(
Context context,
List<MyCallLog> calllogListData,
int itemLayoutId)
{
mcontext= context;
mcalllogListData=  calllogListData;
mitemLayoutId= itemLayoutId;
 

mLayoutInflater = LayoutInflater.from(mcontext);

}
 

@Override
public int getCount() {
// TODO Auto-generated method stub
return mcalllogListData.size();
}

@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return mcalllogListData.get(position);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return mcalllogListData.get(position).hashCode();
}

@Override
public View getView(
int position, 
View convertView, 
ViewGroup parent) 
{

//判断是否实例化Item
if(convertView==null ){
convertView = mLayoutInflater.inflate(mitemLayoutId, null);

}
//找到需要修改的控件
TextView nameTv =(TextView) convertView.findViewById(R.id.call_log_item_name);
TextView numberTv =(TextView) convertView.findViewById(R.id.call_log_item_number);
TextView dateTv =(TextView) convertView.findViewById(R.id.call_log_item_date);
TextView typeTv =(TextView) convertView.findViewById(R.id.call_log_item_type);
 
//设置控件要显式的内容

MyCallLog nowCallLogs = mcalllogListData.get(position);
 
//显示联系人名称
if(null != nowCallLogs.getName()){
nameTv.setText(nowCallLogs.getName());
}
else{
nameTv.setText("未知");
}
//显示联系人电话号码
if(null != nowCallLogs.getTelNumber()){
numberTv.setText(nowCallLogs.getTelNumber());
}
else{
numberTv.setText("保密");
}
//显示通话记录时间
dateTv.setText(nowCallLogs.getDateFormat());
 
//显示通话类型(1:打进、2:打出、3:未接)
switch (nowCallLogs.getType()) {
case 1:
//打进
typeTv.setBackgroundResource(R.drawable.icon_log_incoming);
break;
case 2:
//打出
typeTv.setBackgroundResource(R.drawable.icon_log_outgoing);
break;
case 3:
//未接
typeTv.setBackgroundResource(R.drawable.icon_log_missed);
break;
}

 
//显示相同联系人的通话次数
typeTv.setText(""+nowCallLogs.getCount());
 
// TODO Auto-generated method stub
return convertView;
}

}

-------------------------------------------
实现效果为:












最新文章

  1. [codevs1743]反转卡片
  2. node-webkit 笔记
  3. Opencv加载和显示图片
  4. C/C++中函数参数传递详解(二)
  5. DataGridView 的cell赋值没有线程间访问的限制吗?
  6. iOS开发——Touch ID 指纹识别
  7. 免费的SqlServer优化辅助工具:SqlOptimize (原创)
  8. [Swust OJ 249]--凸包面积
  9. perl 获取系统时间
  10. asp.net core利用DI实现自定义用户系统,脱离ControllerBase.User
  11. raft如何实现Linearizable Read
  12. 【转】C语言产生随机数
  13. .Net Core中利用TPL(任务并行库)构建Pipeline处理Dataflow
  14. 记录Newtonsoft.Json的日常用法
  15. [Python设计模式] 第3~5章 单一职责原则/开放-封闭原则/依赖倒转原则
  16. php代码中pre的作用??
  17. 【转】每天一个linux命令(50):crontab命令
  18. 软件测试自动化之- API Test
  19. [转]iOS开发new与alloc/init的区别
  20. C# .net 多线程中集合数据同步

热门文章

  1. #include&lt;filename.h&gt; 与 #include“filename.h”
  2. WordPress 前端投稿/编辑插件 DJD Site Post(支持游客和已注册用户)
  3. Bootstrap 轮播(Carousel)插件
  4. the apply of backbone
  5. angular中实现jQuery的Document Ready
  6. Security 可视化
  7. IntelliJ IDEA Subversion的使用方式
  8. JAVA 抛出与声明异常
  9. statspack系列8
  10. WordPress Bradesco Gateway插件‘falha.php’跨站脚本漏洞