关于真机权限的问题
老师这里我已经设置了权限,为什么在真机上还是显示没有权限?
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
报错
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)
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, 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); } }); } |
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(); } } |
- 参与学习 人
- 提交作业 307 份
- 解答问题 1613 个
本专题是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理。介绍了Android内外部文件存储、轻量级数据库SQLite的使用。利用屏幕适配、状态保持、百度地图解决实际问题。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧