# Contact Picker - Xamarin Forms (Android and iOS)
# 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
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
using System;
using Xamarin.Forms;
namespace contact_picker
{
public class ChooseContactPage : ContentPage
{
public ChooseContactPage ()
{
}
}
}
# 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
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
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
Contact Picker XF (Android and iOS)