Contact Picker - Xamarin Forms (Android and iOS)
contact_picker.cs
Section titled “contact_picker.cs”using System;
using Xamarin.Forms;
namespace contact_picker{ public class App : Application { public App () { // The root page of your application MainPage = new MyPage(); }
protected override void OnStart () { // Handle when your app starts }
protected override void OnSleep () { // Handle when your app sleeps }
protected override void OnResume () { // Handle when your app resumes } }}MyPage.cs
Section titled “MyPage.cs”using System;
using Xamarin.Forms;
namespace contact_picker{ public class MyPage : ContentPage { Button button; public MyPage () { button = new Button { Text = "choose contact" };
button.Clicked += async (object sender, EventArgs e) => {
if (Device.OS == TargetPlatform.iOS) { await Navigation.PushModalAsync (new ChooseContactPage ()); } else if (Device.OS == TargetPlatform.Android) { MessagingCenter.Send (this, "android_choose_contact", "number1"); }
};
Content = new StackLayout { Children = { new Label { Text = "Hello ContentPage" }, button } }; }
protected override void OnSizeAllocated (double width, double height) { base.OnSizeAllocated (width, height);
MessagingCenter.Subscribe<MyPage, string> (this, "num_select", (sender, arg) => { DisplayAlert ("contact", arg, "OK"); });
} }}ChooseContactPicker.cs
Section titled “ChooseContactPicker.cs”using System;using Xamarin.Forms;
namespace contact_picker{ public class ChooseContactPage : ContentPage { public ChooseContactPage () {
} }}ChooseContactActivity.cs
Section titled “ChooseContactActivity.cs”using Android.App;using Android.OS;using Android.Content;using Android.Database;using Xamarin.Forms;
namespace contact_picker.Droid{
[Activity (Label = "ChooseContactActivity")]
public class ChooseContactActivity : Activity { public string type_number = ""; protected override void OnCreate (Bundle savedInstanceState) {
base.OnCreate (savedInstanceState);
Intent intent = new Intent(Intent.ActionPick, Android.Provider.ContactsContract.CommonDataKinds.Phone.ContentUri); StartActivityForResult(intent, 1); }
protected override void OnActivityResult (int requestCode, Result resultCode, Intent data) { // TODO Auto-generated method stub
base.OnActivityResult (requestCode, resultCode, data); if (requestCode == 1) { if (resultCode == Result.Ok) {
Android.Net.Uri contactData = data.Data; ICursor cursor = ContentResolver.Query(contactData, null, null, null, null);
cursor.MoveToFirst();
string number = cursor.GetString(cursor.GetColumnIndexOrThrow(Android.Provider.ContactsContract.CommonDataKinds.Phone.Number));
var twopage_renderer = new MyPage(); MessagingCenter.Send<MyPage, string> (twopage_renderer, "num_select", number); Finish (); Xamarin.Forms.Application.Current.MainPage.Navigation.PopModalAsync ();
} else if (resultCode == Result.Canceled) { Finish (); } } } }}MainActivity.cs
Section titled “MainActivity.cs”using System;
using Android.App;using Android.Content;using Android.Content.PM;using Android.Runtime;using Android.Views;using Android.Widget;using Android.OS;using Xamarin.Forms;
namespace contact_picker.Droid{ [Activity (Label = "contact_picker.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)] public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity { protected override void OnCreate (Bundle bundle) { base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App ());
MessagingCenter.Subscribe<MyPage, string>(this, "android_choose_contact", (sender, args) => { Intent i = new Intent (Android.App.Application.Context, typeof(ChooseContactActivity)); i.PutExtra ("number1", args); StartActivity (i); }); } }}ChooseContactRenderer.cs
Section titled “ChooseContactRenderer.cs”using UIKit;using AddressBookUI;using Xamarin.Forms;using Xamarin.Forms.Platform.iOS;using contact_picker;using contact_picker.iOS;
[assembly: ExportRenderer (typeof(ChooseContactPage), typeof(ChooseContactRenderer))]
namespace contact_picker.iOS{ public partial class ChooseContactRenderer : PageRenderer { ABPeoplePickerNavigationController _contactController;
public string type_number;
protected override void OnElementChanged (VisualElementChangedEventArgs e) { base.OnElementChanged (e);
var page = e.NewElement as ChooseContactPage;
if (e.OldElement != null || Element == null) { return;
}
}
public override void ViewDidLoad () { base.ViewDidLoad ();
_contactController = new ABPeoplePickerNavigationController ();
this.PresentModalViewController (_contactController, true); //display contact chooser
_contactController.Cancelled += delegate { Xamarin.Forms.Application.Current.MainPage.Navigation.PopModalAsync ();
this.DismissModalViewController (true); };
_contactController.SelectPerson2 += delegate(object sender, ABPeoplePickerSelectPerson2EventArgs e) {
var getphones = e.Person.GetPhones(); string number = "";
if (getphones == null) { number = "Nothing"; } else if (getphones.Count > 1) { //il ya plus de 2 num de telephone foreach(var t in getphones) { number = t.Value + "/" + number; } } else if (getphones.Count == 1) { //il ya 1 num de telephone foreach(var t in getphones) { number = t.Value; } }
Xamarin.Forms.Application.Current.MainPage.Navigation.PopModalAsync ();
var twopage_renderer = new MyPage(); MessagingCenter.Send<MyPage, string> (twopage_renderer, "num_select", number); this.DismissModalViewController (true);
}; }
public override void ViewDidUnload () { base.ViewDidUnload ();
// Clear any references to subviews of the main view in order to // allow the Garbage Collector to collect them sooner. // // e.g. myOutlet.Dispose (); myOutlet = null;
this.DismissModalViewController (true); }
public override bool ShouldAutorotateToInterfaceOrientation (UIInterfaceOrientation toInterfaceOrientation) { // Return true for supported orientations return (toInterfaceOrientation != UIInterfaceOrientation.PortraitUpsideDown); } }}Remarks
Section titled “Remarks”Contact Picker XF (Android and iOS)