Android应用程序获得权限后无法正常运行

Android应用程序获得权限后无法正常运行,android,android-6.0-marshmallow,runtime-permissions,Android,Android 6.0 Marshmallow,Runtime Permissions,写了一个获取联系人和联系电话号码,然后显示在小程序中,但获得权限后在Android 6中无法显示数据,要重新启动程序才能正确读取。我认为应该有访问权限是不可能的,因为重启后不需要询问权限何时可以正常读取,需要弹出对话框询问权限时允许访问但仍然无法显示,但重启后 public class MainActivity extends AppCompatActivity {       ListView contactsView;       ArrayAdapter<String> ad

写了一个获取联系人和联系电话号码,然后显示在小程序中,但获得权限后在Android 6中无法显示数据,要重新启动程序才能正确读取。我认为应该有访问权限是不可能的,因为重启后不需要询问权限何时可以正常读取,需要弹出对话框询问权限时允许访问但仍然无法显示,但重启后

 public class MainActivity extends AppCompatActivity {
 
    ListView contactsView;
 
    ArrayAdapter<String> adapter;
 
    List<String> contactsList = new ArrayList<String>();
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        contactsView = (ListView) findViewById(R.id.contacts_view);
        adapter = new ArrayAdapter<String>(this, android.R.layout.
                simple_list_item_1, contactsList);
        contactsView.setAdapter(adapter);
        insertDummyContactWrapper();
    }
 
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123;
 
    private void insertDummyContactWrapper() {
        int hasWriteContactsPermission = checkSelfPermission(Manifest.permission.READ_CONTACTS);
        if (hasWriteContactsPermission != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[] {Manifest.permission.READ_CONTACTS},
                    REQUEST_CODE_ASK_PERMISSIONS);
            return;
        }
        readContacts();
    }
 
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_PERMISSIONS:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission Granted
                    readContacts();
                } else {
                    // Permission Denied
                    Toast.makeText(MainActivity.this, "READ_CONTACTS Denied", Toast.LENGTH_SHORT)
                            .show();
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
 
    public void readContacts() {
        Cursor cursor = null;
        try {
            cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    null, null, null, 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);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (cursor != null) {
                cursor.close();
            }
        }
    }
public类MainActivity扩展了AppCompatActivity{
 
ListView联系人视图;
 
阵列适配器;
 
列表联系人列表=新的ArrayList();
 
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
contactsView=(ListView)findViewById(R.id.contacts\u视图);
adapter=新的ArrayAdapter(这是android.R.layout。
简单列表项目1,联系人列表);
contactsView.setAdapter(适配器);
insertDummyContactWrapper();
    }
 
最终私有int请求\代码\请求\权限=123;
 
私有void insertDummyContactWrapper(){
int hasWriteContactSubmission=checkSelfPermission(Manifest.permission.READ\u CONTACTS);
if(hasWriteContactSubmission!=已授予PackageManager.PERMISSION){
requestPermissions(新字符串[]{Manifest.permission.READ_CONTACTS},
请求\代码\请求\权限);
返回;
        }
readContacts();
    }
 
@覆盖
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
开关(请求代码){
案例请求\代码\请求\权限:
if(grantResults[0]==已授予PackageManager.权限){
//已授予权限
readContacts();
}其他{
//权限被拒绝
Toast.makeText(MainActivity.this,“读取联系人已拒绝”,Toast.LENGTH\u SHORT)
.show();
                }
中断;
默认值:
super.onRequestPermissionsResult(请求代码、权限、授权结果);
        }
    }
 
公共联系人(){
游标=空;
试一试{
cursor=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,
空,空,空,空);
while(cursor.moveToNext()){
String displayName=cursor.getString(cursor.getColumnIndex(ContactsContract)。
CommonDataTypes.Phone.DISPLAY_NAME));
字符串编号=cursor.getString(cursor.getColumnIndex(ContactsContract)。
CommonDataTypes.Phone.NUMBER));
contactsList.add(displayName+“\n”+编号);
            }
}catch(异常e){
e.printStackTrace();
}最后{
如果(光标!=null){
cursor.close();
            }
        }
    }

您的代码正在运行!您面临的问题是什么。我已经用6.0检查了nexus 5中的代码。在第一次询问是否授予权限后,单击“允许不读取数据”以重新启动程序。我已经尝试过。在第一次读取数据时授予权限。您在设备中测试过代码吗?我在Genymotion中测试代码。在真实设备中尝试其工作方式ng