1. 程式人生 > >android中對sim卡聯絡人的增刪改查以及監聽sim卡聯絡資料的改變

android中對sim卡聯絡人的增刪改查以及監聽sim卡聯絡資料的改變

sim卡聯絡人的增刪改查主要是通過ContentProvider來進行操作的,在android中對sim卡聯絡人操作的provider是定義在IccProvider.java這個類中的,這個類位於android原始碼的位置frameworks/base/telephony/java/com/android/internal/telephony/IccProvider.java,裡面有對sim操作的uri定義和增刪改查方法的定義

具體對sim卡聯絡人的增刪改查都是通過AIDL IIccPhoneBook呼叫完成對sim的具體操作,在這裡推薦一個檢視android原始碼線上觀看的網址,有興趣的可以自己去看看。

對sim操作的uri單卡手機和雙卡手機是不同的,你也可以檢視相應的原始碼檢視具體uri的定義

一般單卡為:
"content://icc/adn"
雙卡為
"content://icc/adn/subid/0"
"content://icc/adn/subid/1"

1.查詢sim卡里的聯絡人

	public void queryAllContact() {
		Cursor cursor = getContentResolver().query(uri, null, null, null, null);
		Log.d(TAG, "cursor count=" + cursor.getCount());
		while (cursor.moveToNext()) {
				String name = cursor.getString(0);
				String number = cursor.getString(1);
				String emails = cursor.getString(2);
				String id = cursor.getString(3);
				simCardInfo cardInfo = new simCardInfo(id, name, emails, number);
				if (i == columnNames.length - 1) {
					Log.d(TAG, "simcardinfo=" + cardInfo.toString());
				}

		}
	}

2.向sim卡里新增聯絡人
	public void insertContact(String name, String phoneNumber) {
		ContentValues values = new ContentValues();
		values.put("tag", name);
		values.put("number", phoneNumber);
		Uri insertInfo = getContentResolver().insert(uri, values);
		Log.d(TAG, insertInfo.toString());
	}

3.更新sim卡里聯絡人
	public void updateContact(String oldName, String oldPhone, String newName,
			String newPhone) {
		ContentValues values = new ContentValues();
		values.put("tag", oldName);
		values.put("number", oldPhone);
		values.put("newTag", newName);
		values.put("newNumber", newPhone);
		int update = getContentResolver().update(uri, values, null, null);
		Log.d(TAG, "update =" + update);
	}

4.刪除sim裡的聯絡人
	public void deleteContact(String name, String phone) {
		// 這種方式刪除資料時不行,查閱IccProvider原始碼發現,在provider中重寫的delete方法並沒有用到String[]
		// whereArgs這個引數
		// int delete = getContentResolver().delete(uri,
		// " tag = ? AND number = ? ",
		// new String[] { "jason", "1800121990" });
		String where = "tag='" + name + "'";

		where += " AND number='" + phone + "'";
		int delete = getContentResolver().delete(uri, where, null);
		Log.d(TAG, "delete =" + delete);

	}
在刪除sim卡聯絡人時,開始利用下面的語句,發現刪除返回的值一直為0,並沒有刪除成功。
	int delete = getContentResolver().delete(uri,
				" tag = ? AND number = ? ",
				new String[] { "jason", "1800121990" });

通過檢視Iccprovider具體定義的delete的地方並沒有用到String[]  whereArgs這個引數,而是通過where中對”AND“和“=”進行切割來實現的,具體程式碼如下

    @Override
    public int delete(Uri url, String where, String[] whereArgs) {
        int efType;
        int subId;

        int match = URL_MATCHER.match(url);
        switch (match) {
            case ADN:
                efType = IccConstants.EF_ADN;
                subId = SubscriptionManager.getDefaultSubId();
                break;

            case ADN_SUB:
                efType = IccConstants.EF_ADN;
                subId = getRequestSubId(url);
                break;

            case FDN:
                efType = IccConstants.EF_FDN;
                subId = SubscriptionManager.getDefaultSubId();
                break;

            case FDN_SUB:
                efType = IccConstants.EF_FDN;
                subId = getRequestSubId(url);
                break;

            default:
                throw new UnsupportedOperationException(
                        "Cannot insert into URL: " + url);
        }

        if (DBG) log("delete");

        // parse where clause
        String tag = null;
        String number = null;
        String[] emails = null;
        String pin2 = null;

        String[] tokens = where.split("AND");
        int n = tokens.length;

        while (--n >= 0) {
            String param = tokens[n];
            if (DBG) log("parsing '" + param + "'");

            String[] pair = param.split("=");

            if (pair.length != 2) {
                Rlog.e(TAG, "resolve: bad whereClause parameter: " + param);
                continue;
            }
            String key = pair[0].trim();
            String val = pair[1].trim();

            if (STR_TAG.equals(key)) {
                tag = normalizeValue(val);
            } else if (STR_NUMBER.equals(key)) {
                number = normalizeValue(val);
            } else if (STR_EMAILS.equals(key)) {
                //TODO(): Email is null.
                emails = null;
            } else if (STR_PIN2.equals(key)) {
                pin2 = normalizeValue(val);
            }
        }

        if (efType == FDN && TextUtils.isEmpty(pin2)) {
            return 0;
        }

        boolean success = deleteIccRecordFromEf(efType, tag, number, emails, pin2, subId);
        if (!success) {
            return 0;
        }

        getContext().getContentResolver().notifyChange(url, null);
        return 1;
    }
5.通過內容觀察者監聽sim裡聯絡人的改變

註冊內容觀察者

getContentResolver().registerContentObserver(uri, true,
				myContentObserver);
定義自己的內容觀察者繼承ContentObserver
	private class myContentObserve extends ContentObserver {
		public myContentObserve(Handler handler) {
			super(handler);
		}

		@Override
		public void onChange(boolean selfChange) {
			super.onChange(selfChange);
			Log.d(TAG, "資料庫發生了改變。。。");
		}
	}

當不需要監聽時,取消註冊
	if (myContentObserver != null) {
			getContentResolver().unregisterContentObserver(myContentObserver);
		}

 當ContentProvider資料來源發生改變後,如果想通知其監聽物件, 例如ContentObserver時,必須在其對應方法 update / insert / delete時,顯示的呼叫this.getContentReslover().notifychange(uri , null)方法,回撥監聽處理邏輯。否則,我們 的ContentObserver是不會監聽到資料發生改變的,即onChange方法不會呼叫


另外,對sim卡聯絡人操作需要在清單檔案中配置下面的許可權

    <uses-permission android:name="android.permission.READ_CONTACTS"/>
    <uses-permission android:name="android.permission.WRITE_CONTACTS"/>

如果有需要的,可以下載原始碼自己看看。


相關推薦

androidsim聯絡人刪改以及sim聯絡資料改變

sim卡聯絡人的增刪改查主要是通過ContentProvider來進行操作的,在android中對sim卡聯絡人操作的provider是定義在IccProvider.java這個類中的,這個類位於android原始碼的位置frameworks/base/telephony/

安卓SQLite資料庫的刪改

第一步:編寫一個java Bean package com.itfom.entity; public class Person { private String name; private int age; private String phone; publi

Spring框架開發實現商品列表的刪改以及批量刪除和批量修改

花了一週時間重新熟悉了一下SSM三大框架,也經歷了一次由複雜及簡單的過程,從剛開始的使用Mybatis操作資料就可以比較其和JDBC的不同,相應的java程式碼減少了,但是相對的配置檔案的內容越來越多,程式碼以後的維護性也得到了越來越高的提升。後面使用SpringMVC後,

zookeeper刪改API

//監聽單節點內容 public class WatchDemo{ public static void main(String[] args) throws Exception { private String connectString="ip1:2181,ip2:2181,ip

關於js的,屬性的刪改問題

增刪改查 alt func 字面量 person per 技術分享 spa fine 刪除主要是delet方法; 1 function Person(){}; 2 var person = new Person();

Spring+Quartz 從資料庫獲取定時任務和定時時間,動態實現定時任務的刪改

本文轉載自部落格:http://blog.csdn.net/wwkms/article/details/48851005 ----------------------------------------------------------------------------------------

QueryRunner類實現資料庫表資料刪改以及八種結果集

update()方法實現增刪改        QueryRunner的update方法 update(Connection conn, String sql, Object… params) 能夠實現對錶中資料的增刪改,返回int型別的數值,表

django 利用ORM單表進行刪改

man api light 賦值 連接 取出 簡單 extern follow 牛小妹上周末,一直在嘗試如何把數據庫的數據弄到界面上。畢竟是新手,搞不出來,文檔也看不懂。不過沒關系,才剛上大學。今晚我們就來解釋下,要把數據搞到界面的第一步。先把數據放到庫裏,然後再把數據從庫

java學習3創建學生屬性:學號、姓名、電話 完全實現象集合的刪改。(控制臺來做)

main 使用 del ext str bre ack pri todo 首先創建一個student類其中包括get,set與構造函數 /** * */package work2; /** * @author Administrator * */public fina

在java對數據庫進行刪改(轉)

ima ive upd line 增加 key get cat imp 1.java連接MySql數據庫 代碼區域: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

ORM單表的刪改

price 增刪改 www com bject .html 增加 () save 表記錄的增加: 1)b = Book(name=‘python‘, price=99) b.save() 2)Book.objects.create(name=‘python‘, pric

MongoDB的基本使用及javaMongoDB的基本刪改

分布式 排序 當前 tar user hit ins test6 mes MongoDB的特點 MongoDB 是文檔存儲數據庫,存儲結構靈活 MongoDB 支持復雜查詢操作、支持序列 MongoDB 采用C++開發,可以做分布式擴展 MongoDB 采用BS

通過JTable顯示學生表的刪改

  首先我們建立好專案,由於我使用的是mysql資料庫,就要匯入連線mysql的jar包:mysql-connector-java-5.1.3-rc-bin.jar。   接下來,我們就要對專案分好層   這次我們主要講ui層的編寫,其它層的程式碼就不一 一展示了,有需要的可以在此處下載 https:

spring boot mybatis 直接寫 sql 刪改一套

思路: 1.配置每一層內容 2.在yml中配置mysql資訊 3.在mapper中配置內容sql 返回內容設定成 java.util.HashMap,輸入內容設定成string 4.在配置dao介面 5.可直接執行查詢和修改都ok   java控制

可編輯樹Ztree的使用(包括後臺資料庫的刪改

找了很多網上關於Ztree的例子和程式碼才搞定。 首先,關於Ztree的程式碼不介紹了,網上下載之後,引用下列四個檔案就能使用了。       1.關於配置選項。主要通過回撥函式來實現向後臺傳送資料,實現增刪改查。   1 var setti

haproxy檔案進行刪改

1、檔案內容 global log 127.0.0.1 local2 daemon maxconn 256 log 127.0.0.1 local2 info defaults log global mod

symfony2mysql和mongodb的刪改總結

預定義文中用到的變數: $em = $this->getDoctrine()->getEntityManager(); $repository = $em->getRepository(‘AcmeStoreBundle:Product’); 1.

node.jsmongodb的連線&刪改(附async同步流程控制)

最近嘗試了node.js和mongodb的使用。下面來一波步驟。 1.啟動mongodb資料庫 官網下載mongodb資料庫 在mongodb根目錄下建立資料夾:假設取名為test。 我們認為test就是mongodb新建的資料庫一枚。 建立批處理

PythonMongoDB的連線與刪改操作

導包 import pymongo 若沒有該模組,進入cmd, pip install pymongo 連線mongodb mongoclient = pymongo.MongoClient("localhost",port=27017

Springboot 之 JPAMysql資料庫的刪改

本文章來自【知識林】 JPA對資料庫的操作又進行了更為完善的封裝,其實現的功能基本能滿足我們90%的需求。本文章只簡單實現使用者管理的功能以展示JPA對資料庫的相關操作,使用單元測試的方式實現,如果對Springboot的單元測試不清楚的可以參考我的文章《Sp