【问题标题】:Getting force close when getting the number from Contact lists从联系人列表中获取号码时强制关闭
【发布时间】:2014-07-28 06:13:11
【问题描述】:

我制作了一个应用程序,用户必须在其中注册他的所有详细信息。对于我使用的联系信息,单击时打开联系人列表。当用户选择特定联系人时,该选定联系人的号码应该是显示在编辑文本中。但每当我选择一个联系人时,我的应用程序就会崩溃

代码。

 private String strFirstName, strLastName, strEmail, strPassword, strConfirmPassword, strMobile, contactNumber;
    private Intent intent;
 case R.id.bt_contacts:
                intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                startActivityForResult(intent, 1);
                break;
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == getActivity().RESULT_OK) {
            Uri contactData = data.getData();
            Cursor c = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            if (c.moveToFirst()) {
                String id = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts._ID));
                String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (number.equalsIgnoreCase("1")) {
                    Cursor phones = getActivity().getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id,
                            null, null);
                    phones.moveToFirst();
                    contactNumber = phones.getString(phones.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    etMobile.setText(contactNumber);

                }
            }

            etMobile.setText("" + contactNumber);
        }
    }

Logcat

07-28 11:42:31.228  12387-12387/example.com.pocketdocs E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=android:fragment:0, request=1, result=-1, data=Intent { dat=content://com.android.contacts/contacts/lookup/1135r974-27272727272727.3789r975-27272727272727/974 }} to activity {example.com.pocketdocs/example.com.pocketdocs.MainActivity.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3162)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3205)
            at android.app.ActivityThread.access$1100(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:4787)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
            at android.database.AbstractCursor.checkPosition(AbstractCursor.java:418)
            at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
            at android.database.CursorWrapper.getString(CursorWrapper.java:114)
            at example.com.pocketdocs.SignUp.SignUpFragment.onActivityResult(SignUpFragment.java:201)
            at android.app.Activity.dispatchActivityResult(Activity.java:5196)
            at android.app.ActivityThread.deliverResults(ActivityThread.java:3158)
            at android.app.ActivityThread.handleSendResult(ActivityThread.java:3205)
            at android.app.ActivityThread.access$1100(ActivityThread.java:138)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1255)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:213)
            at android.app.ActivityThread.main(ActivityThread.java:4787)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
            at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 当您检查光标 c if (c.moveToFirst()) 您需要检查名为电话的光标。问题是您的光标没有要迭代的行。
  • 你能告诉我们哪一行是201号吗?
  • contactNumber = phones.getString(phones.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
  • @RajenRaiyarela 的意思是先生该怎么办

标签: android android-contacts


【解决方案1】:

问题出在这里

Uri contactData = data.getData();
    Cursor c = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

应该是

Uri contactData = data.getData();
        Cursor c = getActivity().getContentResolver().query(contactData, null, null, null, null);

【讨论】:

    【解决方案2】:

    根据日志猫:

    android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
    

    您正在尝试访问不存在的内容。我的猜测是返回的光标没有指向任何东西。因此 c.moveToFirst() 不会起作用,因为没有第一个元素指向。您可以使用 c.getCount(); 来确认这一点;

    由于您使用 ContactsContract.Contacts.CONTENT_URI 请求数据,您还应该在查询中使用它:

    Cursor c = getActivity().getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    

    【讨论】:

    • 光标没有指向任何联系人,要么您没有任何联系人,要么呼叫方式错误。也许您在没有联系人的模拟器上运行?
    • 您是否已将 添加到清单中?有关更多信息,请参阅developer.android.com/training/contacts-provider/…,其中包含如何检索联系人的完整工作指南,这可以解决您的问题。
    • 不,先生,我正在使用我的手机测试应用程序,我有很多联系人
    • 然后我会进行 android 培训(我链接了最后一条评论)。你也可以尝试不开始一个新的活动,像本教程中那样立即获取联系人:examples.javacodegeeks.com/android/core/provider/…
    • 另外,我相信您在查询中使用了错误的键,将 ContactsContract.CommonDataKinds.Phone.CONTENT_URI 替换为 ContactsContract.Contacts.CONTENT_URI,如下所示: Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI , 空, 空, 空, 空);
    猜你喜欢
    • 2017-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    相关资源
    最近更新 更多