安卓源碼通訊錄
『壹』 android控制第三方應用軟體訪問通信錄的許可權
如果是修改你正在開發軟體的許可權的話,在AndroidManifest.xml裡面修改,增加相應的許可權。
訪問通訊錄的是:
<!-- 讀取聯系人許可權 -->
<uses-permissionandroid:name="android.permission.READ_CONTACTS"/>
<!-- 撥打電話許可權 -->
<uses-permissionandroid:name="android.permission.CALL_PHONE"/>
『貳』 android 實現微信通訊錄(聯系人分類,並有邊欄字母滑動效果,並可以查詢聯系人) 源代碼
多編譯一下別人的包包
『叄』 eclipse安卓手機通訊錄
Android 系統給我們提供了訪問通訊錄的介面,通過介面獲取通訊錄信息。Adapter 與 View 的連接主要依靠 getView 這個方法返回我們需要的自定義 view。 ListView 是 Android App 中一個最最最常用的控制項了,所以如何讓 ListView 流暢運行,獲取良好的用戶體驗是非常重要的。 對 ListView 優化就是對 Adapter 中的 getView 方法進行優化。
核心內容:
1.獲取手機通訊錄
2.數據封裝
3.創建 Adapter
4.優化適配器
開發環境:Eclipse
效果圖:
步驟:
1.新建項目,新建GetNumber.class 類,用來獲取通訊錄中的信息
package com.yanis.getmyphonenumber;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.provider.ContactsContract.CommonDataKinds.Phone;public class GetNumber { public static List<PhoneInfo> lists = new ArrayList<PhoneInfo>(); public static String getNumber(Context context) {
Cursor cursor = context.getContentResolver().query(Phone.CONTENT_URI, null, null, null, null);
String phoneNumber;
String phoneName; while (cursor.moveToNext()) {
phoneNumber = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));//電話號碼
phoneName = cursor.getString(cursor.getColumnIndex(Phone.DISPLAY_NAME));//姓名
PhoneInfo info = new PhoneInfo(phoneName, phoneNumber);
lists.add(info);
System.out.println(phoneName+phoneNumber);
} return null;
}
}
2.添加許可權
<!-- 讀取聯系人許可權 --> <uses-permission android:name="android.permission.READ_CONTACTS"/>
3.新建PhoneInfo.class 類作為通訊錄信息封裝類
package com.yanis.getmyphonenumber;/**
*
* @author yechao
* @說明 通訊錄信息封裝類 */public class PhoneInfo { private String phoneName; private String phoneNumber; public PhoneInfo(String phoneName, String phoneNumber) {
setPhoneName(phoneName);
setPhoneNumber(phoneNumber);
} public String getPhoneName() { return phoneName;
} public void setPhoneName(String phoneName) { this.phoneName = phoneName;
} public String getPhoneNumber() { return phoneNumber;
} public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber;
}
}
4.自定義 ListView 的適配器類 MyAdapter.class
package com.yanis.getmyphonenumber;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.TextView;public class MyAdapter extends BaseAdapter { private List<PhoneInfo> lists; private Context context;//承接上下文
public MyAdapter(List<PhoneInfo> lists,Context context)
{ this.lists = lists; this.context = context;
}
//返回集合的數量 @Override public int getCount() { return lists.size();
} //返回當前數據 @Override public Object getItem(int position) { return lists.get(position);
} //獲取當前ID @Override public long getItemId(int position) { return position;
} //返回當前視圖 @Override public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder ; if(convertView==null)
{
convertView = LayoutInflater.from(context).inflate(R.layout.call,null);
holder = new ViewHolder();
holder.tvName = (TextView)convertView.findViewById(R.id.tv_Name);
holder.tvNumber = (TextView)convertView.findViewById(R.id.tv_Number);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.tvName.setText(lists.get(position).getPhoneName());
holder.tvNumber.setText(lists.get(position).getPhoneNumber()); return convertView;
}
private static class ViewHolder{
TextView tvName;
TextView tvNumber;
}
}
5.最後就是主界面代碼,至於布局太簡單就不列出來了,有興趣的童鞋可以查看源代碼package com.yanis.getmyphonenumber;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;public class MainActivity extends Activity { private ListView listView; private MyAdapter adapter;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GetNumber.getNumber(this);
initView();
} private void initView() {
listView =(ListView) findViewById(R.id.listView);
adapter = new MyAdapter(GetNumber.lists, this);
listView.setAdapter(adapter);
}
}
『肆』 求Android通訊錄備份源代碼,
eoe上面有,需要的留下方式
『伍』 android 通訊錄 怎麼改聯系人
通過getContentResolver()得到ContentResolver
後,我們就可以通過該對象的delete,insert,updata,query等方法間接操作聯系人資料庫,那麼,如果我們刪除某些聯系人,以ContactsContract.RawContacts.CONTENT_URI為例,怎麼做,先來看下源碼:
首先,ContentResolver調用delete();刪除操作從紅色部分開始
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
waitForAccess();
return super.delete(uri, selection, selectionArgs);
}
上面的super.delete(uri, selection, selectionArgs)調用父親方法
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int count = 0;
boolean applyingBatch = applyingBatch();
if (!applyingBatch) {
mDb = mOpenHelper.getWritableDatabase();
mDb.beginTransactionWithListener(this);
try {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
mDb.setTransactionSuccessful();
} finally {
mDb.endTransaction();
}
onEndTransaction();
} else {
count = deleteInTransaction(uri, selection, selectionArgs);
if (count > 0) {
mNotifyChange = true;
}
}
return count;
}
父類回調deleteInTransaction(uri, selection, selectionArgs);刪除聯系人操作在這里進行。
//該方法對uri進行匹配來執行相應的刪除操作,並且是在事務中完成的,,比如
//content://com.android.contacts/contacts
//content://com.android.contacts/contacts/#
// .......................................................省略
@Override
protected int deleteInTransaction(Uri uri, String selection, String[] selectionArgs) {
.......................................................
.......................................................
//我們可以在uri中的authority部分可帶可選的參數ContactsContract.CALLER_IS_SYNCADAPTER
//比如uri字元串可以寫成content://com.android.contacts?ContactsContract.CALLER_IS_SYNCADAPTER=true
// ContactsContract.CALLER_IS_SYNCADAPTER默認是false的,他告訴同步適配器如何執行刪除操作。
//如果設置為true,則delete的時候直接刪除聯系人,否則,默認delete時是不會立即刪除RawContacts中的數據的,
//只是把RawContacts.DELETED標志位設置為1,從它的aggregate contact中移除該raw contact,即顯示聯系人時不顯示它的內容
//同步聯系人時,刪除伺服器上的raw contact,最終刪除手機上已
//標記為DELETED為1的raw contacts
final boolean callerIsSyncAdapter = readBooleanQueryParameter(uri, ContactsContract.CALLER_IS_SYNCADAPTER, false);
final int match = sUriMatcher.match(uri);
switch (match) {
.......................................................
.......................................................
.......................................................
case CONTACTS: {//uri為content://com.android.contacts/contacts,目錄(dir)類型
// TODO
return 0;
}
case CONTACTS_ID: {//刪除某一個聯系人,uri指定了ContactsContract.Contacts中的欄位contact_id,Item類型
long contactId = ContentUris.parseId(uri);//得到該給定聯系人數據集的id
return deleteContact(contactId);
}
.......................................................
.......................................................
.......................................................
case RAW_CONTACTS: {
int numDeletes = 0;
Cursor c = mDb.query(Tables.RAW_CONTACTS, new String[]{RawContacts._ID},
appendAccountToSelection(uri, selection), selectionArgs, null, null, null);
try {
while (c.moveToNext()) {
final long rawContactId = c.getLong(0);
numDeletes += deleteRawContact(rawContactId, callerIsSyncAdapter);
}
} finally {
c.close();
}
return numDeletes;
}
case RAW_CONTACTS_ID: {
final long rawContactId = ContentUris.parseId(uri);
return deleteRawContact(rawContactId, callerIsSyncAdapter);
}
case DATA: {
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(appendAccountToSelection(uri, selection), selectionArgs,
callerIsSyncAdapter);
}
case DATA_ID:
case PHONES_ID:
case EMAILS_ID:
case POSTALS_ID: {
long dataId = ContentUris.parseId(uri);
mSyncToNetwork |= !callerIsSyncAdapter;
return deleteData(Data._ID + "=" + dataId, null, callerIsSyncAdapter);
}
.......................................................
.......................................................
.......................................................
}
}
public int deleteRawContact(long rawContactId, boolean callerIsSyncAdapter) {
if (callerIsSyncAdapter) {
mDb.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null);
//直接刪除數據
return mDb.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null);
} else {
//從他關聯的aggregate contact移除該數據
mDbHelper.removeContactIfSingleton(rawContactId);
//標記為已刪除,但不是立即刪除數據
return markRawContactAsDeleted(rawContactId);
}
}
綜上,我們要刪除聯系人可以這樣做:
1)刪除單個聯系人:
CR.delete(ContactsContract.RawContacts.CONTENT_URI,ContactsContract.RawContacts_id + "=" + delRawId);
2)刪除全部聯系人:
getContentResolver().delete(Uri.parse(ContactsContract.RawContacts.CONTENT_URI.toString() +"?" + ContactsContract.CALLER_IS_SYNCADAPTER+"=true"), ContactsContract.RawContacts._ID + ">0", null));
數據索引從1開始,所以只要id>0就可以全部刪除raw contact記錄,上面的刪除操作是立即進行的,因為我們設置了true.
『陸』 為什麼我在eclipse導入Android自帶通訊錄源碼有那麼多錯誤,好像是缺少幾個包,求解
沒裝ANDROID SDK吧。。。
http://apps.hi..com/share/detail/34638353下面有完整教材和下載,希望採納
聯系人保存位置及文件名:/data/data/com.providers.contacts/databases/contacts2.db
『捌』 安卓通訊錄的開發代碼
直接拿 android 源代碼里的 phone 包就可以
IplImage* cameraImage = NULL;
while ((cameraImage = cvQueryFrame(capture)) != NULL)
{
cvShowImage("Camera",cameraImage);
cvWaitKey(1);
}