Originally branched from react-native-contacts-wrapper
This is a simple wrapper for the native iOS and Android Contact Picker UIs, with some optional help for selecting specific fields from the contact.
yarn add react-native-select-contact
or with NPM
npm install react-native-select-contact
For React Native => 0.59 only:
react-native link react-native-select-contact
For Android support, make sure your manifest file includes permission to read contacts along with a query intent for Android 11+:
<manifest>
<!-- Add this for overall Android support -->
<uses-permission android:name="android.permission.READ_CONTACTS" />
<application>
...
</application>
<!-- Also add this for Android 11+ support -->
<queries>
<intent>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="vnd.android.cursor.dir/contact" />
</intent>
</queries>
</manifest>
Also, in addition to declaring READ_CONTACTS
permission in AndroidManifest.xml
, you also need to explicitly request for the permission at runtime. So make sure READ_CONTACT
permission is granted at runtime before calling API method(s).
For iOS support, make sure to include usage description for contacts in your Info.plist
file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
...
<key>NSContactsUsageDescription</key>
<string>THis app uses your contacts to....</string>
...
</dict>
</plist>
selectContact(): Promise<Contact | null>;
selectContactPhone(): Promise<ContactPhoneSelection | null>;
selectContactEmail(): Promise<ContactEmailSelection | null>;
selectContactPostalAddress(): Promise<ContactPostalAddressSelection | null>;
These methods all open up a separate ViewController (on IOS) or Activity (on Android) to select a contact. See Types below.
For selectContactPhone
, selectContactEmail
, or selectContactPostalAddress
, if there are more than one phone or email, an ActionSheetIOS
is
shown for IOS, and the first entry is returned for Android.
A return value null
may be because the user cancelled the contact selection. You shouldn't need to worry about doing
anything if the promise resolves to null
.
You can enable ActionSheet functionality for Android by installing an optional dependency:
yarn add react-native-action-sheet
For React Native => 0.59 only:
react-native link react-native-action-sheet
This will provide an ActionSheetAndroid
native module that this library will pick up on and use
when there are more than one phone number or email on a selected contact.
interface PhoneEntry {
number: string,
type: string
}
interface EmailEntry {
address: string,
type: string
}
interface AddressEntry {
formattedAddress: string, // android only
type: string, // android only
street: string,
city: string,
state: string,
postalCode: string,
isoCountryCode: string
}
interface Contact {
name: string,
phones: PhoneEntry[],
emails: EmailEntry[],
postalAddresses: AddressEntry[]
}
interface ContactPhoneSelection {
contact: Contact,
selectedPhone: PhoneEntry
}
interface ContactEmailSelection {
contact: Contact,
selectedEmail: EmailEntry
}
interface ContactPostalAddressSelection {
contact: Contact,
selectedAddress: AddressEntry
}
import { selectContactPhone } from 'react-native-select-contact';
import { PermissionsAndroid, Platform } from 'react-native';
async function getPhoneNumber() {
// on android we need to explicitly request for contacts permission and make sure it's granted
// before calling API methods
if (Platform.OS === 'android') {
const request = await PermissionsAndroid.request(
PermissionsAndroid.PERMISSIONS.READ_CONTACTS,
);
// denied permission
if (request === PermissionsAndroid.RESULTS.DENIED) throw Error("Permission Denied");
// user chose 'deny, don't ask again'
else if (request === PermissionsAndroid.RESULTS.NEVER_ASK_AGAIN) throw Error("Permission Denied");
}
// Here we are sure permission is granted for android or that platform is not android
const selection = await selectContactPhone();
if (!selection) {
return null;
}
let { contact, selectedPhone } = selection;
console.log(`Selected ${selectedPhone.type} phone number ${selectedPhone.number} from ${contact.name}`);
return selectedPhone.number;
}