如何解决授予权限后未立即添加到联系人
在我的 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,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,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,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,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);
}
});
解决方法
这不是 Android 或 ContactsContract 的问题,而是您对 Ask
的使用。
Ask 支持一个回调,当请求被授予您的应用时,您可以添加回调,您需要添加它并再次调用您的方法。像这样:
@AskGranted(Manifest.permission.WRITE_CONTACTS)
public void writeContactsGranted(int id) {
Log.i(TAG,"the permission was granted,calling 'addToContact' again");
// call addToContact() here with the view you need.
}
,
我使用了这个问题的答案来使它起作用:Android contacts permission granted without asking at runtime @Marmor 在问题上是正确的,但是,Ask 功能不起作用。使用 Android 23 及更高版本需要更多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。