Android 无法从包含3行1列的游标窗口中读取第1行第1列 Cursor c=getContentResolver().query(ContactsContract.Data.CONTENT\u URI,新字符串[]{ContactsContract.Data.LOOKUP\u KEY},null,null,null); 联系人=新的ArrayList(); phno=newarraylist(); c、 moveToFirst(); while(c.moveToNext()){ String contactname=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME)); String phnumber=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER)); contacts.add(contactname);//在数组列表中添加 phno.add(phnumber);//在数组列表中添加 } c、 close();

Android 无法从包含3行1列的游标窗口中读取第1行第1列 Cursor c=getContentResolver().query(ContactsContract.Data.CONTENT\u URI,新字符串[]{ContactsContract.Data.LOOKUP\u KEY},null,null,null); 联系人=新的ArrayList(); phno=newarraylist(); c、 moveToFirst(); while(c.moveToNext()){ String contactname=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME)); String phnumber=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER)); contacts.add(contactname);//在数组列表中添加 phno.add(phnumber);//在数组列表中添加 } c、 close();,android,cursor,Android,Cursor,请帮助我解决此错误,我知道如果列号为-1,则没有列。我怎样才能纠正这个问题 这是代码,其余的是初始化 Cursor c=getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.LOOKUP_KEY}, null,null, null); contacts=new ArrayList<String>(); phno=new Arr

请帮助我解决此错误,我知道如果列号为-1,则没有列。我怎样才能纠正这个问题

这是代码,其余的是初始化

Cursor c=getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] { ContactsContract.Data.LOOKUP_KEY}, null,null, null);
    contacts=new ArrayList<String>();
    phno=new ArrayList<String>();
    c.moveToFirst();
    while (c.moveToNext()) {
        String contactname = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phnumber= c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        contacts.add(contactname);//adding in array list
        phno.add(phnumber);//adding in array list
    }
    c.close();
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_receive);
actv=(AutoCompleteTextView)findViewById(R.id.AutoCompleteTextView);
int permissioncheck=ContextCompat.checkSelfPermission(Receive.this、Manifest.permission.READ\u CONTACTS);
if(permissioncheck==PackageManager.PERMISSION\u已授予){
showContacts();
}
否则{
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.READ_CONTACTS},PERMISSIONS_REQUEST_READ_CONTACTS);
}
ArrayAdapter=新的ArrayAdapter(Receive.this,android.R.layout.simple\u list\u item\u 1,contacts);
actv.setAdapter(适配器);
b1=(按钮)findViewById(R.id.Button);
tv=(TextView)findViewById(R.id.textView3);
b1.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
x=actv.getListSelection();
phone=phno.get(x.toString();
tv.setText(电话);
}
});
}
public void onRequestPermissionsResult(int-requestCode、字符串[]权限、int[]grantResults){
if(requestCode==权限\请求\读取\联系人){
if(grantResults[0]==已授予PackageManager.权限){
showContacts();
}否则{
Toast.makeText(这是“授予的权限”,Toast.LENGTH_LONG).show();
}
}
}

谢谢你花时间教育人们。这个网站对像我这样的新手很有帮助。

问题在于你的投影,
query()
的第二个参数:

您要求查询只返回
LOOKUP\u键
列。因此,当您稍后尝试查找
DISPLAY\u NAME
NUMBER
的列索引时,
getColumnIndex()
返回-1,因为它找不到这些列。通过将投影更改为以下方式修复此问题:

new String[] { ContactsContract.Data.LOOKUP_KEY}

如果您不在任何地方使用它,您也可以删除
联系人contract.Data.LOOKUP\u KEY

我在数组列表中得到了同一联系人的两个姓名。剩下的代码有问题吗?我想不出来。请解释一下。@saikumarkolisetty我在代码中看不到任何东西。如果您有其他问题,请随时提出新问题。
new String[] { ContactsContract.Data.LOOKUP_KEY}
new String[] { 
        ContactsContract.Data.LOOKUP_KEY,
        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Phone.NUMBER
}