Android 製作通訊錄(ContactsContract)
推薦一個網站,學Android時常常會去參考:
GiveMePasS's Android惡補筆記
原因:
這次真的挺苦手的
打電話、傳簡訊都還容易
倒是去撈聯絡人及撈出電話卡了好久
ContactsContract這個類真的不太好搞
好像是聯絡人是一個表
而聯絡人的資料又會對應到另一個表
而規範這些表單的類型又是一個表
學過資料庫就知道了
聯絡人就像是「訂單」
而聯絡人的資料就是「訂單名細」
一個訂單只對應一個客戶(聯絡人)
而訂單名細對應一個訂單
訂單名細可能有多種資料
像是一次訂了:
芭樂 1 箱
香蕉 2 箱
而聯絡人資料也是一樣:
手機 09xxxxxxx
市話 07xxxxxx
信箱 aa@bb.cc
參考表:
影片說明:
除了主程式,因為對聯絡人資料庫操作程式碼太長
所以參考了givemepass惡補筆記的做法,另做一個叫HandlePhoneBook
專則處理增、改、刪 等動作
注意事項:
GiveMePasS's Android惡補筆記
原因:
- 全繁體中文,介面友善
- 分類明確,東西紮實
- 步驟清析,照著做就會學到東西
這次試做通訊錄,使其能完成以下功能:
新增、刪除、修改、撥打電話、傳送簡訊
補充:
最近學到JavaScript的jQuery
不學不知道,學了覺得實在逆天的好啊!
簡單方便好上手好操作,未來會試著在blog中多加應用
可以參考→ w3school(簡體)
像下面的按鈕就是很簡單的操作
新增、刪除、修改、撥打電話、傳送簡訊
補充:
最近學到JavaScript的jQuery
不學不知道,學了覺得實在逆天的好啊!
簡單方便好上手好操作,未來會試著在blog中多加應用
可以參考→ w3school(簡體)
像下面的按鈕就是很簡單的操作
這次真的挺苦手的
打電話、傳簡訊都還容易
倒是去撈聯絡人及撈出電話卡了好久
ContactsContract這個類真的不太好搞
好像是聯絡人是一個表
而聯絡人的資料又會對應到另一個表
而規範這些表單的類型又是一個表
學過資料庫就知道了
聯絡人就像是「訂單」
而聯絡人的資料就是「訂單名細」
一個訂單只對應一個客戶(聯絡人)
而訂單名細對應一個訂單
訂單名細可能有多種資料
像是一次訂了:
芭樂 1 箱
香蕉 2 箱
而聯絡人資料也是一樣:
手機 09xxxxxxx
市話 07xxxxxx
信箱 aa@bb.cc
參考表:
類型 | 說明 |
ContactsContract.Contacts | 聯絡人 |
ContactsContract.RawContacts | 單一行的聯絡人 |
ContactsContract.Data | 聯絡人的資料 像是電話、信箱 |
ContactsContract.CommonDataKinds | 聯絡人表中的類型格式 像是電話的類型等等 |
*警告:這是我自已整理,不負任何責任*
影片說明:
除了主程式,因為對聯絡人資料庫操作程式碼太長
所以參考了givemepass惡補筆記的做法,另做一個叫HandlePhoneBook
專則處理增、改、刪 等動作
注意事項:
- 記得設定user permission,READ_CONTACTS、CALL_PHONE
WRITE_CONTACTS、SEND_SMS - 其實有些地方還可以最佳化啦,像是dialog可以寫個方法在外面
增加一個尋找的功能等等,只是我懶了…
HandlePhoneBook.class
public class HandlePhoneBook { private Context context; private Cursor contacts_name; private Cursor contacts_number; HashMapcontactMap; ArrayList > contactsArrayList; public HandlePhoneBook(Context context){ this.context = context; } //===============初始化撈出資料=========================== public ArrayList > quary(){ contactsArrayList = new ArrayList<>(); String name = ""; //查詢手機裡人名(查出來是cursor) contacts_name = context.getContentResolver().query( ContactsContract.Contacts.CONTENT_URI, null, null, null, null); while(contacts_name.moveToNext()){ contactMap = new HashMap<>(); String phoneNumber = ""; //找出表內id long id = contacts_name.getLong( contacts_name.getColumnIndex( ContactsContract.Contacts._ID)); //依id查出PhoneNumber表 contacts_number = context.getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +"="+Long.toString(id) ,null ,null); while(contacts_number.moveToNext()){ //提取電話 phoneNumber= contacts_number.getString( contacts_number.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); } contacts_number.close(); //提取姓名 name = contacts_name.getString( contacts_name.getColumnIndex( ContactsContract.Contacts.DISPLAY_NAME)); //放入Map中 contactMap.put("NAME", name); contactMap.put("NUMBER",phoneNumber); contactMap.put("ID",Long.toString(id)); //將Map放入ArrayList contactsArrayList.add(contactMap); } contacts_name.close(); return contactsArrayList; } public String getid(int position){ return contactsArrayList.get(position).get("ID"); } //=====================刪除=========================== public void delete(int position){ String id = getid(position).trim(); Log.e("id資訊", id); Uri deleteUri = Uri.withAppendedPath( ContactsContract.RawContacts.CONTENT_URI, id); context.getContentResolver().delete( deleteUri,null,null); /* //這刪除方法不完全 context.getContentResolver().delete( ContactsContract.RawContacts.CONTENT_URI,//要用RawContacts才刪得掉 ContactsContract.Contacts._ID + "=?", new String[]{id}); */ } //=====================修改=========================== public void editdetal(int position,String name,String phone){ String id = getid(position).trim(); //設定名字 ContentValues Values = new ContentValues(); Values.put(ContactsContract.Contacts.DISPLAY_NAME, name); //更新名字 context.getContentResolver().update( ContactsContract.RawContacts.CONTENT_URI, Values, ContactsContract.Contacts._ID + "=?", new String[]{id}); //設定電話 Values.clear(); Values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone); context.getContentResolver().update( ContactsContract.Data.CONTENT_URI, Values, ContactsContract.Data.RAW_CONTACT_ID + "=? and "+ ContactsContract.Data.MIMETYPE + "=?", new String[]{id,ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE}); } //=====================新增=========================== public void insertDetel(String name,String phone){ ContentValues values = new ContentValues(); //先insert一筆空值,獲得系統返回的RawContactId Uri rawContactUri = context.getContentResolver() .insert(ContactsContract.RawContacts.CONTENT_URI, values); //取得id long RawContactId = ContentUris.parseId(rawContactUri); //往data表插入姓名數據 values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, RawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME,name); context.getContentResolver().insert( ContactsContract.Data.CONTENT_URI, values); //往data表中插入電話數據 values.clear(); values.put(ContactsContract.Data.RAW_CONTACT_ID, RawContactId); values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone); values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); context.getContentResolver().insert( ContactsContract.Data.CONTENT_URI, values); } }
主程式:
public static class PlaceholderFragment extends Fragment { ArrayList> contactsArrayList;//放listview資料 HandlePhoneBook phoneBook; ListView listView; AlertDialog.Builder updateInsertDialog; //更新及插入dialog EditText newName,newNumber; LinearLayout ll; public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); listView =(ListView) rootView.findViewById(R.id.listView1); phoneBook =new HandlePhoneBook(getActivity()); resetAdapter(); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, final int position, long id) { final String name = contactsArrayList.get(position).get("NAME"); final String number = contactsArrayList.get(position).get("NUMBER"); //設定點選Item時的反應 DialogInterface.OnClickListener diaClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which) { case 0://打電話---------------------------------------------- Intent call = new Intent( Intent.ACTION_CALL,Uri.parse("tel:"+number)); startActivity(call); break; case 1://更新------------------------------------------------ updateInsertDialog = new AlertDialog.Builder(getActivity()); ll = (LinearLayout) getActivity() .getLayoutInflater().inflate(R.layout.detail, null); newName= (EditText) ll.findViewById(R.id.newName); newNumber=(EditText)ll.findViewById(R.id.newNumber); newName.setText(name); newNumber.setText(number); updateInsertDialog.setView(ll); updateInsertDialog.setTitle("更新聯絡人"); updateInsertDialog.setNegativeButton("Cencal", null); updateInsertDialog.setPositiveButton("確定", //設定點選Item中跳出的Dialog的反應 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String nameString = newName.getText().toString(); String numberString = newNumber.getText().toString(); phoneBook.editdetal(position, nameString, numberString); resetAdapter(); } }); updateInsertDialog.create().show(); break; case 2://傳簡訊 //設定簡訊輸入畫面--------------------------------------- final EditText msget = new EditText(getActivity()); msget.setLines(5); msget.setHint("請在此輸入訊息內容:"); msget.setGravity(Gravity.LEFT | Gravity.TOP); AlertDialog.Builder smsBuilder = new AlertDialog.Builder(getActivity()); smsBuilder.setTitle(name); smsBuilder.setIcon(android.R.drawable.ic_dialog_info); smsBuilder.setView(msget); smsBuilder.setNegativeButton("Cancel", null); smsBuilder.setPositiveButton("確定",new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { PendingIntent pi = PendingIntent.getActivity(getActivity(), 0, new Intent(),0); SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(number, null, msget.getText().toString(), pi, null); Toast.makeText(getActivity(), "簡訊已送出", Toast.LENGTH_SHORT).show(); } }); smsBuilder.create().show(); break; case 3://刪除----------------------------------------------- phoneBook.delete(position); resetAdapter(); break; } }}; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(name) .setItems(new String[] {"call","Edit","Send Message","Delete"},diaClickListener) .setNegativeButton("Cancel",null); builder.show(); } }); return rootView; } //重整畫面,每次增、刪、改都要呼叫此方法--------------------------- public void resetAdapter(){ contactsArrayList = phoneBook.quary(); //設定ListView的表單內容 SimpleAdapter adapter = new SimpleAdapter( getActivity(), contactsArrayList, android.R.layout.simple_list_item_2, new String[]{"NAME","NUMBER"}, new int[]{android.R.id.text1,android.R.id.text2}); listView.setAdapter(adapter); } @Override public void onCreate(Bundle savedInstanceState) { setHasOptionsMenu(true); //開啟可新增menu item super.onCreate(savedInstanceState); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { menu.clear(); menu.add("新增"); super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0://按下menu中新增------------------------------------- updateInsertDialog = new AlertDialog.Builder(getActivity()); ll = (LinearLayout) getActivity() .getLayoutInflater().inflate(R.layout.detail, null); newName= (EditText) ll.findViewById(R.id.newName); newNumber=(EditText)ll.findViewById(R.id.newNumber); updateInsertDialog.setView(ll); updateInsertDialog.setTitle("新增聯絡人"); updateInsertDialog.setNegativeButton("Cencal", null); updateInsertDialog.setPositiveButton("確定", //設定點選Item中跳出的Dialog的反應 new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String nameString = newName.getText().toString(); String numberString = newNumber.getText().toString(); phoneBook.insertDetel(nameString, numberString); resetAdapter(); } }); updateInsertDialog.create().show(); break; } return super.onOptionsItemSelected(item); } }
留言
張貼留言