【问题标题】:Android: how to add a contact to the SIM using the SDK?Android:如何使用 SDK 将联系人添加到 SIM 卡?
【发布时间】:2010-06-27 17:36:33
【问题描述】:

我正在编写一个将联系人写入 Android 手机 SIM 卡的应用程序。我被困在添加电话号码的地方:没有明显原因的异常发生。

这是一段sn-p代码。

import android.app.Activity;
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.ContentValues;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.Data;
import android.provider.ContactsContract.RawContactsEntity;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.RawContacts.Entity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;
[...]
try{
            // add a row to the RawContacts table
     ContentValues values = new ContentValues();
     values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim");
     values.put(RawContacts.ACCOUNT_NAME, "SIM");
     Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);

            // get the ID of the newly-added line
     long rawContactId = ContentUris.parseId(rawContactUri);

            // add a "name" line to the Data table, linking it to the new RawContact
            // with the CONTACT_ID column
     values.clear();
     values.put(Data.RAW_CONTACT_ID, rawContactId);
     values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
     values.put(StructuredName.DISPLAY_NAME, "Name");
     cr.insert(Data.CONTENT_URI, values);
            // this insert succeeds

            // add a "phone" line to the Data table, linking it to the new RawContact
            // with the CONTACT_ID column
     values.clear();
     values.put(Data.CONTACT_ID, rawContactId);
     values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
     values.put(Phone.NUMBER, "+12345678901");
     values.put(Phone.TYPE, Phone.TYPE_MOBILE);
     cr.insert(Data.CONTENT_URI, values);
            // this insert fails with a NullPointerException
}
catch(Exception e){
    String xx=e.toString();
    System.out.println(xx);
}

应用程序具有权限 android.permission.READ_CONTACTS 和 android.permission.WRITE_CONTACTS。

电话显示有姓名但没有电话的联系人(顺便说一下,使用普通 UI 将电话添加到该联系人会导致添加新联系人,其中包含姓名和电话,而旧联系人仅保留姓名)。

知道为什么第三次插入(Data 表中的第二次)失败,而前两次插入(RawContacts 中的 1 次和 Data 中的 1 次)成功吗?

【问题讨论】:

  • 如果您也发布异常堆栈跟踪,这将非常有帮助
  • 你的意思是,在catch语句中放一个断点,在断点的时候(也就是已经捕获到异常)粘贴堆栈跟踪?你能看到哪个函数抛出了异常吗?但是,将 Data.CONTACT_ID 替换为 Data.RAW_CONTACT_ID 解决了。

标签: java android contacts sim-card


【解决方案1】:
values.put(RawContacts.ACCOUNT_TYPE, "com.anddroid.contacts.sim");

安卓?我没有看其他的,但可能值得删除一个“d”

【讨论】:

    【解决方案2】:

    我已经在我的系统上复制了这个,但是一旦手机重启,联系人就会被删除。这意味着联系人正在保存在手机的临时 sim 卡中。 这同样发生在你身边还是我错过了什么。 我正在使用 3G sim。

    问候

    【讨论】:

    • 嗨罗希特。实际上这里也发生了同样的事情。显然,RawContacts 表在启动时与 SIM 电话簿同步,但访问它与访问实际的 SIM 电话簿不同。我想知道怎么做,或者至少如何触发 SIM 电话簿和 RawContacts 之间的重新同步...
    • 你找到解决方案了吗?
    【解决方案3】:

    Data.CONTACT_ID 必须替换为 Data.RAW_CONTACT_ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 2011-10-02
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多