Android使用ContentProvider实现查看系统短信功能
Android系统中,系统短信是非常重要的一部分,很多应用需要访问系统短信。而为了保证数据的安全性,Android系统并没有给普通应用程序直接读取系统短信的权限,而是通过ContentProvider提供系统短信的访问。本文将介绍如何使用ContentProvider实现查看系统短信功能。
一、ContentProvider简介
ContentProvider是Android中的一种数据管理方式,它可以为应用程序提供数据访问接口,以实现对数据的共享和保护。ContentProvider通过特定的Uri来表示数据,应用程序可以通过ContentResolver对ContentProvider进行访问,进行数据的增删改查等操作。
在Android系统中,很多数据都是通过ContentProvider进行管理的,比如联系人、系统短信、音乐等。ContentProvider的使用能够保证数据的安全性,同时也能提高程序的效率,因此它在Android中是非常重要的。
二、系统短信的ContentProvider
系统短信是Android系统中的一个重要数据,和联系人一样,它也有自己的ContentProvider来进行管理。系统短信的ContentProvider的Uri为"content://sms"。通过这个Uri,应用程序可以访问系统短信的相关信息,比如发送人、收件人、发送时间、短信内容等。
下面我们将通过实例来演示如何使用ContentProvider来查看系统短信。
三、实现查看系统短信功能
1、添加权限
在使用ContentProvider之前,需要添加相应的权限。打开AndroidManifest.xml文件,添加以下权限:
<uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.WRITE_SMS" />
2、创建布局文件
打开activity_main.xml文件,创建一个ListView来显示系统短信:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/smsListView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:dividerHeight="1dp"
android:layout_marginTop="10dp"
android:divider="@android:color/darker_gray" />
</LinearLayout>
3、创建Activity
创建一个MainActivity,并初始化ListView:
public class MainActivity extends Activity {
private ListView smsListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsListView = (ListView) findViewById(R.id.smsListView);
}
}
4、创建数据模型
创建一个类SmsModel,用来表示从系统短信ContentProvider中读取到的短信信息:
public class SmsModel {
private String id;
private String address;
private String body;
private String date;
public SmsModel(String id, String address, String body, String date) {
this.id = id;
this.address = address;
this.body = body;
this.date = date;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
5、创建Adapter
创建一个SmsAdapter,用来将短信数据展示在ListView中:
public class SmsAdapter extends BaseAdapter {
private List<SmsModel> smsList;
private Context context;
public SmsAdapter(Context context, List<SmsModel> smsList) {
this.smsList = smsList;
this.context = context;
}
@Override
public int getCount() {
return smsList.size();
}
@Override
public Object getItem(int position) {
return smsList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.sms_item, null);
viewHolder = new ViewHolder();
viewHolder.addressTextView = (TextView) convertView.findViewById(R.id.addressTextView);
viewHolder.bodyTextView = (TextView) convertView.findViewById(R.id.bodyTextView);
viewHolder.dateTextView = (TextView) convertView.findViewById(R.id.dateTextView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
SmsModel smsModel = smsList.get(position);
viewHolder.addressTextView.setText(smsModel.getAddress());
viewHolder.bodyTextView.setText(smsModel.getBody());
viewHolder.dateTextView.setText(smsModel.getDate());
return convertView;
}
static class ViewHolder {
public TextView addressTextView;
public TextView bodyTextView;
public TextView dateTextView;
}
}
其中sms_item.xml文件为ListView的Item布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="vertical">
<TextView
android:id="@+id/addressTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/dateTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_marginLeft="10dp"/>
<TextView
android:id="@+id/bodyTextView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="18sp"
android:layout_marginLeft="10dp"
android:maxLines="1"
android:singleLine="true"/>
</LinearLayout>
6、读取系统短信数据
在MainActivity中使用ContentResolver读取系统短信数据,并使用SmsAdapter展示在ListView中:
public class MainActivity extends Activity {
private ListView smsListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
smsListView = (ListView) findViewById(R.id.smsListView);
List<SmsModel> smsList = getSmsList();
SmsAdapter smsAdapter = new SmsAdapter(this, smsList);
smsListView.setAdapter(smsAdapter);
}
private List<SmsModel> getSmsList() {
List<SmsModel> smsList = new ArrayList<>();
ContentResolver cr = getContentResolver();
String[] projection = new String[]{"_id", "address", "body", "date"};
Cursor cur = cr.query(Uri.parse("content://sms"), projection, null, null, "date desc");
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex("_id"));
String address = cur.getString(cur.getColumnIndex("address"));
String body = cur.getString(cur.getColumnIndex("body"));
String date = cur.getString(cur.getColumnIndex("date"));
SmsModel smsModel = new SmsModel(id, address, body, getDate(Long.parseLong(date)));
smsList.add(smsModel);
}
return smsList;
}
private String getDate(long time) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return format.format(new Date(time));
}
}
以上就是使用ContentProvider实现查看系统短信功能的步骤,通过ContentProvider和ContentResolver,我们可以很方便地访问系统短信数据。除此之外,ContentProvider还可以用来管理其他的数据,比如联系人、音乐等。ContentProvider的使用将会更加方便和安全地管理Android应用中的数据。
