关于真机权限的问题

关于真机权限的问题

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

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
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, null, null, null, null);
                //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



    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下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

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