关于真机权限的问题

关于真机权限的问题

老师这里我已经设置了权限,为什么在真机上还是显示没有权限?

31814-31814/com.hala.getdatafromsystemdemo E/AndroidRuntime: FATAL EXCEPTION: main

                                                                                Process: com.hala.getdatafromsystemdemo, PID: 31814

                                                                                java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.SmsProvider from ProcessRecord{7e23845 31814:com.hala.getdatafromsystemdemo/u0a157} (pid=31814, uid=10157) requires android.permission.READ_SMS or android.permission.WRITE_SMS

                                                                                    at android.os.Parcel.readException(Parcel.java:1684)

                                                                                    at android.os.Parcel.readException(Parcel.java:1637)

                                                                                    at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4278)

                                                                                    at android.app.ActivityThread.acquireProvider(ActivityThread.java:5632)

                                                                                    at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2278)

                                                                                    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1533)

                                                                                    at android.content.ContentResolver.query(ContentResolver.java:518)

                                                                                    at android.content.ContentResolver.query(ContentResolver.java:475)

                                                                                    at com.hala.getdatafromsystemdemo.MainActivity$1.onClick(MainActivity.java:29)

                                                                                    at android.view.View.performClick(View.java:5647)

                                                                                    at android.view.View$PerformClick.run(View.java:22462)

                                                                                    at android.os.Handler.handleCallback(Handler.java:754)

                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)

                                                                                    at android.os.Looper.loop(Looper.java:163)

                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6379)

                                                                                    at java.lang.reflect.Method.invoke(Native Method)

                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)

                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

4回答
提问者 慕UI6705487 2018-03-19 16:52:23

报错


03-19 16:43:42.666 32217-32217/com.hala.getdatafromsystemdemo E/AndroidRuntime: FATAL EXCEPTION: main

                                                                                Process: com.hala.getdatafromsystemdemo, PID: 32217

                                                                                java.lang.SecurityException: Permission Denial: opening provider com.android.providers.telephony.SmsProvider from ProcessRecord{f807bbe 32217:com.hala.getdatafromsystemdemo/u0a69} (pid=32217, uid=10069) requires android.permission.READ_SMS or android.permission.WRITE_SMS

                                                                                    at android.os.Parcel.readException(Parcel.java:1684)

                                                                                    at android.os.Parcel.readException(Parcel.java:1637)

                                                                                    at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:4278)

                                                                                    at android.app.ActivityThread.acquireProvider(ActivityThread.java:5632)

                                                                                    at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2278)

                                                                                    at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1533)

                                                                                    at android.content.ContentResolver.query(ContentResolver.java:518)

                                                                                    at android.content.ContentResolver.query(ContentResolver.java:475)

                                                                                    at com.hala.getdatafromsystemdemo.MainActivity$1.onClick(MainActivity.java:43)

                                                                                    at android.view.View.performClick(View.java:5647)

                                                                                    at android.view.View$PerformClick.run(View.java:22462)

                                                                                    at android.os.Handler.handleCallback(Handler.java:754)

                                                                                    at android.os.Handler.dispatchMessage(Handler.java:95)

                                                                                    at android.os.Looper.loop(Looper.java:163)

                                                                                    at android.app.ActivityThread.main(ActivityThread.java:6379)

                                                                                    at java.lang.reflect.Method.invoke(Native Method)

                                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)

                                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)


  • 你在清单文件的注册provider的节点里添加android:exported="true"试一下
    2018-03-19 17:10:45
  • 提问者 慕UI6705487 回复 irista23 #2
    已经添加了
    2018-03-19 19:19:33
  • irista23 回复 提问者 慕UI6705487 #3
    权限代码没看出什么问题,你在权限代码那下个断点跟踪一下,看看权限申请执行是否正常
    2018-03-20 09:29:48
提问者 慕UI6705487 2018-03-19 16:51:47
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package com.hala.getdatafromsystemdemo;
 
import android.Manifest;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.Settings;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Toast;
 
public class MainActivity extends AppCompatActivity {
 
    private static final int MY_PERMISSION_REQUEST_CODE =101 ;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        findViewById(R.id.sms).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //1。获取内容处理者
                ContentResolver resolver = getContentResolver();
                //2。查询方法
                //content://sms
                //content://sms/inbox 收件箱
                //content://sms/sent  发件箱
                //content://sms/draft 草稿箱
                Uri uri = Uri.parse("content://sms");
                Cursor c = resolver.query(uri, nullnullnullnull);
                //3。解析Cursor
                //遍历Cursor
 
                while(c.moveToNext()) {
                    String msg = "";
                    //这里用for循环遍历的方法会输出所有信息,比较杂乱
                    /*
                    //遍历该行的列
                    for (int i = 0; i < c.getColumnCount(); i++) {
                        //参数:列的索引
                        msg += c.getString(i) + "  ";
                    }
                    */
                    String address = c.getString(c.getColumnIndex("address"));
                    String body = c.getString(c.getColumnIndex("body"));
                    msg += address + ":" + body;
                    Log.e("TAG", msg);
                }
            }
        });
 
 
        findViewById(R.id.read).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //1。获取内容处理者
                ContentResolver resolver = getContentResolver();
                //2。查询方法
                Cursor c1=resolver.query(ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
                while (c1.moveToNext()){
                    String msg="";
                    /*
                    对于联系人而言,他们的存储方式是将姓名和其他内容(电话号码)由不同的ContentProvider操作的
                    姓名与其他内容在不同的表,姓名为主表,其他为从表
                    主表的主键会在其他表中作为外键来使用
                    ContactsContract.Contacts.DISPLAY_NAME 姓名
                    ContactsContract.Contacts._ID 主键
                     */
 
                    String name=c1.getString(c1.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    String _id=c1.getString(c1.getColumnIndex(ContactsContract.Contacts._ID));
                    Log.e("TAG","姓名是:"+name+",id是:"+_id);
 
                    String selections=ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?";
                    Cursor c2=resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI
                    ,null,selections,new String[]{_id},null);
 
                    while(c2.moveToNext()){
                        String number=c2.getString(c2.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        name+=" "+number;
                    }
 
                    Log.e("TAG",name);
 
                }
            }
        });
 
 
        findViewById(R.id.add).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               ContentResolver resolver=getContentResolver();
 
                //1.往一个ContentProvider中插入一条空数据,获取新生成的id
                //2.利用刚生成的id分别组合姓名和电话号码往另一个ContentProvider中插入数据
                ContentValues values=new ContentValues();
                Uri uri=resolver.insert(ContactsContract.RawContacts.CONTENT_URI,values);
                long id= ContentUris.parseId(uri);
 
                //插入数据(姓名)
                values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,"Emilia");
                //指定和姓名关联的编号列的内容
                values.put(ContactsContract.Data.RAW_CONTACT_ID,id);
                //指定插入类型
                values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
                resolver.insert(ContactsContract.Data.CONTENT_URI,values);
 
 
                //插入电话号码
                values.clear();
                values.put(ContactsContract.CommonDataKinds.Phone.NUMBER,"13223346728");
                values.put(ContactsContract.Data.RAW_CONTACT_ID,id);
                values.put(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                //指定手机还是固话,这里为手机
                values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
                resolver.insert(ContactsContract.Data.CONTENT_URI,values);
            }
        });
 
    }


提问者 慕UI6705487 2018-03-19 16:51:26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
    public void click(View view){
        boolean isAllGranted=checkPermissionAllGranted(
                new String[]{
                        Manifest.permission.READ_SMS,
                        Manifest.permission.READ_CONTACTS,
                        Manifest.permission.WRITE_CONTACTS
                }
        );
 
        if(isAllGranted){
            doBackup();
            return;
        }
 
        ActivityCompat.requestPermissions(
                this,
                new String[]{
                Manifest.permission.READ_SMS,
                Manifest.permission.READ_CONTACTS,
                Manifest.permission.WRITE_CONTACTS},
                MY_PERMISSION_REQUEST_CODE);
 
    }
 
 
    private boolean checkPermissionAllGranted(String[] strings) {
        for(String permission:strings){
            if(ContextCompat.checkSelfPermission(this,permission)!= PackageManager.PERMISSION_GRANTED){
                return false;
            }
        }
 
        return true;
    }
 
    public void onRequestPermissionResult(int requestCode,String[] permissions,int[] grantResults){
        super.onRequestPermissionsResult(requestCode,permissions,grantResults);
        if(requestCode==MY_PERMISSION_REQUEST_CODE){
            boolean isAllGranted=true;
 
            for(int grant:grantResults){
                if(grant!=PackageManager.PERMISSION_GRANTED){
                    isAllGranted=false;
                    break;
                }
            }
 
            if(isAllGranted){
                doBackup();
            }else {
                openAppDetails();
            }
 
        }
    }
 
 
 
    private void openAppDetails() {
        AlertDialog.Builder builder=new AlertDialog.Builder(this);
        builder.setMessage("备份通讯录需要访问'通讯录'和'外部存储器',请到'应用信息->权限'中授予!");
        builder.setPositiveButton("去手动授权"new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Intent intent=new Intent();
                intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
                intent.addCategory(Intent.CATEGORY_DEFAULT);
                intent.setData(Uri.parse("package:"+getPackageName()));
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
                startActivity(intent);
            }
        });
 
        builder.setNegativeButton("取消",null);
        builder.show();
    }
 
    private void doBackup() {
        Toast.makeText(this"正在备份通讯录...", Toast.LENGTH_SHORT).show();
    }
 
}


irista23 2018-03-16 13:57:04

短信权限在Android 6.0+属于危险权限,需要动态申请。你可以在广播那门课程中找下《Android 6.0 动态权限申请》教辅对应添加下代码。

  • 提问者 慕UI6705487 #1
    老师帮我看一下上边回复的动态申请权限哪错了,第一次写有很多傻傻的地方 (最上边回复是报错,下边两个回复拼起来是我的代码)
    2018-03-19 16:55:13
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
Android网络操作与数据存储2018版
  • 参与学习           人
  • 提交作业       307    份
  • 解答问题       1613    个

本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。

了解课程
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师
插入代码