Android 獲取系統的聯繫人

来源:http://www.cnblogs.com/wuyudong/archive/2016/06/18/5594802.html
-Advertisement-
Play Games

本文主要介紹android中怎樣獲取系統的聯繫人數據 首先打開模擬器 點擊聯繫人圖標按鈕 說明系統聯繫人資料庫是空的,打開File explorer,找到data/data下麵的文件夾: 將contacts2.db文件導出,添加到sqlite中的時候報錯: 點擊“ok”忽略之 表結構相當的複雜,首先 ...


本文主要介紹android中怎樣獲取系統的聯繫人數據

首先打開模擬器

點擊聯繫人圖標按鈕

說明系統聯繫人資料庫是空的,打開File explorer,找到data/data下麵的文件夾:

將contacts2.db文件導出,添加到sqlite中的時候報錯:

點擊“ok”忽略之

表結構相當的複雜,首先搞清楚其中的三張表

* data表 保存聯繫人的數據

* raw_contacts表 保存聯繫人的id contact_id

* mimetypes表 保存聯繫人數據的類型

接下來通過模擬器添加聯繫人

通過sqlite刷新contacts2.db,忽略提示錯誤

獲取聯繫人步驟

1. 查詢raw_contacts表,把聯繫人的id取出來

2. 根據聯繫人的id,查詢data表,把這個id的數據取出來

3. 根據mimetype區分數據的類型

接下來通過代碼實現

package com.wuyudong.getcontacts;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    /**
     * 獲取全部的聯繫人
     * 
     * @param view
     */
    public void click(View view) {
        ContentResolver resolver = getContentResolver();
        // 1.查詢raw_contacts表,把聯繫人的id取出來
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri datauri = Uri.parse("content://com.android.contacts/data");
        Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
                null, null, null);
        while (cursor.moveToNext()) {
            String id = cursor.getString(0);
            System.out.println("聯繫人id: " + id);
            // 2.根據聯繫人的id,查詢data表,把這個id的數據取出來
            // 系統api查詢data表的時候不是真正的查詢的data表,而是查詢data表的視圖
            Cursor dataCursor = resolver.query(datauri, new String[] { "data1", "mimetype" },
                            "raw_contact_id=?", new String[] { id }, null);
            while (dataCursor.moveToNext()) {
                String data1 = dataCursor.getString(0);
                System.out.println("data1=" + data1);
                String mimetype = dataCursor.getString(1);
                System.out.println("mimetype=" + mimetype);
            }
            dataCursor.close();
        }
        cursor.close();

    }

}

添加許可權:android.permission.READ_CONTACTS

運行後列印相關的結果:

06-18 10:59:41.556: I/System.out(2127): 聯繫人id: 1
06-18 10:59:41.636: I/System.out(2127): data1=110
06-18 10:59:41.636: I/System.out(2127): mimetype=vnd.android.cursor.item/phone_v2
06-18 10:59:41.646: I/System.out(2127): [email protected]
06-18 10:59:41.646: I/System.out(2127): mimetype=vnd.android.cursor.item/email_v2
06-18 10:59:41.646: I/System.out(2127): data1=Wuyudong
06-18 10:59:41.646: I/System.out(2127): mimetype=vnd.android.cursor.item/name

通過上面的列印信息,可以修改程式

package com.wuyudong.getcontacts;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    /**
     * 獲取全部的聯繫人
     * 
     * @param view
     */
    public void click(View view) {
        ContentResolver resolver = getContentResolver();
        // 1.查詢raw_contacts表,把聯繫人的id取出來
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri datauri = Uri.parse("content://com.android.contacts/data");
        Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
                null, null, null);
        while (cursor.moveToNext()) {
            String id = cursor.getString(0);
            System.out.println("聯繫人id: " + id);
            // 2.根據聯繫人的id,查詢data表,把這個id的數據取出來
            // 系統api查詢data表的時候不是真正的查詢的data表,而是查詢data表的視圖
            Cursor dataCursor = resolver
                    .query(datauri, new String[] { "data1", "mimetype" },
                            "raw_contact_id=?", new String[] { id }, null);
            while (dataCursor.moveToNext()) {
                String data1 = dataCursor.getString(0);

                String mimetype = dataCursor.getString(1);
                if ("vnd.android.cursor.item/name".equals(mimetype)) {
                    System.out.println("姓名=" + data1);
                } else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {
                    System.out.println("郵箱=" + data1);
                } else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
                    System.out.println("電話=" + data1);
                } else if ("vnd.android.cursor.item/im".equals(mimetype)) {
                    System.out.println("QQ=" + data1);
                }
            }
            dataCursor.close();
        }
        cursor.close();

    }

}

運行後列印相關的結果:

06-18 11:17:57.312: I/System.out(2380): 聯繫人id: 1
06-18 11:17:57.452: I/System.out(2380): 郵箱[email protected]
06-18 11:17:57.452: I/System.out(2380): 姓名=Wuyudong
06-18 11:17:57.452: I/System.out(2380): QQ=11111111
06-18 11:17:57.482: I/System.out(2380): 聯繫人id: 2
06-18 11:17:57.572: I/System.out(2380): QQ=32423423422
06-18 11:17:57.572: I/System.out(2380): 郵箱[email protected]
06-18 11:17:57.572: I/System.out(2380): 姓名=Zhangsan

最後將這些操作封裝成api,便於以後使用

新建ContactInfoParser.java文件

package com.wuyudong.getcontacts.service;

import java.util.ArrayList;
import java.util.List;

import com.wuyudong.getcontacts.domain.ContactInfo;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;

public class ContactInfoParser {
    /**
     * 獲取系統全部聯繫人的api方法
     * 
     * @param context
     * @return
     */
    public static List<ContactInfo> findAll(Context context) {
        ContentResolver resolver = context.getContentResolver();
        // 1.查詢raw_contacts表,把聯繫人的id取出來
        Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
        Uri datauri = Uri.parse("content://com.android.contacts/data");
        List<ContactInfo> infos = new ArrayList<ContactInfo>();
        Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
                null, null, null);
        while (cursor.moveToNext()) {
            String id = cursor.getString(0);
            if (id != null) {
                System.out.println("聯繫人id: " + id);
                ContactInfo info = new ContactInfo();
                info.setId(id);
                // 2.根據聯繫人的id,查詢data表,把這個id的數據取出來
                // 系統api查詢data表的時候不是真正的查詢的data表,而是查詢data表的視圖
                Cursor dataCursor = resolver.query(datauri, new String[] {
                        "data1", "mimetype" }, "raw_contact_id=?",
                        new String[] { id }, null);
                while (dataCursor.moveToNext()) {
                    String data1 = dataCursor.getString(0);
                    String mimetype = dataCursor.getString(1);
                    if ("vnd.android.cursor.item/name".equals(mimetype)) {
                        System.out.println("姓名=" + data1);
                        info.setName(data1);

                    } else if ("vnd.android.cursor.item/email_v2"
                            .equals(mimetype)) {
                        System.out.println("郵箱=" + data1);
                        info.setEmail(data1);
                    } else if ("vnd.android.cursor.item/phone_v2".equals(data1)) {
                        System.out.println("電話=" + data1);
                        info.setPhone(data1);
                    } else if ("vnd.android.cursor.item/im".equals(mimetype)) {
                        System.out.println("QQ=" + data1);
                        info.setQq(data1);
                    }

                }
                infos.add(info);
                System.out.println("-------");
                dataCursor.close();
            }
        }
        cursor.close();
        return infos;

    }

}

新建ContactInfo.java

package com.wuyudong.getcontacts.domain;

public class ContactInfo {
    
    private String name;
    private String id;
    private String phone;
    private String email;
    private String qq;
    
    @Override
    public String toString() {
        return "ContactInfo [name=" + name + ", id=" + id + ", phone=" + phone
                + ", email=" + email + ", qq=" + qq + "]";
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getPhone() {
        return phone;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getQq() {
        return qq;
    }
    public void setQq(String qq) {
        this.qq = qq;
    }
    
    

}

最後調用相關api

package com.wuyudong.getcontacts;

import java.util.List;

import com.wuyudong.getcontacts.domain.ContactInfo;
import com.wuyudong.getcontacts.service.ContactInfoParser;

import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    /**
     * 獲取全部的聯繫人
     * 
     * @param view
     */
    public void click(View view) {
        List<ContactInfo> infos = ContactInfoParser.findAll(this);
        for (ContactInfo info : infos) {
            System.out.println(info.toString());
        }

    }

}

 


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

-Advertisement-
Play Games
更多相關文章
  • 文件命名規範: 1. 項目統一使用類首碼ZY。 2. 分類命名+後面統一使用ZYExtension,例:NSDictionary+ZYExtension.h,常用分類定義在內部並寫好文檔註釋。如果功能性分類內部方法較多可以考慮按功能命名。 3. model文件可按伺服器介面名或欄位名命名,view、 ...
  • 【版權所有,轉載請註明出處。出處:http://www.cnblogs.com/joey-hua/p/5596746.html 】 首先看main.c里的初始化函數main函數裡面有個函數是對進程調度的初始化,sched_init()函數,次函數在sched.c中實現: 首先初始化任務0的TTS,F ...
  • 昨晚蘋果在舊金山召開了WWDC,看了WWDC2016直播,我們發現變得謹慎而開放的蘋果在新一版四大平臺系統中展示了很多變化,當然重中之重還是偉大的iOS。通過試用iOS10beta版,除了長大了的更強大的Siri主要感受到iMessage更加如微信般強大到除了一般的文字、圖片、表情、語音消息,還支持 ...
  • 《Android 內容觀察者的原理》中介紹了內容觀察者的一些基本原理,並做了簡單的實戰,本文接著進一步做一個小項目實戰 添加許可權:android.permission.READ_SMS 運行代碼後,只要簡訊發生變化,都會提示,並且簡訊的內容會自動保存在XXX.abc文件中 ...
  • 效果圖 具體實現代碼如下 ZCWScrollNumView.h文件 ZCWScrollNumView.m文件 控制端代碼 ...
  • 攔截簡訊,比如當發簡訊的時候,就把簡訊讀取出來,當系統的簡訊發生變化的時候,大叫一聲,把數據發送到公共的消息郵箱裡面,我們的應用通過內容觀察者觀察公共的消息郵箱 獲取ContentResolver對象,調用函數getContentResolver(), 調用ContentResolver對象的reg ...
  • 上文中《Android 獲取系統的聯繫人》主要介紹了怎樣獲取系統聯繫人並實戰了一下,本文將介紹如何添加一條聯繫人信息 添加聯繫人 1. 添加raw_contacts表,添加一條聯繫人的id 2. 操作data表,插入聯繫人的數據,每個聯繫人數據都對應一列 raw_contact_id 新建項目,佈局 ...
  • 一、Android系統自帶VideoView控制項 1. 創建步驟: (1)自帶視頻文件放入res/raw文件夾下; (2)聲明初始化VideoView控制項; (3)創建視頻文件Uri路徑,Uri調用parse(),傳入(”android.resource://”+getPackageName()+” ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...