Permission Denial: reading com.android.providers.telephony.SmsProvider uri content://sms/ 异常解决

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44276072/article/details/102695321

异常内容

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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44276072/article/details/102695321