本人昨天在网上找到获取短信电话号的方法,但是没有找到得到姓名的方法,也就是如果有短信是通信录中的,那么就显示姓名,而不显示电话号了,在这里做一个简单的应用说明
思路:将手机通讯录中手机号码以及练习人姓名获取到,存放在数据库中,在获得短信时,通过电话号码查询数据库,如果是手机联系人中的就显示姓名,否则显示号码
这里获得通信录联系人的姓名和手机号码存入数据库的代码我就不放出来了
首先,我在数据库中存储了从内容提供者中的到通讯录内容
这是MessageFragment.java中的代码
package com.example.dllo.telephonebook.fragment;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Telephony;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.dllo.telephonebook.R;
import com.example.dllo.telephonebook.adapter.MessageRecyclerAdapter;
import com.example.dllo.telephonebook.bean.MessageBean;
import com.example.dllo.telephonebook.database.SQLTools;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Created by dllo on 16/8/13.
*/
public class MessageFragment extends Fragment {
private Context context;
private RecyclerView recyclerView;
private List datas;
private MessageRecyclerAdapter adapter;
private View view;
private ContentResolver contentResolver;
//标题
private TextView topTitleTv;
private ImageView rightOne;//从右边数第一个
private ImageView rightTwo;
private ImageView rightThree;
//s设置所有短信字符串
private String uriSms = "content://sms";
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.context = context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_message, container, false);
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
initView();
super.onActivityCreated(savedInstanceState);
//各种初始化
contentResolver = context.getContentResolver();
recyclerView = (RecyclerView) view.findViewById(R.id.message_recyclerview);
datas = new ArrayList<>();
adapter = new MessageRecyclerAdapter(context);
//获取数据
datas = getMessageDatas();
adapter.setDatas(datas);
recyclerView.setAdapter(adapter);
//设置布局管理器给recyclerView
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, true);
recyclerView.setLayoutManager(linearLayoutManager);
}
//初始化标题
private void initView() {
topTitleTv = (TextView) view.findViewById(R.id.item_callog_and_contacts);
rightOne = (ImageView) view.findViewById(R.id.item_right_one);
rightTwo = (ImageView) view.findViewById(R.id.item_right_two);
rightThree = (ImageView) view.findViewById(R.id.item_right_three);
topTitleTv.setText("短信");
rightTwo.setImageResource(R.drawable.item_top_bar_search);
rightThree.setImageResource(R.drawable.item_top_bar_setting);
rightOne.setImageResource(R.drawable.item_top_bar_writesms);
}
//获得数据集合
public List getMessageDatas() {
List beans = new ArrayList<>();
Cursor cursor = contentResolver.query(Uri.parse(uriSms), null, null, null, null);
while (cursor.moveToNext()) {
int imgId = R.mipmap.avatar_default;
//在这里需要对日期进行处理
String date = cursor.getString(cursor.getColumnIndex(Telephony.Sms.DATE));
//对日期进行处理
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Long timeLong = Long.valueOf(date);
Date date1 = new Date(timeLong);
String formatDate = sdf.format(date1);
String number = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
//如果是联系人中的号码就显示联系人姓名
SQLTools sqlTools = new SQLTools(context);
String name = null;
if (!sqlTools.ifHasNumberDatas(number)) {
name = number;
} else {
name = sqlTools.queryName(number);
}
//Log.d("sss", name);
String content = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
beans.add(new MessageBean(imgId, name, number, content, formatDate));
}
return beans;
}
}
package com.example.dllo.telephonebook.bean;
/**
* Created by dllo on 16/8/23.
*/
public class MessageBean {
private int imgId;
private String name;
private String number;
private String Content;
private String Date;
public MessageBean() {
}
public MessageBean(int imgId, String name, String number, String content, String date) {
this.imgId = imgId;
this.name = name;
this.number = number;
Content = content;
Date = date;
}
public int getImgId() {
return imgId;
}
public void setImgId(int imgId) {
this.imgId = imgId;
}
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 getContent() {
return Content;
}
public void setContent(String content) {
Content = content;
}
public String getDate() {
return Date;
}
public void setDate(String date) {
Date = date;
}
}
这是数据库操作工具,核心的代码就在其中,
ifHasNumberDatas(String str)
这个方法是重点,其他方法并不是都用到
package com.example.dllo.telephonebook.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import android.widget.Toast;
import com.example.dllo.telephonebook.bean.ContactFreeBean;
import java.util.ArrayList;
import java.util.List;
/**
* Created by dllo on 16/8/17.
*/
public class SQLTools {
/**
* 数据库帮助类,用来创建数据库
*/
private SQLHelper sqlHelper;
private SQLiteDatabase database;
private Context context;
/**
* 初始化
*
* @param context
*/
public SQLTools(Context context) {
this.context = context;
//创建数据库
sqlHelper = new SQLHelper(context, SQLValues.DB_NAME, null, SQLValues.CURRENT_VERSION);
sqlHelper.setTableName(SQLValues.TABLE_CONTACT_NAME);
//将数据库写的权限给database
database = sqlHelper.getWritableDatabase();
}
/**
* 插入数据库数据
* 1.插入一行数据
* 2.插入多行数据到数据库
*/
/**
* 插入一行数据
*
* @param contactBean 传入需要插入数据库的一条数据
*/
public void insert(ContactFreeBean contactBean) {
//在这里进行判断,如果姓名存在或者电话号码存在的就不能进行插入了
//根据条件进行查询,如果为空则可以进行插入
if (!ifHasDatas(contactBean)) {
int img = contactBean.getImgId();
String name = contactBean.getName();
String number = contactBean.getNumber();
//在这里将穿进来的电话号码进行格式化
number = fomatNum(number);
ContentValues contentValues = new ContentValues();
contentValues.put(SQLValues.COLUMN_CONTACT_IMG, img);
contentValues.put(SQLValues.COLUMN_CONTACT_NAME, name);
contentValues.put(SQLValues.COLUMN_CONTACT_NUMBER, number);
database.insert(SQLValues.TABLE_CONTACT_NAME, null, contentValues);
} else {
Log.d("xxx", "数据库插入一个数据的方法,这个数据已经存在了!");
}
}
/**
* 插入集合到数据库
*
* @param contactBeans 传入插入的数据集合
*/
public void insert(List contactBeans) {
//对于每一条数据,首先判断数据库中是否存在,如果存在插不进去,如果不存在就插进去
//遍历foreach循环的从集合中拿出每一项
for (ContactFreeBean contactBean : contactBeans) {
insert(contactBean);
}
}
/**
* 写一个方法,用来判断数据库中是否存在该数据
*/
public Boolean ifHasDatas(ContactFreeBean contactBean) {
//查询条件
String selections = SQLValues.COLUMN_CONTACT_NAME + " = ?";
String[] args = new String[]{contactBean.getName()};
//根据条件进行查询,如果为空则返回false
if (query(selections, args).size() == 0) {
Log.d("xxx", "false");
return false;
} else {
Log.d("xxx", "true");
return true;
}
}
/**
* 写一个方法,通过电话号码用来判断数据库中是否存在该数据
*/
public Boolean ifHasNumberDatas(String str) {
//将的到的电话号码格式化
str = fomatNum(str);
//查询条件
String selections = SQLValues.COLUMN_CONTACT_NUMBER + " = ?";
String[] args = new String[]{str};
//根据条件进行查询,如果为空则返回false
if (query(selections, args).size() == 0) {
Log.d("xxx", "false");
return false;
} else {
Log.d("xxx", "true");
return true;
}
}
/**
* 格式化电话号码的方法
* 去+86,取空格,去-
*
* @param num 传入用户输入的不规则的电话号码
* @return 返回格式化后的电话号
*/
private String fomatNum(String num) {
num = num.replace("+86", "");
num = num.replace(" ", "");
num = num.replace("-", "");
return num;
}
/**
* 查询数据库中的数据
* 1.查询所有数据
* 2.按照条件查询数据
*/
/**
* 查询数据库中的所有数据
*
* @return 返回从数据库中查询的数据
*/
public List query() {
List cbs = new ArrayList<>();
Cursor cursor = database.query(SQLValues.TABLE_CONTACT_NAME, null, null, null, null, null, null);
//如果数据库中有数据存在就会执行
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
ContactFreeBean contactBean = new ContactFreeBean();
contactBean.setImgId(cursor.getInt(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_IMG)));
contactBean.setName(cursor.getString(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_NAME)));
contactBean.setNumber(cursor.getString(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_NUMBER)));
cbs.add(contactBean);
}
} else {
Log.d("xxx", "列表查询时:数据库中没有数据");
}
cursor.close();
return cbs;
}
/**
* 按照条件查询数据库
*
* @param selections 输入数据库列查询条目
* @param args 输入查询条件
* @return 返回根据条件得到的数据
*/
public List query(String selections, String[] args) {
List beans = new ArrayList<>();
Cursor cursor = database.query(SQLValues.TABLE_CONTACT_NAME, null, selections, args, null, null, null);
//如果数据库中存在查询的数据存在就会执行
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
ContactFreeBean contactBean = new ContactFreeBean();
contactBean.setImgId(cursor.getInt(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_IMG)));
contactBean.setName(cursor.getString(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_NAME)));
contactBean.setNumber(cursor.getString(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_NUMBER)));
beans.add(contactBean);
}
} else {
Log.d("xxx", "数据库中不存在该数据!");
}
cursor.close();
return beans;
}
/**
* 通过电话号码查询到联系人的姓名
*/
public String queryName(String number) {
String name = null;
number = fomatNum(number);
List beans = new ArrayList<>();
Cursor cursor = database.query(SQLValues.TABLE_CONTACT_NAME, null, SQLValues.COLUMN_CALLLOG_NUMBER+" = ?", new String[]{number}, null, null, null);
//如果数据库中存在查询的数据存在就会执行
if (cursor.getCount() > 0) {
while (cursor.moveToNext()) {
name = cursor.getString(cursor.getColumnIndex(SQLValues.COLUMN_CONTACT_NAME));
}
} else {
Log.d("xxx", "数据库中不存在该数据!");
}
cursor.close();
return name;
}
/**
* 修改数据
*
* @param selection 哪一列 条件
* @param args 具体的条件内容
* @param newCv 新的ContentValues
*/
public void update(String selection, String[] args, ContentValues newCv) {
//修改数据
database.update(SQLValues.TABLE_CONTACT_NAME, newCv, selection, args);
}
/**
* 删除数据
*/
public void delete(String sele, String[] args) {
database.delete(SQLValues.TABLE_CONTACT_NAME, sele, args);
}
/**
* 通过名字判断数据库是否有数据
*
* @param name
* @return
*/
private boolean ifHaveTheName(String name) {
//以这个名字作为条件查询数据库
Cursor cursor = database.query(SQLValues.TABLE_CONTACT_NAME, null, SQLValues.COLUMN_CONTACT_NAME + "=?", new String[]{name}, null, null, null);
//获取游标的个数(代表数据的个数)
int size = cursor.getCount();
cursor.close();
if (size != 0) {
return true;
} else {
return false;
}
//return cursor.moveToNext();
}
}