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" />


完整代码

  1. using System;  
  2.   
  3. using Android.App;  
  4. using Android.Content;  
  5. using Android.Runtime;  
  6. using Android.Views;  
  7. using Android.Widget;  
  8. using Android.OS;  
  9. using Android.Provider;  
  10. using System.Collections.Generic;  
  11. using Android.Database;  
  12. using System.IO;  
  13. using Android;  
  14.   
  15. namespace App2.Droid  
  16. {  
  17.     [Activity (Label = "App2.Android", MainLauncher = true, Icon = "@drawable/icon")]  
  18.     public class MainActivity : Activity  
  19.     {  
  20.   
  21.         protected override void OnCreate (Bundle bundle)  
  22.         {  
  23.             base.OnCreate (bundle);  
  24.   
  25.             // Set our view from the "main" layout resource  
  26.             SetContentView (Resource.Layout.Main);  
  27.   
  28.             // Get our button from the layout resource,  
  29.             // and attach an event to it  
  30.             Button button = FindViewById<Button> (Resource.Id.myButton);  
  31.               
  32.             button.Click += delegate {  
  33.  
  34.                 #region Read Contacts  
  35.   
  36.                 ICursor sqlQuery = ContentResolver.Query(ContactsContract.Contacts.ContentUri, nullnullnullnull);  
  37.   
  38.                 string str = null;  
  39.                 if (sqlQuery.MoveToFirst())  
  40.                 {  
  41.                     do  
  42.                     {  
  43.                         string contactId = sqlQuery.GetString(sqlQuery.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.Id));  
  44.                         string displayName = sqlQuery.GetString(sqlQuery.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName));  
  45.                         str += "\r\ndisplayName:" + displayName;  
  46.                         var sqlQuery2 = ContentResolver.Query(ContactsContract.CommonDataKinds.Phone.ContentUri, null"contact_id=" + contactId, nullnull);  
  47.   
  48.                         if (sqlQuery2.MoveToFirst())  
  49.                         {  
  50.                             string phoneNumber = sqlQuery2.GetString(sqlQuery2.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));  
  51.                             str += "\tnum1:" + phoneNumber;  
  52.   
  53.                             //string str1 = null;  //这段用于查看所有的列及值  
  54.                             //foreach(var col in sqlQuery2.GetColumnNames())  
  55.                             //{  
  56.                             //    str1 += "\r\n" + col + ":" + sqlQuery2.GetString(sqlQuery2.GetColumnIndex(col));  
  57.                             //}  
  58.                         }  
  59.                         if (sqlQuery2.MoveToNext())  
  60.                         {  
  61.                             string phoneNumber = sqlQuery2.GetString(sqlQuery2.GetColumnIndex(ContactsContract.CommonDataKinds.Phone.Number));  
  62.                             str += "\tnum2:" + phoneNumber;  
  63.                         }  
  64.                     }  
  65.                     while (sqlQuery.MoveToNext());  
  66.                 }  
  67.                 #endregion  
  68.   
  69.                 var textView2 = FindViewById<EditText>(Resource.Id.editText1);  
  70.                 textView2.Text = str;  
  71.   
  72.                 SaveText("contacts.txt", str);  
  73.             };  
  74.   
  75.             Button button1 = FindViewById<Button>(Resource.Id.button1);  
  76.             button1.Click += Button1_Click;  
  77.         }  
  78.   
  79.         private void Button1_Click(object sender, EventArgs e)  
  80.         {  
  81.             SaveContacts("contacts.txt");  
  82.         }  
  83.   
  84.         public void SaveText(string filename, string text)  
  85.         {  
  86.             var documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);  
  87.             //var p = System.Environment.GetFolderPath( System.Environment.SpecialFolder.Personal);  
  88.             var filePath = Path.Combine(documentsPath.AbsolutePath, filename);  
  89.   
  90.             System.IO.File.WriteAllText(filePath, text);  
  91.         }  
  92.   
  93.         public void SaveContacts(string filename)  
  94.         {  
  95.             var documentsPath = Android.OS.Environment.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDownloads);  
  96.             var filePath = Path.Combine(documentsPath.AbsolutePath, filename);  
  97.             var fileContent = File.ReadAllLines(filePath);  
  98.   
  99.             List<ContentProviderOperation> ops = new List<ContentProviderOperation>();  
  100.   
  101.             foreach (var strLine in fileContent)  
  102.             {  
  103.                 if (string.IsNullOrEmpty(strLine))  
  104.                     continue;  
  105.                 var array = strLine.Split(new string[] { "\t"":" }, StringSplitOptions.RemoveEmptyEntries);  
  106.   
  107.                 NewContact(ref ops, array[1], array[3], array.Length > 4 ? array[5] : null);  
  108.   
  109.                 //一次最多提交500条 每个联系人提交一次,多了会丢失名称  
  110.                 //逐条提交,多个联系人提交也会有问题  
  111.                 //if(ops.Count>200)  
  112.                 //{  
  113.                     //Add the new contact  
  114.                     ContentProviderResult[] res;  
  115.                     res = ContentResolver.ApplyBatch(ContactsContract.Authority, ops);  
  116.                     ops.Clear();  
  117.                 //}  
  118.             }  
  119.         }  
  120.   
  121.         public void NewContact(ref List<ContentProviderOperation> ops, string displayName,string Number1,string Number2)  
  122.         {  
  123.             ContentProviderOperation.Builder builder =  
  124.                 ContentProviderOperation.NewInsert(ContactsContract.RawContacts.ContentUri);  
  125.             builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountType, null);  
  126.             builder.WithValue(ContactsContract.RawContacts.InterfaceConsts.AccountName, null);  
  127.             ops.Add(builder.Build());  
  128.   
  129.             //Name  
  130.             builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);  
  131.             builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);  
  132.             builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,  
  133.                               ContactsContract.CommonDataKinds.StructuredName.ContentItemType);  
  134.             builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.DisplayName, displayName);  
  135.             //builder.WithValue(ContactsContract.CommonDataKinds.StructuredName.GivenName, firstName);  
  136.             ops.Add(builder.Build());  
  137.   
  138.             //Number1  
  139.             builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);  
  140.             builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);  
  141.             builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,  
  142.                               ContactsContract.CommonDataKinds.Phone.ContentItemType);  
  143.             builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, Number1);  
  144.             builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,  
  145.                               ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);  
  146.             builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Data2, (int)PhoneDataKind.Mobile);  
  147.   
  148.             ops.Add(builder.Build());  
  149.             //Number2  
  150.             if(!string.IsNullOrEmpty(Number2))  
  151.             {  
  152.                 builder = ContentProviderOperation.NewInsert(ContactsContract.Data.ContentUri);  
  153.                 builder.WithValueBackReference(ContactsContract.Data.InterfaceConsts.RawContactId, 0);  
  154.                 builder.WithValue(ContactsContract.Data.InterfaceConsts.Mimetype,  
  155.                                   ContactsContract.CommonDataKinds.Phone.ContentItemType);  
  156.                 builder.WithValue(ContactsContract.CommonDataKinds.Phone.Number, Number2);  
  157.                 builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Type,  
  158.                                   ContactsContract.CommonDataKinds.Phone.InterfaceConsts.TypeCustom);  
  159.                 builder.WithValue(ContactsContract.CommonDataKinds.Phone.InterfaceConsts.Data2, (int)PhoneDataKind.Mobile);  
  160.                 ops.Add(builder.Build());  
  161.             }  
  162.         }  
  163.     }  
  164. }  
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());
            }
        }
    }
}



<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /><uses-permission android:name="android.permission.READ_FRAME_BUFFER" /><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

http://blog.csdn.net/wangshiwei1105/article/details/76228397

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值