Android 手機衛士--獲取聯繫人信息並顯示與回顯

来源:http://www.cnblogs.com/wuyudong/archive/2016/10/12/5951794.html
-Advertisement-
Play Games

前面的文章已經實現相關的佈局,本文接著進行相關的功能實現 本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,轉載請註明出處。 讀取系統聯繫人 當點擊“選擇聯繫人”按鈕後,彈出聯繫人列表,讀取系統聯繫人分如下幾個步驟: 系統聯繫人提供了一個內容提供 ...


前面的文章已經實現相關的佈局,本文接著進行相關的功能實現

本文地址:http://www.cnblogs.com/wuyudong/p/5951794.html,轉載請註明出處。

讀取系統聯繫人

當點擊“選擇聯繫人”按鈕後,彈出聯繫人列表,讀取系統聯繫人分如下幾個步驟:

系統聯繫人提供了一個內容提供者,通過內容解析器,匹配Url地址

1,內容解析器

2,Url地址,查看系統聯繫人資料庫,內容提供者源碼

先看api文檔的清單文件,後看java類(聯繫人資料庫有多張表)

contents://com.android.contacts/表名

3,系統聯繫人資料庫中核心表的表結構

raw_contacts 聯繫人表: contact_id 聯繫人唯一性id值

data 用戶信息表:raw_contact_id作為外鍵,和raw_contacts中contact_id做關聯查詢

獲取data1欄位,包含了電話號碼以及聯繫人名稱

mimetype_id欄位,包含了當前行data1對應的數據類型

mimetypes 類型表: 獲取data表中mimetype_id和mimetypes中_id做關聯查詢,獲取指向的信息類型
電話號碼:vnd.android.cursor.item/phone_v2
用戶名稱:vnd.android.cursor.item/name

4,表的訪問方式

content://com.android.contacts/raw_contacts
content://com.android.contacts/data

下麵用代碼實現

    private ListView lv_contact;
    private List<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
    private MyAdapter mAdapter;

    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            //8,填充數據適配器
            mAdapter = new MyAdapter();
            lv_contact.setAdapter(mAdapter);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact_list);
        initUI();
        initData();
    }

    class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
            return contactList.size();
        }

        @Override
        public HashMap<String, String> getItem(int i) {
            return contactList.get(i);
        }

        @Override
        public long getItemId(int i) {
            return i;
        }

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            View v = View.inflate(getApplicationContext(), R.layout.listview_contact_item, null);
            TextView tv_name = (TextView)v.findViewById(R.id.tv_name);
            TextView tv_phone = (TextView)v.findViewById(R.id.tv_phone);
            tv_name.setText(getItem(i).get("name"));
            tv_phone.setText(getItem(i).get("phone"));
            return v;
        }
    }

    /**
     *  獲取聯繫人數據的方法
     */
    private void initData() {
        //因為讀取系統聯繫人,可能是一個耗時操作,放置到子線程中處理
        new Thread(){
            public void run(){
                //1,獲取內容解析器對象
                ContentResolver contentResolver = getContentResolver();
                //2,做查詢系統聯繫人資料庫表過程(讀取聯繫人許可權)
                Cursor cursor = contentResolver.query(
                        Uri.parse("content://com.android.contacts/raw_contacts"),
                        new String[]{"contact_id"},
                        null, null, null);
                contactList.clear();
                //3,迴圈游標,直到沒有數據為止
                while (cursor.moveToNext()){
                    String id = cursor.getString(0);
                    //4,根據用戶唯一性id值,查詢data表和mimetype表生成的視圖,獲取data以及mimetype欄位
                    Cursor indexCursor = contentResolver.query(
                            Uri.parse("content://com.android.contacts/data"),
                            new String[]{"data1","mimetype"},
                            "raw_contact_id = ?", new String[]{id}, null);
                    //5,迴圈獲取每一個聯繫人的電話號碼以及姓名,數據類型
                    HashMap<String, String> hashMap = new HashMap<String, String>();
                    while (indexCursor.moveToNext()){
                        String data = indexCursor.getString(0);
                        String type = indexCursor.getString(1);

                        //6,區分類型去給hashMap填充數據
                        if(type.equals("vnd.android.cursor.item/phone_v2")) {
                            //數據非空判斷
                            if(!TextUtils.isEmpty(data)) {
                                hashMap.put("phone", data);
                            }
                        }else if(type.equals("vnd.android.cursor.item/name")) {
                            if(!TextUtils.isEmpty(data)) {
                                hashMap.put("name", data);
                            }
                        }
                    }
                    indexCursor.close();
                    contactList.add(hashMap);

                }
                cursor.close();
                //7,消息機制,發送一個空的消息,告知主線程可以去使用子線程已經填充好的數據集合
                mHandler.sendEmptyMessage(0);
            }

        }.start();
    }

實現的效果如下:

聯繫人信息回顯

接下來實現點擊聯繫人條目,實現回顯,例如雙擊第一個條目,號碼自動添加

代碼如下:

    private void initUI() {
        lv_contact = (ListView) findViewById(R.id.lv_contact);
        lv_contact.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                //1,獲取點中條目的索引指向集合中的對象
                if(mAdapter != null) {
                    HashMap<String, String> hashMap = mAdapter.getItem(i);
                    //2,獲取當前條目指向集合對應的電話號碼
                    String phone =  hashMap.get("phone");
                    //3,此電話號碼需要給第三個導航界面使用

                    //4,在結束此界面回到前一個導航界面的時候,需要將數據返回過去
                    Intent intent = new Intent();
                    intent.putExtra("phone", phone);
                    setResult(0, intent);
                    finish();

                }
            }
        });
    }

接著onActivityResult中添加下麵的代碼

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(data != null) {
            //1,返回到當前界面的時候,接受結果的方法
            String phone = data.getStringExtra("phone");
            //2,將特殊字元過濾(中劃線轉換成空字元串)
            phone = phone.replace("-", "").replace(" ", "").trim();
            et_phone_number.setText(phone);

            //3,存儲聯繫人至sp中
            SpUtil.putString(getApplicationContext(), ConstantValue.CONTACT_PHONE, phone);
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

當填寫號碼後,進入下一頁,再次返回,發現號碼不見了,於是使用sp存儲並從中讀取

    private void initUI() {
        //顯示電話號碼的輸入框
        et_phone_number = (EditText)findViewById(R.id.et_phone_number);
        //獲取聯繫人電話號碼回顯過程
        String contact_phone = SpUtil.getString(this, ConstantValue.CONTACT_PHONE, "");
        et_phone_number.setText(contact_phone);
        bt_select_number = (Button) findViewById(R.id.bt_select_number);
       //點擊選擇聯繫人的對話框
        bt_select_number.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), ContactListActivity.class);
                startActivityForResult(intent, 0);
            }
        });
    }

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先上控制項的地址http://code.ciaoca.com/jquery/validation-engine/ 具體使用方式網站里說的很清楚,我寫這篇文章主要是用於記錄如何自己添加自定義正則表達式,這個問題折騰了幾次,剛剛纔會搞。網上也查了很多,都沒有說到點子上的,也許是我太笨沒看懂。 進入正題, ...
  • React不管在demo渲染還是UI上,都是十分方便,本人菜鳥試試學習一下,結合阮一峰老師的文章,寫下一點關於自己的學習react的學習筆記,有地方不對的地方,希望各位大牛評論指出; PS:代碼包下載: react包引入,在標簽里引入包; 首先,最後一個 <script> 標簽的 type 屬性為  ...
  • 本文實現導航界面4的業務邏輯,導航界面4的界面如下: 本文地址:http://www.cnblogs.com/wuyudong/p/5952640.html,轉載請註明出處。 相應的代碼如下: 給”下一頁“按鈕添加邏輯,當沒有選中checkbox的時候,點擊按鈕後彈出提醒,代碼如下: ...
  • Android Weekly Issue #226筆記. 本期內容包括: 用Firebase做A/B Test; 用RxJava做動畫; MVP; proguardFiles; RxJava和Android Data Binding的結合; Mockito的更新; Gradle configurat... ...
  • 最近在開發一個大項目的時候遇到一個很頭疼的問題,由於項目代碼較多,每次都要編譯鏈接1分鐘左右,調試的時候很浪費時間,於是研究了一下如何提高編譯鏈接的速度,在這裡分享給大家。 提升編譯鏈接的速度主要有以下三個方式: 1. 提高XCode編譯時使用的線程數 [plain] view plain copy ...
  • Android啟動Service有兩種方法,一種是startService,一種是bindService。生命周期如下: 執行startService時,調用者如果沒有stopService,Service會一直在後臺運行。多次調用startService,該Service只能被創建一次,即該Ser ...
  • adb命令下pull的作用是從手機端向電腦端拷文件。 adb命令下push的作用是從電腦端向手機端拷文件。 adb push /Users/edwin/Downloads/**.apk ...
  • platform :ios, '7.0' xcodeproj 'Coach.xcodeproj' target 'Coach' do pod 'MBProgressHUD', '~> 0.9.2' pod 'AFNetworking', '~> 3.1.0' pod 'MJRefresh', '~> ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...