Android的SIM卡名片導入流程
文章出處:http://www.limodev.cn/blog
作者聯系方式:李先靜 <xianjimli@gmail.com>
Android的SIM卡名片導入流程
ContactsListActivity
在ContactsListActivity裏創建了一個名片導入的菜單。
// SIM import
Intent importIntent = new Intent(Intent.ACTION_VIEW);
importIntent.setType("vnd.android.cursor.item/sim-contact");
importIntent.setClassName("com.android.phone", "com.android.phone.SimContacts");
menu.add(0, 0, 0, R.string.importFromSim)
     .setIcon(R.drawable.ic_menu_import_contact)
     .setIntent(importIntent);
很明顯可以看出名片應用程序只是啟動了電話裏面的SimContacts:
ADNList
SimContacts是從ADNList繼承過來的,有必要先看下ADNList。它是一個ListActivity,用來顯示SIM卡中的名片。
先查詢SIM卡中的名片:
    protected Uri resolveIntent() {
        Intent intent = getIntent();
        if (intent.getData() == null) {
            intent.setData(Uri.parse("content://sim/adn"));
        }
 
        return intent.getData();
    }
 
    private void query() {
        Uri uri = resolveIntent();
        if (DBG) log("query: starting an async query");
        mQueryHandler.startQuery(QUERY_TOKEN, null, uri, COLUMN_NAMES,
                null, null, null);
        displayProgress(true);
    }
mQueryHandler是AsyncQueryHandler的子類,當查詢完成時,會調用onQueryComplete去更新SIM卡名片列表和進度狀態:
protected void onQueryComplete(int token, Object cookie, Cursor c) {
            if (DBG) log("onQueryComplete: cursor.count=" + c.getCount());
            mCursor = c;
            setAdapter();
            displayProgress(false);
        }
SimContacts
再回到SimContacts,從SIM卡裏查詢名片是ADNList做的,SimContacts則主要是負責導入SIM卡名片到手機名片裏:
選擇某條名片導入,會給用戶編輯的機會,由名片應用程序來負責:
private void importOne(int position) {
        if (mCursor.moveToPosition(position)) {
            String name = mCursor.getString(NAME_COLUMN);
            String number = mCursor.getString(NUMBER_COLUMN);
            Object[] parsed = new Object[2];
            Uri personUrl = parseName(name, parsed);
 
            Intent intent;
            if (personUrl == null) {
                // Add a new contact
                intent = new Intent(Contacts.Intents.Insert.ACTION,
                        Contacts.People.CONTENT_URI);
                intent.putExtra(Contacts.Intents.Insert.NAME, (String)parsed[0]);
                intent.putExtra(Contacts.Intents.Insert.PHONE, number);
                intent.putExtra(Contacts.Intents.Insert.PHONE_TYPE, ((Integer)parsed[1]).intValue());
            } else {
                // Add the number to an existing contact
                intent = new Intent(Intent.ACTION_EDIT, personUrl);
            }
            startActivity(intent);
        }
    }
如果是全部導入,則直接通過ContentResolver插入進去,這裏由一個獨立的線程負責:
public void run() {
            ContentValues map = new ContentValues();
            ContentResolver cr = getContentResolver();
            Object[] parsed = new Object[2];
 
            mCursor.moveToPosition(-1);
            while (!mCanceled && mCursor.moveToNext()) {
                String name = mCursor.getString(0);
                String number = mCursor.getString(1);
 
                Uri personUrl = parseName(name, parsed);
 
                if (personUrl == null) {
                    map.clear();
                    map.put(Contacts.People.NAME, (String) parsed[0]);
                    personUrl = People.createPersonInMyContactsGroup(cr, map);
                    if (personUrl == null) {
                        Log.e(TAG, "Error inserting person " + map);
                        continue;
                    }
                }
 
                map.clear();
                map.put(Contacts.People.Phones.NUMBER, number);
                map.put(Contacts.People.Phones.TYPE, (Integer) parsed[1]);
                Uri numberUrl = cr.insert(
                        Uri.withAppendedPath(personUrl, Contacts.People.Phones.CONTENT_DIRECTORY),
                        map);
 
                mProgressDialog.incrementProgressBy(1);
                if (numberUrl == null) {
                    Log.e(TAG, "Error inserting phone " + map + " for person " +
                            personUrl + ", removing person");
                    continue;
                }
            }
            mProgressDialog.dismiss();
            finish();
        }
                    
                
                
            
        
浙公网安备 33010602011771号