6

I got this Error from one of my users and i have NO clue how to fix it...

java.lang.IllegalArgumentException DatabaseUtils.readExceptionFromParcel()

java.lang.IllegalArgumentException: URI: content://com.android.contacts/phone_lookup/, calling user: com.piroja.contactpicker, calling package:com.piroja.contactpicker at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:144)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:330)
at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
at android.content.ContentResolver.query(ContentResolver.java:245)
at com.piroja.contactpicker.ContactPicker.contactExists(ContactPicker.java:257)
at com.piroja.contactpicker.ContactPicker$6$1.onClick(ContactPicker.java:138)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4627)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
at dalvik.system.NativeStart.main(Native Method)

This is the contactExists funcion i'm calling which (i think) is causing the force close:

public boolean contactExists(Context context, String number) {
        try {
            Uri lookupUri = Uri.withAppendedPath(Phone.CONTENT_FILTER_URI, Uri
                    .encode(number));
            String[] mPhoneNumberProjection = { Phone._ID, Phone.NUMBER,
                    Phone.DISPLAY_NAME };
            Cursor cur = context.getContentResolver().query(lookupUri,
                    mPhoneNumberProjection, null, null, null);
            try {
                if (cur.moveToFirst()) {
                    return true;
                }
            } finally {
                if (cur != null)
                    cur.close();
            }
        } catch (IllegalArgumentException iae) {
            return false;
        }
        return false;
    }

I have also tried to change Phone.CONTENT_FILTER_URI to PhoneLookup.CONTENT_FILTER_URI but it didn't change anything... Does anyone have a clue?

user754730
  • 1,341
  • 5
  • 31
  • 62

3 Answers3

12

There is something wrong with the phone query URI. From the exception text it looks like it is missing the phone number. Are you sure number is not null and not empty?

Nic Strong
  • 6,532
  • 4
  • 35
  • 50
  • I tried it out with a few different contacts. With name & number, only name, only number... On my Desire nothing happened... Since i dont see what phone those users have, i can't really tell you how the error was created or on which phones it crashes. – user754730 Jun 15 '11 at 08:44
  • From the log "content://com.android.contacts/phone_lookup/" the phone number is missing. Put an assertion at the beginning of the method to guard against null or empty phone number – Nic Strong Jun 21 '11 at 02:42
  • 2
    Not just null, but I catch the IllegalArgumentException on query() because there exist Android devices without this URI available! Not all of them support SMS/ MMS, especially with the dawn of tablets. – Tom Jun 15 '12 at 17:11
2

This can happen with masked number. http://code.google.com/p/gtalksms/issues/detail?id=27

Devashish Mamgain
  • 2,077
  • 1
  • 18
  • 39
1

I don't know if anyone still needs this answer, but I tried until I got it. The problem is that sometimes, the incoming number is null when you either extend PhoneStateListener class, or when passing the last incoming number. I changed my code to this, and it worked fine

@Override
public void onReceive(final Context context, final Intent intent) {
    Log.d("APP", "ACTION:" + intent.getAction());
    final String stringExtra = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
    if (TelephonyManager.EXTRA_STATE_RINGING.equals(stringExtra)) {
            final String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.d("APP", "incoming,ringing:" + incomingNumber);
        } else if (stringExtra.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
            final String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.d("APP", "hanged" + incomingNumber );
        } else if (stringExtra.equals(TelephonyManager.EXTRA_STATE_OFFHOOK)) {
            final String incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
            Log.d("APP", "answered" + incomingNumber );
        }
    }

… this solution is here.

Community
  • 1
  • 1
Mohamed ElSawaf
  • 229
  • 2
  • 8