Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 1078|回复: 0

[实例教程]Android的SIM卡名片导入流程

[复制链接]

该用户从未签到

发表于 2011-10-22 13:59:32 | 显示全部楼层 |阅读模式
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);



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();

        }
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:59:39 | 显示全部楼层

Re:[实例教程]Android的SIM卡名片导入流

你好,问下,你这是读取系统数据库中的联系人还是读取SIM卡中的联系人?
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2011-10-22 13:59:44 | 显示全部楼层

Re:[实例教程]Android的SIM卡名片导入流

你好,没看懂你写的,能不能把源码全挂出来。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-22 18:01 , Processed in 1.230308 second(s), 33 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表