Android 读取手机短信的实现流程

流程图

flowchart TD
    A(开始)-->B(获取短信权限)
    B-->C(查询短信)
    C-->D(遍历短信列表)
    D-->E(获取短信内容)
    E-->F(显示短信内容)
    F-->G(结束)

步骤详解

  1. 获取短信权限:首先,我们需要获取读取短信的权限。在AndroidManifest.xml文件中添加以下代码:
<uses-permission android:name="android.permission.READ_SMS" />
  1. 查询短信:使用ContentResolver类来查询短信。在你的Activity或Fragment中,添加以下代码:
String[] projection = new String[]{"_id", "address", "body"};
Uri uri = Uri.parse("content://sms/inbox");
Cursor cursor = getContentResolver().query(uri, projection, null, null, null);

这段代码创建了一个投影(projection),指定了需要查询的短信字段。然后,我们使用ContentResolver的query方法来查询短信,参数uri指定了查询的Uri,这里是短信收件箱的Uri。

  1. 遍历短信列表:通过Cursor对象遍历短信列表,获取每一条短信的信息。添加以下代码:
if (cursor != null && cursor.moveToFirst()) {
    do {
        // 获取短信内容
        String messageId = cursor.getString(cursor.getColumnIndex("_id"));
        String address = cursor.getString(cursor.getColumnIndex("address"));
        String body = cursor.getString(cursor.getColumnIndex("body"));

        // 显示短信内容
        Log.d("SMS", "短信ID:" + messageId);
        Log.d("SMS", "短信发送方:" + address);
        Log.d("SMS", "短信内容:" + body);
    } while (cursor.moveToNext());
}

这段代码通过游标cursor来遍历短信列表,每一次循环获取一条短信的信息。我们使用getColumnIndex方法来获取对应字段在查询结果中的索引,然后使用getString方法来获取字段的值。

  1. 显示短信内容:在这个例子中,我们使用Log.d方法来打印短信内容到Android Studio的Logcat窗口。你也可以根据自己的需要,将短信内容展示到UI界面上。
Log.d("SMS", "短信ID:" + messageId);
Log.d("SMS", "短信发送方:" + address);
Log.d("SMS", "短信内容:" + body);

完整代码

下面是上述步骤的完整代码示例:

public class MainActivity extends AppCompatActivity {
    @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}, 1);
        } else {
            // 已有权限,读取短信
            readSMS();
        }
    }

    private void readSMS() {
        String[] projection = new String[]{"_id", "address", "body"};
        Uri uri = Uri.parse("content://sms/inbox");
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        
        if (cursor != null && cursor.moveToFirst()) {
            do {
                // 获取短信内容
                String messageId = cursor.getString(cursor.getColumnIndex("_id"));
                String address = cursor.getString(cursor.getColumnIndex("address"));
                String body = cursor.getString(cursor.getColumnIndex("body"));

                // 显示短信内容
                Log.d("SMS", "短信ID:" + messageId);
                Log.d("SMS", "短信发送方:" + address);
                Log.d("SMS", "短信内容:" + body);
            } while (cursor.moveToNext());
        }
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        if (requestCode == 1 && grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户授予短信权限,读取短信
            readSMS();
        } else {
            // 用户拒绝短信权限,处理相应逻辑
        }
    }
}

总结

通过上述流程图和代码,我们可以实现Android读取手机短信的功能