在项目
ContentProviderSample
代码基础上实现写入共享联系人数据的示例,
具体步骤如下:
-
在
AndroidManifest.xml
中,添加写入联系人数据的权限 -
编辑布局文件
activity_contacts.xml
,界面上布局三个文本输入框用于填写联系人名称、电话号码和邮箱账号和确认写入按钮。 -
编写代码
ContactsActivity
,编写申请写入联系人数据的权限和写入操作的实现代码 -
运行代码
1. 在AndroidManifest.xml
中,添加写入联系人数据的权限
<uses-permission android:name="android.permission.READ_CONTACTS" />
2. 编辑布局文件 activity_contacts.xml
,界面上增加三个文本输入框用于填写联系人名称、电话号码和邮箱账号和确认写入按钮。
activity_contacts.xml
:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
android:padding="30dp">
<EditText
android:id="@+id/nameEt"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="name" />
<EditText
android:id="@+id/phoneEt"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="phone"
android:inputType="phone" />
<EditText
android:id="@+id/mailEt"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:hint="email"
android:inputType="textEmailAddress" />
<Button
android:id="@+id/insertBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="insert contact" />
......
</LinearLayout>
3. 编写申请写入联系人数据的权限和写入操作的实现代码
编写 ContactsActivity
,
Java 代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_contacts);
tv = findViewById(R.id.contactsTv);
nameEt = findViewById(R.id.nameEt);
phoneEt = findViewById(R.id.phoneEt);
mailEt = findViewById(R.id.mailEt);
Button insertBtn = findViewById(R.id.insertBtn);
insertBtn.setOnClickListener(view -> mayWriteTheContacts());
mayReadTheContacts();
}
private void mayWriteTheContacts() {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_CONTACTS
)
) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, 202);
} else {
writeTheContacts();
}
}
/**
* 写入联系人数据
*/
private void writeTheContacts() {
String name = nameEt.getText().toString();
String phone = phoneEt.getText().toString();
String mail = mailEt.getText().toString();
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) return;
// 插入一个空数据,获取其在系统中的 id,接下来插入数据的步骤都需要用到这个 id.
ContentValues contentValues = new ContentValues();
Uri contentUri = getContentResolver().insert(ContactsContract.RawContacts.CONTENT_URI, contentValues);
long contentID = ContentUris.parseId(contentUri);
// 插入联系人的名字
contentValues.clear();
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
contentValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name);
contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);
// 插入电话号码
contentValues.clear();
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone);
contentValues.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE);
contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);
// 插入邮箱
if (!TextUtils.isEmpty(mail)) {
contentValues.clear();
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID);
contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, mail);
contentValues.put(ContactsContract.CommonDataKinds.Email.TYPE, ContactsContract.CommonDataKinds.Email.TYPE_WORK);
contentValues.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, contentValues);
}
Toast.makeText(this, " 联系人数据添加完成 ", Toast.LENGTH_SHORT).show();
// 更新界面
nameEt.setText("");
phoneEt.setText("");
mailEt.setText("");
// 读取联系人数据,检查一下是否添加成功
mayReadTheContacts();
}
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 101:
......
break;
case 202:
if (grantResults.length > 0 && PackageManager.PERMISSION_GRANTED == grantResults[0]) {
writeTheContacts();
} else {
Toast.makeText(this, " 你拒绝了写联系人权限 ", Toast.LENGTH_SHORT).show();
finish();
}
break;
}
}
Kotlin 代码:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_contacts)
tv = findViewById(R.id.contactsTv)
nameEt = findViewById(R.id.nameEt)
phoneEt = findViewById(R.id.phoneEt)
mailEt = findViewById(R.id.mailEt)
val insertBtn = findViewById<Button>(R.id.insertBtn)
insertBtn.setOnClickListener{
mayWriteTheContacts()
}
mayReadTheContacts()
}
private fun mayWriteTheContacts() {
if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(
this,
Manifest.permission.WRITE_CONTACTS
)
) {
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.WRITE_CONTACTS),
202
)
} else {
writeTheContacts()
}
}
/**
* 写入联系人数据
*/
private fun writeTheContacts() {
val name = nameEt.text.toString()
val phone = phoneEt.text.toString()
val mail = mailEt.text.toString()
if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) return
// 插入一个空数据,获取其在系统中的 id,接下来插入数据的步骤都需要用到这个 id.
val contentValues = ContentValues()
val contentUri =
contentResolver.insert(ContactsContract.RawContacts.CONTENT_URI, contentValues)
val contentID = ContentUris.parseId(contentUri!!)
// 插入联系人的名字
contentValues.clear()
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
contentValues.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, name)
contentValues.put(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE
)
contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)
// 插入电话号码
contentValues.clear()
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
contentValues.put(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
contentValues.put(
ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE
)
contentValues.put(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE
)
contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)
// 插入邮箱
if (!TextUtils.isEmpty(mail)) {
contentValues.clear()
contentValues.put(ContactsContract.Data.RAW_CONTACT_ID, contentID)
contentValues.put(ContactsContract.CommonDataKinds.Email.DATA, mail)
contentValues.put(
ContactsContract.CommonDataKinds.Email.TYPE,
ContactsContract.CommonDataKinds.Email.TYPE_WORK
)
contentValues.put(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE
)
contentResolver.insert(ContactsContract.Data.CONTENT_URI, contentValues)
}
Toast.makeText(this, " 联系人数据添加完成 ", Toast.LENGTH_SHORT).show()
// 更新界面
nameEt.setText("")
phoneEt.setText("")
mailEt.setText("")
// 读取联系人数据,检查一下是否添加成功
mayReadTheContacts()
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
101 -> {
......
}
202 ->{
if (grantResults.isNotEmpty()&& PackageManager.PERMISSION_GRANTED == grantResults[0]) {
writeTheContacts()
} else {
Toast.makeText(this, " 你拒绝了写联系人权限 ", Toast.LENGTH_SHORT).show()
finish()
}
}
}
}
4. 运行代码
在文本框中输入信息,点击按钮,执行写入联系人操作,系统提示授权操作,点击允许;
输入数据成功,app 会再次读取联系人数据并显示,此时刚才输入的联系人数据展现在了界面上了,验证了写入联系人操作成功。
项目代码地址
Java 版:
https://github.com/BethelDEV/shaguaAndroid/tree/main/javaSource/ContentProviderSampleKotlin 版:
https://github.com/BethelDEV/shaguaAndroid/tree/main/kotlinSource/ContentProviderSample