内容提供者之-获取通话记录
权限:
<uses-permission android:name="android.permission.WRITE_CALL_LOG"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
获取通话记录:下面包括 查询与修改
/*目的:获取通话记录,步骤: 1.初始化控件 2.初始化数据 1.获得contentResolver 2.获得访问短信内容查询的uri 3.调用内容提供者的查询方法,并得到结果 4.解析cursor得到数据,封装成list 5.实现适配器 6.设置适配器 */ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private ListView lvCalls; private List<Call> callDatalist; private ContentResolver contentResolver; //申明通话记录的uri(通过uri才能访问到通话记录的数据库) private Uri calllogUri= CallLog.Calls.CONTENT_URI; private CallLogBaseAdapter callLogBaseAdapter;//ListView适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 得到内容分解者 contentResolver = getContentResolver(); lvCalls = (ListView) findViewById(R.id.lv_calls); // 查询通话记录的数据库数据 callDatalist = getCallsListFromDb(); System.out.println(callDatalist); callLogBaseAdapter = new CallLogBaseAdapter();// 创建适配器 lvCalls.setAdapter(callLogBaseAdapter); // 长按通话记录,可以编辑通话记录 lvCalls.setOnItemLongClickListener(new OnItemLongClickListener() { private AlertDialog alertDialog;// 用对话框显示选项 // 长按监听 @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { Builder builder = new AlertDialog.Builder(MainActivity.this); //获取要添加到自定义里面的view View dialogView = View.inflate(MainActivity.this,R.layout.dialog_calllog_edit, null); Button btnDelete = (Button) dialogView.findViewById(R.id.btn_delete); Button btnUpdate = (Button) dialogView.findViewById(R.id.btn_update); // 删除某一条通话记录 btnDelete.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* * 参数说明: 根据_id进行删除 Uri url, 删除通话记录的uri String where, * where条件 String[] selectionArgs 替换where条件中的?占位符 */ contentResolver.delete(calllogUri, "_id = ?", new String[] { callDatalist.get(position) .get_id() + "" }); alertDialog.dismiss(); // 刷新界面 callDatalist.removeAll(callDatalist); callDatalist.addAll(getCallsListFromDb()); callLogBaseAdapter.notifyDataSetChanged(); } }); // 修改通话记录的数据 btnUpdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ContentValues contentValues = new ContentValues(); contentValues.put("number", "123456"); contentValues.put("duration", 123); contentValues.put("type", 2); /* * 更新数据,参数说明:Uri url, 修改通话记录的uriContentValues values, * 修改的值String where, where条件String[] selectionArgs * 替换where条件中的?占位符 */ contentResolver.update(calllogUri, contentValues, "_id = ?", new String[] { callDatalist.get(position) .get_id() + "" }); alertDialog.dismiss();// 销毁对话框 // 刷新界面 callDatalist.removeAll(callDatalist); callDatalist.addAll(getCallsListFromDb()); callLogBaseAdapter.notifyDataSetChanged(); } }); builder.setView(dialogView); alertDialog = builder.create(); alertDialog.show(); return true; } }); } /** * 查询数据库数据 */ private List<Call> getCallsListFromDb() { ArrayList<Call> dataList = new ArrayList<Call>(); // 查询通话记录, 根据uri,获取指定的数据 Cursor cursor = contentResolver.query(calllogUri, new String[] { "_id", "number", "date", "duration", "type", }, null, null, null); Call call; while (cursor.moveToNext()) { call = new Call(); call.set_id(cursor.getInt(cursor.getColumnIndex("_id"))); call.setNumber(cursor.getString(cursor.getColumnIndex("number"))); call.setDuration(cursor.getInt(cursor.getColumnIndex("duration"))); call.setDate(cursor.getLong(cursor.getColumnIndex("date"))); call.setType(cursor.getInt(cursor.getColumnIndex("type"))); dataList.add(call); } return dataList; } /** * 格式话时间 * * @param date * @return */ public String getDateFormat(long date) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss"); return simpleDateFormat.format(new Date(date)); } class CallLogBaseAdapter extends BaseAdapter { @Override public int getCount() { return callDatalist.size(); } @Override public Object getItem(int position) { return callDatalist.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; ViewHolder viewHolder; if (view == null) { viewHolder = new ViewHolder(); view = View.inflate(MainActivity.this,R.layout.listview_calllog_item, null); viewHolder.tvNumber = (TextView) view.findViewById(R.id.tv_number); viewHolder.tvDuration = (TextView) view.findViewById(R.id.tv_duration); viewHolder.tvDate = (TextView) view.findViewById(R.id.tv_date); viewHolder.tvType = (TextView) view.findViewById(R.id.tv_type); view.setTag(viewHolder); } else { viewHolder = (ViewHolder) view.getTag(); } // 填充数据 Call callLog = callDatalist.get(position); viewHolder.tvNumber.setText(callLog.getNumber()); // 先判断类型 String type = "打出去"; if (callLog.getType() == 1) { type = "接听"; } else if (callLog.getType() == 2) { type = "拨出"; } viewHolder.tvType.setText(type); viewHolder.tvDuration .setText("通话时间为" + callLog.getDuration() + "秒"); // 先把时间转换成时间格式 viewHolder.tvDate.setText(getDateFormat(callLog.getDate())); return view; } } class ViewHolder { public TextView tvNumber, tvType, tvDate, tvDuration; } }
通话记录封装类:Call.java
public class Call { private int _id;//通话记录里面数据库的id号 private String number;//电话号码 private long date;//时间 private int type;//类型 private int duration;//通话时长 public int get_id() { return _id; } public void set_id(int _id) { this._id = _id; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } 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 int getDuration() { return duration; } public void setDuration(int duration) { this.duration = duration; } @Override public String toString() { return "Call [_id=" + _id + ", number=" + number + ", date=" + date + ", type=" + type + ", duration=" + duration + "]"; } }
效果图:
可见结果一致