欢迎访问宙启技术站
智能推送

Android使用ContentProvider实现查看系统短信功能

发布时间:2023-05-16 11:14:34

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应用中的数据。