在Android设备中,监听收到的短信内容是一个常见的需求,尤其是在需要处理短信验证码或进行短信通知监控的场景下,以下是两种主要的实现方式:
1、通过广播接收器(Broadcast Receiver)监听短信
2、通过ContentObserver监听短信数据库变化
方法一:通过广播接收器(Broadcast Receiver)监听短信
1. 添加必要的权限
在AndroidManifest.xml文件中添加以下权限:
<uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.READ_SMS" />
2. 注册Broadcast Receiver
在AndroidManifest.xml中注册一个Broadcast Receiver:
<receiver android:name=".SmsReceiver"> <intent-filter android:priority="2147483647"> <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver>
注意:优先级设置为最大值2147483647,以确保在其他应用拦截之前接收到广播。
3. 创建SmsReceiver类
创建一个继承自BroadcastReceiver的类来处理接收到的短信:
import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; public class SmsReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); if (null != bundle) { Object[] pdus = (Object[]) bundle.get("pdus"); for (Object pdu : pdus) { SmsMessage msg = SmsMessage.createFromPdu((byte[]) pdu); String sender = msg.getDisplayOriginatingAddress(); // 发件人地址 String messageBody = msg.getMessageBody(); // 短信内容 Log.i("SmsReceiver", "Sender: " + sender + ", Message: " + messageBody); // 在这里可以添加更多处理逻辑,如上传服务器等 } } } }
方法二:通过ContentObserver监听短信数据库变化
1. 添加必要的权限
同样需要在AndroidManifest.xml文件中添加权限:
<uses-permission android:name="android.permission.READ_SMS" />
2. 创建ContentObserver子类
创建一个继承自ContentObserver的类,用于监听短信数据库的变化:
import android.database.ContentObserver; import android.database.Cursor; import android.net.Uri; import android.os.Handler; import android.util.Log; public class SmsContentObserver extends ContentObserver { private Context context; public SmsContentObserver(Context context, Handler handler) { super(handler); this.context = context; } @Override public void onChange(boolean selfChange, Uri uri) { super.onChange(selfChange, uri); // 在这里处理短信数据库变化的逻辑 Log.i("SmsContentObserver", "SMS database changed"); // 读取最新的短信内容并进行处理 Uri inboxUri = Uri.parse("content://sms/inbox"); Cursor cursor = context.getContentResolver().query(inboxUri, null, null, null, null); if (cursor != null && cursor.moveToFirst()) { do { long threadId = cursor.getLong(cursor.getColumnIndexOrThrow("thread_id")); String address = cursor.getString(cursor.getColumnIndexOrThrow("address")); String body = cursor.getString(cursor.getColumnIndexOrThrow("body")); Log.i("SmsContentObserver", "Thread ID: " + threadId + ", Address: " + address + ", Body: " + body); } while (cursor.moveToNext()); cursor.close(); } } }
3. 注册ContentObserver
在需要的地方注册ContentObserver,例如在Activity的onCreate方法中:
import android.database.ContentObserver; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import androidx.appcompat.app.AppCompatActivity; public class MainActivity extends AppCompatActivity { private SmsContentObserver smsContentObserver; private Uri SMS_INBOX_URI = Uri.parse("content://sms/inbox"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); smsContentObserver = new SmsContentObserver(this, new Handler()); getContentResolver().registerContentObserver(SMS_INBOX_URI, true, smsContentObserver); } }
方法 | 优点 | 缺点 |
广播接收器 | 操作简单,适合简单应用 | 可能被其他应用截断,无法获取历史短信 |
ContentObserver | 可获取所有短信,包括已读和未读 | 实现稍复杂,需要处理数据库权限 |
相关问题与解答
问题1:如何确保广播接收器在应用被杀死后仍然能接收短信?
答:为了确保广播接收器在应用被杀死后仍然能接收短信,可以将Broadcast Receiver注册为动态注册,并在前台服务中保持应用活跃状态,这样即使应用被杀死,前台服务仍会运行,从而保证广播接收器能够继续工作。
问题2:如何处理短信内容的隐私和安全问题?
答:在处理短信内容时,必须严格遵守隐私政策和用户数据保护法规,应明确告知用户应用程序将访问短信内容,并在必要时请求用户授权,应采取加密措施保护短信内容,防止敏感信息泄露,避免将短信内容上传到不安全的服务器或存储在不安全的位置。
小伙伴们,上文介绍了“android监听收到短信内容”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/637273.html