内容提供者之-获取通话记录

权限:

<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 + "]";
    }
}

效果图:

可见结果一致

posted @ 2016-08-10 17:38  ts-android  阅读(1257)  评论(0编辑  收藏  举报