基于Android的短信应用开发(三)——读取手机短信

         在上一次的学习中,我们读取了手机联系人并将其显示在短信界面上,而接下来,我们将开始读取手机短信了,下面先来看一下最终运行效果图吧。


       首先看一下手机短信数据库,访问路径是:/data/data/com.android.providers.telephony/databases/mmssms.db,用SQLiteExpertPers打开后可以看到数据库中的表,下面我们来看一下其中的sms表,threads表和canonical_addresses表。
1.sms表:
thread_id:与threads表的_id相对应
address:短信会话人号码
body:短信内容
person:通过SQLiteExpert工具查看,发现无论是否是联系人该列都为null
contact_name:通过SQLiteExpert工具查看,结果为:号码+空格+联系人名称(若为联系人)
status:-1表示短信已接受
read:0为未读,1为已读
type:1表示收到的短信,通过SQLiteExpert工具查看此数据库时发出的信息type值为6

2.threads表
recipient_ids:指向canonical_addresses表的_id字段,通过canonical_addresses表的address字段
可获取联系人号码
snippest:最后收到/发出的信息
message_count:该会话的消息数量

3.canonical_addresses表
_id:与thread表的recipient_ids相对应
address:电话号码


       相对于上一个版本,这次工程新增了SMSInfo类作为短信数据库表对应的实体类,在适配器类MessageListAdapter 中,定义新方法getSMSInfo()来获取sms表中的短信记录,并在 MainActivity中调用该方法。另外,在实际读取短信记录时,发现之前的页面布局显示有问题,如在短信列表页面,当某条短信内容较长时,应该采用单行显示,超过一行的部分应该被隐藏,因此对主布局文件activity_main.xml和列表项布局文件list_item.xml也做了修改,如下文所示。另外,与读取联系人一样,读取短信同样需要AndroidManifest.xml文件中配置手机短信读取权限,在文件中增加如下声明:
       <uses-permission android:name="android.permission.READ_SMS"/>
在MessageListAdapter中进行查询时,使用了query方法,我们来看一下这个方法的用法中各参数含义。
     query(Uri uri,String[] project,String selection,String selectionArgs,String sortOrder):
              uri:要读取数据对应的Uri
              projection:需要读取的字段
              selection:数据检索的条件
              selectionArgs:数据检索条件的参数
              sortOrder:对查询结果排序所依据的字段
最后给出程序代码如下:

1.MainActivity.java

<span style="font-size:14px;">package com.example.mymessageproject;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {
    private ListView messageListView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        messageListView = (ListView)this.findViewById(R.id.messageListView);    
        MessageListAdapter adapter = 
  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是获取Android手机中所有短信的实现代码。需要注意的是,需要在AndroidManifest.xml文件中添加读取短信的权限。 ```java import android.Manifest; import android.content.ContentResolver; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.Telephony; import android.util.Log; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final int PERMISSIONS_REQUEST_READ_SMS = 100; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 检查权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, PERMISSIONS_REQUEST_READ_SMS); } else { readSms(); } } private void readSms() { Uri smsUri = Telephony.Sms.CONTENT_URI; ContentResolver contentResolver = getContentResolver(); Cursor cursor = contentResolver.query(smsUri, null, null, null, null); if (cursor == null) { Log.d(TAG, "读取短信失败"); return; } while (cursor.moveToNext()) { // 读取短信内容及发送方号码 String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS)); String body = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY)); Log.d(TAG, "address: " + address + ", body: " + body); } cursor.close(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { if (requestCode == PERMISSIONS_REQUEST_READ_SMS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { readSms(); } else { Log.d(TAG, "权限被拒绝"); } } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值