在Android 4.0及更高版本中,应用需要用户的明确同意才能读取他们的短信。在您的应用中,首先需要在应用的清单文件中添加 “READ_SMS”权限:
<uses-permission android:name="android.permission.READ_SMS"/>
然后,在您的应用需要读取短信的时候,需要动态请求用户权限:
if (checkSelfPermission(Manifest.permission.READ_SMS)
!= PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_SMS},
MY_PERMISSIONS_REQUEST_READ_SMS);
}
在权限被用户授权后,您就可以读取短信数据:
Uri smsUri = Uri.parse("content://sms/inbox");
Cursor cursor = getContentResolver().query(smsUri, null, null, null, null);
while(cursor.moveToNext()) {
String address = cursor.getString(cursor.getColumnIndex("address"));
String body = cursor.getString(cursor.getColumnIndexOrThrow("body"));
// do something
}
请注意,因为隐私问题,Google在Android Q(10)开始不再允许应用读取短信日志,除非应用设置为默认的短信应用。所以在Android Q及以后的版本,上述代码可能无法正常工作。
Android 4.0读取短信功能需要调用SMS相关API,主要步骤如下:
1)首先,你需要在AndroidManifest.xml文件中添加READ_SMS权限,以便你的应用程序可以读取用户的短信。
<uses-permission android:name="android.permission.READ_SMS"/>
2)然后,你可以通过以下方式读取短信:
Uri uri = Uri.parse("content://sms/inbox");
Cursor c= getContentResolver().query(uri, null, null ,null,null);
startManagingCursor(c);
// Read the sms data and store it in the list
if(c.moveToFirst()) {
for(int i=0; i < c.getCount(); i++) {
SMSData sms = new SMSData();
sms.setBody(c.getString(c.getColumnIndexOrThrow("body")).toString());
sms.setNumber(c.getString(c.getColumnIndexOrThrow("address")).toString());
smsList.add(sms);
c.moveToNext();
}
}
c.close();
以上代码首先从sms/inbox的Uri中得到一个cursor,然后遍历cursor并将数据存储在SMSData列表中。SMSData是一个简单的类,包括了短信的body和number。
注:“number”表示发送短信者的手机号,“body”表示短信内容。
请注意,这只会读取收到的短信,如果你希望读取已发送的短信,你可以改变uri为”content://sms/sent”。
还需要引起注意的是,从Android 4.4(API level 19)开始,只有默认的短信应用才能对SMS数据库有写入权限。其他应用只允许读取短信。同时,在安卓Q 或以上版本,默认短信应用需要添加sms相关权限,比如:
<uses-permission
android:name="android.permission.WRITE_SMS"
android:maxSdkVersion="28" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
发布者:luotuoemo,转转请注明出处:https://www.jintuiyun.com/166563.html