尝试访问 android 应用程序中的联系人不断崩溃

Posted

技术标签:

【中文标题】尝试访问 android 应用程序中的联系人不断崩溃【英文标题】:Trying to access contacts within android app keep crashing 【发布时间】:2016-04-04 09:46:00 【问题描述】:

我正在尝试通过我的应用访问联系人。所以我可以通过邮件与朋友分享信息。到目前为止,联系人已显示,但是当我单击要添加到电子邮件的名称时,应用程序只是返回到上一个屏幕并且不会发送电子邮件。编辑文本未设置为我选择的联系人。

android 清单

 <uses-permission android:name="android.permission.READ_CONTACTS"> </uses-permission>

电子邮件发送类

contacts.setOnClickListener(new OnClickListener() 
        public void onClick(View v) 
            Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
                    Contacts.CONTENT_URI);
            startActivityForResult(contactPickerIntent, CONTACT_PICKER_RESULT);
        
    );

....

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) 
    if (resultCode == RESULT_OK) 
         System.out.println("yo");
        switch (requestCode) 
        case CONTACT_PICKER_RESULT:
            Cursor cursor = null;
            String email = "";
            System.out.println("Hello");
            try 
                Uri result = data.getData();
                Log.v("DEBUG: ", "Got a contact result: "
                        + result.toString());

                // get the contact id from the Uri
                String id = result.getLastPathSegment();

                // query for everything email
                cursor = getContentResolver().query(Email.CONTENT_URI,
                        null, Email.CONTACT_ID + "=?", new String[]  id ,
                        null);

                int emailIdx = cursor.getColumnIndex(Email.DATA);

                // let's just get the first email
                if (cursor.moveToFirst()) 
                    email = cursor.getString(emailIdx);
                    Log.v("DEBUG: ", "Got email: " + email);
                 else 
                    Log.w("DEBUG: ", "No results");
                
             catch (Exception e) 
                Log.e("DEBUG: ", "Failed to get email data", e);
             finally 
                if (cursor != null) 
                  cursor.close();
                
               // EditText emailEntry = (EditText) findViewById(R.id.invite_email);
                personsEmail.setText(email);
                if (email.length() == 0) 
                    Toast.makeText(this, "No email found for contact.",
                            Toast.LENGTH_LONG).show();
                

            

            break;
        

     else 
        Log.w("DEBUG: ", "Warning: activity result not ok");
    

更令人费解的是,logcat 上竟然什么都没有出现!所以它超越了我所有的错误检查。知道为什么屏幕崩溃并且电子邮件地址未添加到 EditText 中吗?

【问题讨论】:

您遇到的异常是什么?请分享,如果您在 Marshmallow 中进行测试,您还需要在运行时检查权限。在 Marshmallow 中,用户可以在安装应用程序后禁用访问。 它在 logcat 上显示 Keyboard.Facilitator onFinishInput()。使用带有android插件的eclipse。谢谢你帮助我! 不需要每个联系人都有一个电子邮件 ID。从 gmail 同步的联系人通常有电子邮件 ID,但手动添加的联系人没有它 @VivekMishra 如果我不使用 ID 我会怎么做? @MsYvette 这是我清单中的内容: 【参考方案1】:

如果您在最新的操作系统(即 Android M)中对其进行测试,他们已经引入了一组新的权限,称为运行时权限。

http://developer.android.com/training/permissions/requesting.html

查看此链接,如果这能解决问题,请告诉我们。

【讨论】:

这是我的清单中的内容: 我需要查看这些新权限吗? 正如@MsYvette 所说,它仅适用于您正在测试的设备,如果它是 Marshmallow 设备,那么您必须注意这一点。【参考方案2】:
Try this

public void getNumber(ContentResolver cr) 
        Cursor phones = cr.query(
                ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
                null, null);
        while (phones.moveToNext()) 
            ContactSynRequestcontacts data = new ContactSynRequestcontacts();

String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

光标电子邮件 = contResv.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + contactId , null, null); 而(电子邮件。moveToNext()) 字符串电子邮件 = emails.getString(emails.getColumnIndex(Email.DATA)); 休息; emails.close();

            data.setName(name);
            data.setPhoneNumber(phoneNumber);
            userContactList.add(data);
        
        phones.close();// close cursor
    

    public class ContactSynRequestcontacts  
    private String Name;

    public String getName() 
        return Name;
    

    public void setName(String name) 
        this.Name = name;
    
    private String PhoneNumber;

    public String getPhoneNumber() 
        return PhoneNumber;
    

    public void setPhoneNumber(String mobile) 
        this.PhoneNumber = mobile;
    

【讨论】:

您可以无意识地直接访问联系人 不过我只需要他们的电子邮件地址...所以这还有帮助吗? 这样您就可以获取电子邮件地址以及姓名和号码 但我只需要电子邮件地址,我的程序不需要名称或号码。我只关心电子邮件地址。 好的,我可以更新代码,您可以再次检查并根据您的需要使用

以上是关于尝试访问 android 应用程序中的联系人不断崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 android 程序中访问联系人

为啥某些联系人会从 android 上的应用程序中被审查?

Android:使用原始联系人 ID 正确访问和查询

NullPointerExpection:基本联系人访问Android App

无法删除 Android 联系人中的特定号码

Android HttpClient 和 HTTPS