編輯:關於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);
}
});
}
}
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來取得數據庫對應表中的字段值。
Android BadgeView紅點更新信息提示示例代碼
應用市場很多應用程序中都會看見一些數字紅點提示的效果,如QQ、微信以及一些提示更新應用的APP,以達到更好的提示功能的應用,本文將介紹一開源控件的使用實現紅點更新信息提示
《Android動畫高手成長記》跳跳球效果
在介紹本文動畫效果實現之前,先來介紹屬性動畫相關的幾個知識點。ValueAnimator與ObjectAnimator。 Interpolator插值器與TypeEval
Android-Universal-Image-Loader 圖片異步加載類庫的使用
開發App過程中,免不了要進行網絡請求操作進行數據交換,比如下載圖片,如果自己寫一個下載圖片的類進行操作的話,要考慮太多太多內容,必須線程池,內存溢出,圖片磁盤緩存操作,
Android 自動化測試經驗分享 UiObejct.getFromParent()的使用方法
1. UiObejct.getFromParent()的用法:從這個名字就知道,就是從當前對象的父對象中查找想要的子對象,該子對象和當前對象應該是同一層級。如上圖所示:M