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