Xamarin Android讀寫Contacts聯繫人

需求概述

換手機,卡也要換,爲將聯繫人導入新機下載了個App,使用時發現還要收費,我了個去,這點功能也收費,真當自己是高科技了.

So,自己動手豐衣足食.誰讓自己是程序猿兼攻城獅呢.


流程設計

舊機讀出聯繫人->存成文件->拷貝到電腦->拷貝到新機->導入聯繫人


代碼實現


開發工具

Visual Studio 2017 Xamarin Android原生項目
  • button點擊讀取所有聯繫人,顯示在文本框中,並以固定格式存入Download目錄
  • button1從Download目錄讀取文本,解析,寫入聯繫人
  • 我的一個聯繫人下面最多兩個電話號碼,所以讀號碼只讀兩次

需要的權限

         <uses-permissionandroid:name="android.permission.READ_CONTACTS" />

         <uses-permissionandroid:name="android.permission.WRITE_CONTACTS" />

         <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE" />

         <uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE" />


完整代碼

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Provider;
using System.Collections.Generic;
using Android.Database;
using System.IO;
using Android;

namespace App2.Droid
{
	[Activity (Label = "App2.Android", MainLauncher = true, Icon = "@drawable/icon")]
	public class MainActivity : Activity
	{

		protected override void OnCreate (Bundle bundle)
		{
			base.OnCreate (bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);

			// Get our button from the layout resource,
			// and attach an event to it
			Button button = FindViewById<Button> (Resource.Id.myButton);
			
			button.Click += delegate {

                #region Read Contacts

                ICursor sqlQuery = ContentResolver.Query(ContactsContract.Contacts.ContentUri, null, null, null, null);

                string str = null;
                if (sqlQuery.MoveToFirst())
                {
                    do
                    {
                        string contactId = sqlQuery.GetString(sqlQuery.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id));
                        string displayName = sqlQuery.GetString(sqlQuery.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName));
                        str += "\r\ndisplayName:" + displayName;
                        var sqlQuery2 = ContentResolver.Query(ContactsContract.CommonDataKinds.Phone.ContentUri, null, "contact_id=" + contactId, null, null);

                        if (sqlQuery2.MoveToFirst())
                        {
                            string phoneNumber = sqlQuery2.GetString(sqlQuery2.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));
                            str += "\tnum1:" + phoneNumber;

                            //string str1 = null;  //這段用於查看所有的列及值
                            //foreach(var col in sqlQuery2.GetColumnNames())
                            //{
                            //    str1 += "\r\n" + col + ":" + sqlQuery2.GetString(sqlQuery2.GetColumnIndex(col));
                            //}
                        }
                        if (sqlQuery2.MoveToNext())
                        {
                            string phoneNumber = sqlQuery2.GetString(sqlQuery2.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));
                            str += "\tnum2:" + phoneNumber;
                        }
                    }
                    while (sqlQuery.MoveToNext());
                }
                #endregion

                var textView2 = FindViewById<EditText>(Resource.Id.editText1);
                textView2.Text = str;

                SaveText("contacts.txt", str);
            };

            Button button1 = FindViewById<Button>(Resource.Id.button1);
            button1.Click += Button1_Click;
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            SaveContacts("contacts.txt");
        }

        public void SaveText(string filename, string text)
        {
            var documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
            //var p = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal);
            var filePath = Path.Combine(documentsPath.AbsolutePath, filename);

            System.IO.File.WriteAllText(filePath, text);
        }

        public void SaveContacts(string filename)
        {
            var documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);
            var filePath = Path.Combine(documentsPath.AbsolutePath, filename);
            var fileContent = File.ReadAllLines(filePath);

            List<ContentProviderOperation> ops = new List<ContentProviderOperation>();

            foreach (var strLine in fileContent)
            {
                if (string.IsNullOrEmpty(strLine))
                    continue;
                var array = strLine.Split(new string[] { "\t", ":" }, StringSplitOptions.RemoveEmptyEntries);

                NewContact(ref ops, array[1], array[3], array.Length > 4 ? array[5] : null);

                //一次最多提交500條 每個聯繫人提交一次,多了會丟失名稱
                //逐條提交,多個聯繫人提交也會有問題
                //if(ops.Count>200)
                //{
                    //Add the new contact
                    ContentProviderResult[] res;
                    res = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);
                    ops.Clear();
                //}
            }
        }

        public void NewContact(ref List<ContentProviderOperation> ops, string displayName,string Number1,string Number2)
        {
            ContentProviderOperation.Builder builder =
                ContentProviderOperation.NewInsert(ContactsContract.RawContacts.ContentUri);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountType, null);
            builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountName, null);
            ops.Add(builder.Build());

            //Name
            builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.StructuredName.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.DisplayName, displayName);
            //builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, firstName);
            ops.Add(builder.Build());

            //Number1
            builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
            builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
            builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                              ContactsContract.CommonDataKinds.Phone.ContentItemType);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, Number1);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,
                              ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);
            builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Data2, (int)PhoneDataKind.Mobile);

            ops.Add(builder.Build());
            //Number2
            if(!string.IsNullOrEmpty(Number2))
            {
                builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);
                builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);
                builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,
                                  ContactsContract.CommonDataKinds.Phone.ContentItemType);
                builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, Number2);
                builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,
                                  ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);
                builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Data2, (int)PhoneDataKind.Mobile);
                ops.Add(builder.Build());
            }
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章