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());
            }
        }
    }
}



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