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"/>
如果有需要的,可以下載原始碼自己看看。
相關推薦
android中對sim卡聯絡人的增刪改查以及監聽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的基本使用及java對MongoDB的基本增刪改查
分布式 排序 當前 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
symfony2中mysql和mongodb的增刪改查總結
預定義文中用到的變數: $em = $this->getDoctrine()->getEntityManager(); $repository = $em->getRepository(‘AcmeStoreBundle:Product’); 1.
node.js對mongodb的連線&增刪改查(附async同步流程控制)
最近嘗試了node.js和mongodb的使用。下面來一波步驟。 1.啟動mongodb資料庫 官網下載mongodb資料庫 在mongodb根目錄下建立資料夾:假設取名為test。 我們認為test就是mongodb新建的資料庫一枚。 建立批處理
Python中MongoDB的連線與增刪改查操作
導包 import pymongo 若沒有該模組,進入cmd, pip install pymongo 連線mongodb mongoclient = pymongo.MongoClient("localhost",port=27017
Springboot 之 JPA對Mysql資料庫的增刪改查
本文章來自【知識林】 JPA對資料庫的操作又進行了更為完善的封裝,其實現的功能基本能滿足我們90%的需求。本文章只簡單實現使用者管理的功能以展示JPA對資料庫的相關操作,使用單元測試的方式實現,如果對Springboot的單元測試不清楚的可以參考我的文章《Sp