【发布时间】:2021-05-27 22:06:23
【问题描述】:
在我的 Android 应用程序(用 Java 编写)中,我有一个使用扫描信息将联系人添加到用户手机的功能。一旦用户授予应用程序编辑设备联系人的权限,该功能就会完美运行。但是,在授予权限后,用户需要再次按下“添加到联系人”按钮,因为该操作没有执行,才能开始。就好像原始命令在请求用户允许执行该操作时被丢弃了。 有什么办法可以在获得许可后立即添加联系人?第一次使用该应用程序的用户不会知道他们第一次添加联系人时需要在授予权限后再次按下按钮。
这是“添加到联系人”方法的代码:
private void addToContact(View v) {
//if the permission if off
Ask.on(this)
.forPermissions(Manifest.permission.WRITE_CONTACTS)
.go();
int phoneType = 1;
int emailType = 1;
// Prepare contact creation request
//
// Note: We use RawContacts because this data must be associated with a
// particular account.
// The system will aggregate this with any other data for this contact
// and create a coresponding entry in the ContactsContract.Contacts provider for us.
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.build());
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
mContactName).build());
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,
mContactPhoneNumber)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
phoneType).build());
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Email.DATA,
mContactEmail)
.withValue(ContactsContract.CommonDataKinds.Email.TYPE,
emailType).build());
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.Organization.COMPANY,
mContactOrg)
.withValue(ContactsContract.CommonDataKinds.Organization.TITLE,
mContactTitle)
.withValue(ContactsContract.CommonDataKinds.Organization.TYPE,
1).build());
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredPostal.FORMATTED_ADDRESS,
mContactAddress).build());
// Ask the Contact provider to create a new contact
Log.i(TAG, "Selected account: " + ACCOUNT_TYPE + " (" + ACCOUNT_NAME
+ ")");
Log.i(TAG, "Creating contact: " + mContactName);
int duration = Toast.LENGTH_SHORT;
Context ctx = getApplicationContext();
try {
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
Toast toast = Toast.makeText(ctx, "contact created successfully",
duration);
toast.show();
} catch (Exception e) {
// Display warning
Toast toast = Toast.makeText(ctx, "contact creation failed",
duration);
toast.show();
// Log exception
Log.e(TAG, "Exception encountered while inserting contact: " + e);
}
}
这里是调用方法的地方:
mAddToContactButton.setOnClickListener(new Button.OnClickListener() {
public void onClick(View v) {
addToContact(v);
}
});
【问题讨论】:
-
解释一下。也添加你的代码。
-
@Danish 我将添加我的代码,但是在用户授予权限后代码可以完美运行。基本上,当第一次使用应用程序并按下“添加到联系人”按钮时,应用程序会请求编辑手机联系人的权限。给定后,用户会期望已添加联系人,但事实并非如此。用户需要再次按下按钮来添加他们的第一个联系人。之后就没有问题了。
标签: java android contacts android-contacts mobile-phones