检索联系人数据 Android 时出现 RuntimeException

Posted

技术标签:

【中文标题】检索联系人数据 Android 时出现 RuntimeException【英文标题】:RuntimeException on Retrieving Contact Data Android 【发布时间】:2015-04-17 06:43:36 【问题描述】:

作为我正在进行的一个简单练习程序的一部分,我想从我的手机联系人中检索数据,特别是选定联系人的电话号码,或者如果有多个联系人,则全部检索。

我首先启动联系人应用程序并允许选择联系人。我有一个块,经过尝试和验证,可以选择联系人的默认号码(或者如果有一个,则为一个),但如果联系人有很多,我想列出所有号码。我完全脱离了我的元素,但是一旦这个 sn-p 启动并运行,我应该回到它。

我首先启动联系人应用程序以选择联系人:

void getNewTxtAlarmFromContacts()
    Intent intent = new Intent(Intent.ACTION_PICK,
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(intent, REQUEST_CONTACT_PICKER);

然后寻求使用以下 sn-p 处理结果:(修改来源:All phone numbers of one contact for startActivityForResult):

 String id = contactData.getLastPathSegment();
                    Cursor phoneCur = getContentResolver()
                            .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                                    null,
                                    ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                            + " = ?", new String[]  id ,
                                    null);

                    final ArrayList<String> phonesList = new ArrayList<String>();
                    while (phoneCur.moveToNext()) 
                        String phone = phoneCur
                                .getString(phoneCur
                                        .getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
                        phonesList.add(phone);
                    
                    phoneCur.close();

现在,我已将此块设置为首先,如在源中,检查接收到的数据是否不为空。接下来的几行,一直到光标的关闭,是我使用上面的 sn-p 的真正目的。他们应该检索特定联系人的所有号码,即之前选择的那个。它们后面是 if-else 结构,只是为了让我可以随心所欲地处理数字。我的困难围绕着光标所在的那些行。我相信问题可能在于

.query()

调用,因为我的功能代码,只选择默认数字的代码,只使用第一个参数。我一直收到以下错误。

02-16 11:53:01.988    3192-3192/com.naja.meno.william.notificationalarm E/ActivityThread﹕ Performing stop of activity that is not resumed: com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu
java.lang.RuntimeException: Performing stop of activity that is not resumed: com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu
        at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3362)
        at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3449)
        at android.app.ActivityThread.access$1200(ActivityThread.java:169)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:146)
        at android.app.ActivityThread.main(ActivityThread.java:5487)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
        at dalvik.system.NativeStart.main(Native Method)

在广泛的 catch 处理程序捕获此错误后,系统恢复并执行第一个 if,这表明没有数据可以找到,即使我只选择了具有许多电话号码的联系人。

我不确定我知道为什么会发生此错误。最终结果应该是我有一个包含所有相关数字的 ArrayList。

虽然可能是其他原因,但鉴于我的日志没有提供对错误站点的引用。根据错误,我不明白我正在停止什么活动,以及我能做什么。但这就是我在这里的原因。我希望有人能帮帮忙。谢谢。

【问题讨论】:

【参考方案1】:

我选择为自己提供这个解决方案... 我按照代码选择所选联系人的姓名,然后遍历 all 联系人,显示并登录我的 ArrayList 所有具有匹配关联名称的值。像这样:

它非常慢,大约需要一秒钟 (!!!!) 才能工作,但它现在可以完成工作。

String name = null;

    switch (reqCode) 
        case (REQUEST_CONTACT_PICKER):
            if (resultCode == Activity.RESULT_OK) 
                Uri contactData = data.getData();
                Cursor c = getContentResolver().query(contactData, null, null, null, null);
                if (c.moveToFirst()) 
                    name = c.getString(c.getColumnIndex(Phone.DISPLAY_NAME));
                
            
            break;
    

    if (reqCode == REQUEST_CONTACT_PICKER) 
        if (resultCode == Activity.RESULT_OK) 
            if (data != null) 
                Uri contactData = data.getData();
                ArrayList <String> arrayList = new ArrayList<>();

                try 

                    ContentResolver cr = getContentResolver();
                    Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
                    if (cur.getCount() > 0) 
                        while (cur.moveToNext()) 
                            String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                            String nameCheck = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                            //Log.d("NAMES", "name: " + name + "... nameCom: " + nameCheck);
                            if(!nameCheck.equals(name))continue;
                            Log.d("SUCCESS", "Name Chosen");
                            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()) 
                                    int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                                    String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                                    StringBuilder sb = new StringBuilder("Range of Numbers: ");
                                    switch (phoneType) 
                                        case Phone.TYPE_MOBILE:
                                            arrayList.add("Cell Number: " + phoneNumber);
                                            sb.append("MOBILE: " + phoneNumber + "; ");
                                            Log.e(name + "(mobile number)", phoneNumber);
                                            break;
                                        case Phone.TYPE_HOME:
                                            arrayList.add("Home Number: " + phoneNumber);
                                            sb.append("HOME: " + phoneNumber + "; ");
                                            Log.e(name + "(home number)", phoneNumber);
                                            break;
                                        case Phone.TYPE_WORK:
                                            arrayList.add("Work Number: " + phoneNumber);
                                            sb.append("WORK: " + phoneNumber + "; ");
                                            Log.e(name + "(work number)", phoneNumber);
                                            break;
                                        case Phone.TYPE_OTHER:
                                            arrayList.add("Misc Number: " + phoneNumber);
                                            sb.append("OTHER: " + phoneNumber + "; ");
                                            Log.e(name + "(other number)", phoneNumber);
                                            break;
                                        default:
                                            break;
                                    
                                    //Toast.makeText(getBaseContext(), sb.toString(), Toast.LENGTH_SHORT).show();
                                
                                pCur.close();


                                if(arrayList.isEmpty())
                                    Toast.makeText(getBaseContext(), "No Phone Number Found", Toast.LENGTH_LONG).show();
                                 else if(arrayList.size() == 1)
                                    makeNewTxtAlarm(arrayList.get(0), name);
                                 else if (arrayList.size() > 1)
                                    selectNewTxtAlarmNumber(arrayList, name);
                                 else
                                    Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
                                
                            
                        
                    
                 catch (Exception e) 
                    e.printStackTrace();
                    Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
                    Log.d("FILES", "Failed to get phone data");
                
            
        
    

【讨论】:

以上是关于检索联系人数据 Android 时出现 RuntimeException的主要内容,如果未能解决你的问题,请参考以下文章

移动光标时出现 android.database.CursorWindowAllocationException

使用 Tweepy 检索 Twitter 数据时出现 401 错误

ORACLE PL/SQL - 使用 SYSDATE 检索特定日期的数据时出现检索问题

为啥在尝试使用 Angular 检索数据库信息时出现错误 415?

使用 Hibernate 从 DB 检索数据时出现映射错误

检索数据时出现 Vue/Firestore/Firebase 错误