异常内容
java.lang.SecurityException: Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/ from pid=24847, uid=10064 requires android.permission.READ_SMS, or grantUriPermission()
at android.content.ContentProvider.enforceReadPermissionInner(ContentProvider.java:605)
at android.content.ContentProvider$Transport.enforceReadPermission(ContentProvider.java:480)
at android.content.ContentProvider$Transport.query(ContentProvider.java:211)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:112)
at android.os.Binder.execTransact(Binder.java:453)
情况说明
sdk 23,在AndroidManifest.xml中,已经配置了<uses-permission android:name="android.permission.READ_SMS" />
问题分析
权限问题
解决办法
原因是sdk23对应用程序权限做出了改动,有两种解决办法:
1.使用sdk22开发,并且运行此程序的android虚拟机或者是手机系统6.0以下。
2.使用ContentResolver之前,输入如下代码,进行权限校验。加了**的代码是需要添加的代码(第5行,18-24行)
public class MainActivity extends AppCompatActivity {
private TextView tvSms;
private TextView tvDes;
private String text = "";
**final private int REQUEST_CODE_ASK_PERMISSIONS = 123;**
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvSms = (TextView) findViewById(R.id.tv_sms);
tvDes = (TextView) findViewById(R.id.tv_des);
}
//点击Button时触发的方法
public void readSMS(View view) {
//查询系统信息的uri
Uri uri = Uri.parse("content://sms/");
**if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
int hasReadSmsPermission = checkSelfPermission(Manifest.permission.READ_SMS);
if (hasReadSmsPermission != PackageManager.PERMISSION_GRANTED) {
requestPermissions(new String[]{Manifest.permission.READ_SMS}, REQUEST_CODE_ASK_PERMISSIONS);
return;
}
}**
//获取ContentResolver对象
ContentResolver resolver = getContentResolver();
//通过ContentResolver对象查询系统短信
Cursor cursor = resolver.query(uri, new String[]{ "_id","address",
"type","body", "date"}, null, null, null);
List<SmsInfo> smsInfos = new ArrayList<SmsInfo>();
if (cursor != null && cursor.getCount() > 0) {
tvDes.setVisibility(View.VISIBLE);
while (cursor.moveToNext()) {
int _id = cursor.getInt(0);
String address = cursor.getString(1);
int type = cursor.getInt(2);
String body = cursor.getString(3);
long date = cursor.getLong(4);
SmsInfo smsInfo = new SmsInfo(_id, address, type, body, date);
smsInfos.add(smsInfo);
}
cursor.close();
}
//将查询到的短信内容显示到界面上
for (int i = 0; i < smsInfos.size(); i++) {
text += "手机号码:" + smsInfos.get(i).getAddress() + "\n";
text += "短信内容:" + smsInfos.get(i).getBody() + "\n\n";
tvSms.setText(text);
}
}
}