【问题标题】:Start Activity with ACTION_EDIT and passing LOOKUP_KEY causes NumberFormatException使用 ACTION_EDIT 启动 Activity 并传递 LOOKUP_KEY 会导致 NumberFormatException
【发布时间】:2011-10-17 17:55:29
【问题描述】:

我正在尝试通过我的应用程序在 android 中添加联系人。为此,我获取所有数据并通过意图传递它。

而且,我想做的是在插入时,它会打开“添加联系人”屏幕,因此用户可以对其进行编辑,所以我正在尝试使用 ACTION_EDIT。

public void addNewContactToDevice() 
    {   
        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        int rawContactInsertIndex = ops.size();
        ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI)
            .withValue(RawContacts.ACCOUNT_TYPE, null)
            .withValue(RawContacts.ACCOUNT_NAME, null)
            .build());
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE)
            .withValue(StructuredName.GIVEN_NAME, person.getName())
            .withValue(StructuredName.FAMILY_NAME, person.getLastName())
            .build());  
        ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex)
            .withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE)
            .withValue(Phone.NUMBER, person.getPhone())
            .withValue(Phone.TYPE, Phone.TYPE_MOBILE)                
            .build());

        try 
        {
            ((Panel)activity).getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
            Cursor contactsCursor = activity.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
                    new String[] {ContactsContract.Contacts.LOOKUP_KEY, ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID}, 
                    ContactsContract.CommonDataKinds.Phone.NUMBER + " = ?" , 
                    new String[] { PhoneNumberUtils.formatNumber(individualSelected.getPhone()) }, null);

            contactsCursor.moveToFirst();

            String androidContactId = contactsCursor.getString(contactsCursor.getColumnIndex(LOOKUP_KEY));

            Intent intent = new Intent(Intent.ACTION_EDIT);
            intent.setData(Uri.parse(ContactsContract.Contacts.CONTENT_LOOKUP_URI + "/" + androidContactId));
            ((Panel)activity).startActivityForResult(intent, 2);
        } 
        catch (RemoteException e) 
        {
            e.printStackTrace();
        } 
        catch (OperationApplicationException e) 
        {
            e.printStackTrace();
        }   

    }

但问题是,传递 ACTION_EDIT 会为 LOOKUP_KEY 返回 NumberFormatException(类似于 0r17-3E483A46442C32324838)。当它尝试打开添加联系人屏幕时,它无法解析 LOOKUP_KEY。

我该怎么办?

谢谢。


更新:这里是 logcat

10-18 08:54:59.003: ERROR/AndroidRuntime(7527): Caused by: java.lang.NumberFormatException: 0r17-3E483A46442C32324838
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at java.lang.Long.parse(Long.java:364)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at java.lang.Long.parseLong(Long.java:354)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at java.lang.Long.parseLong(Long.java:320)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at android.content.ContentUris.parseId(ContentUris.java:41)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at com.android.contacts.ui.EditContactActivity$QueryEntitiesTask.doInBackground(EditContactActivity.java:497)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at com.android.contacts.ui.EditContactActivity$QueryEntitiesTask.doInBackground(EditContactActivity.java:471)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at com.android.contacts.util.WeakAsyncTask.doInBackground(WeakAsyncTask.java:45)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
10-18 08:54:59.003: ERROR/AndroidRuntime(7527):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

【问题讨论】:

  • 对不起。我错过了代码。我使用的正确操作是 ACTION_EDIT。
  • 试试这个简单的 Intent i = new Intent(Intent.ACTION_INSERT_OR_EDIT); i.setType(ContactsContract.Contacts.CONTENT_ITEM_TYPE); i.putExtra(Insert.NAME, "TESTTEST"); i.putExtra(插入。电话,“209384”);开始活动(一);如果这个工作,然后检查你的联系 URI.paarse() 方法 intent.setData()。
  • 我以前也是这样。我改用另一种方式,因为我想在屏幕的第二个字段中插入 LastName,而最后一个选项没有提供。
  • 我更新了错误日志。

标签: android


【解决方案1】:

我找到了解决方案,而不是将其传递给 setData 方法:

intent.setData(Uri.parse(ContactsContract.Contacts.CONTENT_LOOKUP_URI + "/" + androidContactId));

我应该通过这个:

Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup_key);
Uri res = ContactsContract.Contacts.lookupContact(activity.getContentResolver(), lookupUri);

在 setData() 方法中,我传递了变量 res,即 URI 类型。


这个question对我帮助很大!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    相关资源
    最近更新 更多