android 危险权限(需要动态请求的权限)+动态权限获取联系人

注:该组中只要有一个被授权了,那么改组其它权限将会被全部授权

权限组名  :CALENDAR(日历访问权限) 权限名字:(1). READ_CALENDAR (2).WRITE_CALENDAR
权限组名  :CAMERA (相机访问权限)权限名字:(1).CAMERA
权限组名  :CONTACTS(联系人权限)权限名字:(1). READ_CONTACTS(2).WRITE_CONTACTS(3).GET_ACCOUNTS
权限组名  :LOCATION(位置权限)权限名字:(1). ACCESS_FINE_LOCATION(2).ACCESS_COARSE_LOCATION
权限组名  :MICROPHONE(麦克风权限)权限名字:(1). RECORD_AUDID
权限组名  :PHONE(电话权限)权限名字:(1). READ_PHONE_STATE(2).CALL_PHONE(3).READ_CALL_LOG(4).WRITE_CALL_LOG(5).ADD_VOICEMAIL(6).USE_SIP(7).PROCESS_OUTGOING_CALLS
权限组名  :SENSORS(传感器权限)权限名字:(1).BODY_SENSORS 
权限组名  :SMS(短信权限)权限名字:(1). SEND_SMS(2).RECEIVE_SMS(3).READ_SMS(4).RECEIVE_WAP_PUSH(5).RECEIVE_MMS
权限组名  :STORAGE(存储权限)权限名字:(1). READ_EXTERNAL_STORAGE(2).WRITE_EXTERNAL_STORAGE


android 危险权限(需要动态请求的权限)+动态权限获取联系人

<ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/list_view"></ListView>
public class MainActivity extends AppCompatActivity {
    private ArrayAdapter<String>adapter;
    private List<String>contactsList=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView contactsView =findViewById(R.id.list_view);
        textView=findViewById(R.id.tv1);
        adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,contactsList);
        contactsView.setAdapter(adapter);
        //检查权限是否开启,清单文件也要加上权限
        	**if(ContextCompat.checkSelfPermission(this,Manifest.permission.READ_CONTACTS)!=PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this,new String[]
                    {
                            Manifest.permission.READ_CONTACTS
                    },1);
        }
        else
        {
            readContacts();
        }
    }**

    private void readContacts()
    {
        Cursor cursor=null;
        try {
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            if (cursor != null) {
                while (cursor.moveToNext()) {
                    String displayName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                    String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    contactsList.add(displayName+"\n"+number);
                    textView.setText(displayName+"jjjjj "+number);
                }
                adapter.notifyDataSetChanged();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(cursor!=null)
            {
                cursor.close();
            }
        }
    }

//权限回调
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode)
        {
        //用户开启了权限
            case 1:
                if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION_GRANTED)
                {
                    readContacts();
                }
                else
                {
                //用户禁止了权限
                    Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
}