【问题标题】:phone number from device returns 0来自设备的电话号码返回 0
【发布时间】:2014-11-13 16:11:12
【问题描述】:

我对 android 开发有点陌生,我现在完全被卡住了! 所以我希望你能帮助我!

所以 - 我正在尝试从联系人选择器中获取联系人的电话号码和电子邮件地址。 但是当我显示输出时,它说它是0和null。 我究竟做错了什么? 这是代码!

if (view == btnPhonebook2) {
        Intent intent = new Intent(Intent.ACTION_PICK, People.CONTENT_URI);
        startActivityForResult(intent, PICK_CONTACT);
    }

  public void onActivityResult(int reqCode, int resultCode, Intent data) {
    super.onActivityResult(reqCode, resultCode, data);
    switch (reqCode) {
    case (PICK_CONTACT):
        if (resultCode == Activity.RESULT_OK) {
            // String id = null;
            // FIRST TRY

              Uri contactData = data.getData(); Cursor c = managedQuery(contactData, null, null, null, null); 
              if(c.moveToFirst()) { 
                  String name = c.getString(c.getColumnIndexOrThrow(People.NAME)); 
                  int number = c.getInt(c.getColumnIndexOrThrow(People.PRIMARY_PHONE_ID));
                  String email = c.getString(c.getColumnIndexOrThrow(People.PRIMARY_EMAIL_ID));


              //+" : c.getInt(c.getColumnIndexOrThrow(People.NUMBER));
              Toast.makeText(getApplicationContext(),"you selected : "+name+"\n With the telephone number :"+number+"\n And the email :"+email,Toast.LENGTH_LONG).show();

              DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which){
                        case DialogInterface.BUTTON_POSITIVE:
                            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "60158096"));
                              startActivity(intent);
                            break;

                        case DialogInterface.BUTTON_NEGATIVE:
                            Intent email = new Intent(Intent.ACTION_SEND);
                              email.putExtra(Intent.EXTRA_EMAIL, new String[]{"emailExample@gmail.com"});          
                              email.putExtra(Intent.EXTRA_SUBJECT, "subject");
                              email.putExtra(Intent.EXTRA_TEXT, "message");
                              email.setType("message/rfc822");
                              startActivity(Intent.createChooser(email, "Choose an Email client :"));
                            break;
                        }
                    }
                };

                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setMessage("How will you contact: "+name).setPositiveButton("Call", dialogClickListener)
                    .setNegativeButton("Email", dialogClickListener).show();

当我显示字符串名称时 - 结果很好!?

【问题讨论】:

  • 分享更多的代码,比如getData();
  • 似乎是从intent中检索数据的功能“检索此intent正在操作的数据。此URI指定数据的名称;通常它使用内容:方案,指定数据在内容提供者。其他方案可能由特定活动处理,例如 http: 由 Web 浏览器处理。"
  • 但是我可以分享更多,虽然我很确定,我的错误在发布的部分。
  • 我不认为这是原因,但我看不出这个条件块在哪里结束,if(c.moveToFirst()) {
  • 哦是的 - 它在一堆注释掉的代码之后结束,我在这下面 - 所以它就在那里。你不用担心;-)

标签: java android contacts android-contacts


【解决方案1】:

我在here之前回答过类似的问题。

ContentResolver cr = getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 
String phone = null;
if (cur.getCount() > 0) { 
  while (cur.moveToNext()) { 
    String id = cur.getString(cur .getColumnIndex(ContactsContract.Contacts._ID)); 
    if (Integer .parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
    { 
      Cursor pCur = cr.query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[] { id }, null); 
      while (pCur.moveToNext()) { 
        phone = pCur .getString(pCur .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
        // This was the phone number for that contact id...
      } 
    pCur.close(); 
    Cursor emailCur = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[] { id }, null);
    while (emailCur.moveToNext()) { 
    // For Email
      emailContact = emailCur .getString(emailCur .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
      emailType = emailCur .getString(emailCur .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
    } 
  } 
}

同样你可以得到image uri
您的代码的问题在这里:

String name = c.getString(c.getColumnIndexOrThrow(People.NAME)); 
int number = c.getInt(c.getColumnIndexOrThrow(People.PRIMARY_PHONE_ID));
String email = c.getString(c.getColumnIndexOrThrow(People.PRIMARY_EMAIL_ID));

使用 String 类型而不是 int 和 Contacts.People class is deprecated from api 5。此外 People.PRIMARY_PHONE_ID 会给你 id 而不是 PhoneNumber。

String id = c.getString(c.getColumnIndex(People.PRIMARY_PHONE_ID));

【讨论】:

  • 但是这种方法不能以我现在的方式实现吗?会吗?
  • 我选择了不同的方法 - 但我可以看到你的方法也可以。所以我接受了你的回答。
  • 哪种方法,任何链接/教程,更快?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 2017-08-21
  • 2023-03-19
  • 1970-01-01
  • 2012-11-20
  • 1970-01-01
相关资源
最近更新 更多