在Android编程中,获取短信内容可以采用ContentObserver记录系统短信数据库的变化以达到获取新短信内容的目的。以下是一个简单的例子:
首先,需要在AndroidManifest.xml中声明READ_SMS权限:
<uses-permission android:name="android.permission.READ_SMS"/>
然后,在Activity中创建一个内部类,继扭ContentObserver类,并在onChange方法中处理短信内容获取:
class SMSObserver extends ContentObserver {
public SMSObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri uri = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uri, null, null ,null,null);
if(c != null) {
if(c.moveToNext()){
String body = c.getString(c.getColumnIndex("body")); //获取短信内容
// 在这里对body进行处理
}
c.close();
}
}
}
然后在onCreate方法中注册这个观察者:
SMSObserver smsObserver = new SMSObserver(new Handler());
getContentResolver().registerContentObserver(Uri.parse("content://sms"), true, smsObserver);
以上就是基本的处理过程。需要注意的是从Android 6.0开始,READ_SMS权限被定义为危险权限,可能需要在运行时进行权限请求。
在Android上获取短信内容需要用到SMS系统提供的ContentProvider,获取短信的功能在权限方面也有严格的限制,仅限于默认的短信应用。
以下是一个简单的示例代码,用于获取收件箱中所有短信的内容:
public String getSmsFromPhone() {
Uri SMS_ALL = Uri.parse("content://sms/");
StringBuilder smsBuilder = new StringBuilder();
Cursor cur = getContentResolver().query(SMS_ALL, null, null, null, null);
// 遍历游标
while (cur.moveToNext()) {
// 遍历短信数据库的列,获取短信内容
for (int i = 0; i < cur.getColumnCount(); i++) {
smsBuilder.append(cur.getColumnName(i)).append("=").append(cur.getString(i)).append("n");
}
smsBuilder.append("================================");
}
return smsBuilder.toString();
}
注意:从Android 6.0开始,读取短信的权限被纳入了危险权限,需要进行运行时权限检查。从Android 4.4开始,只有默认的短信应用才能够读取短信。如果你需要读取短信,在AndroidManifest.xml添加以下权限:
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
然后在代码中进行运行时权限检查:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, 1);
}
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/161108.html