需求概述
換手機,卡也要換,為将聯系人導入新機下載下傳了個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());
}
}
}
}