【发布时间】:2017-06-25 11:40:02
【问题描述】:
我有一个代码可以将联系人的姓氏编辑为“anyname”,它在某些 API 上运行良好,而在其他 API 上运行不正常。主代码首先使用此代码触摸一个按钮:
android:onClick="start"
和主要代码(void start):
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ContentProviderOperation.Builder builder = ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI);
builder.withSelection(ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + "=?", new String[]{String.valueOf(1)});
builder.withValue(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, "anyname");
ops.add(builder.build());
try
{
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
}
catch (Exception e)
{
e.printStackTrace();
}
{String.valueOf(1)} 用于选择第一个联系人。它仅不适用于以下 API:`4.3 (API 18) - 4.4.4 (API 19) - 6 (API 23) - 7 (API 24) 和 7.1 (API 25),但可以在其他 API 上正常工作,并且可以更改姓氏。关于错误或异常,我没有得到任何异常,也没有得到任何关于 API 18 和 19 的东西(在监视器和运行窗口中)。但我认为它可能需要查看所有监视器并运行行,我将 API 24 的行复制到记事本中。这些是我触摸按钮后出现的行,而不是应用程序调试或运行时出现的行。当我触摸按钮时,什么都没有显示,应用程序也不做任何事情。
其他 API 也有这些行。因此,我只复制了 API 24。你能找出问题所在吗?
【问题讨论】:
-
您发布的日志显示错误:
SecurityException ... requires READ_CONTACTS or WRITE_CONTACTS,您应该在清单上请求该权限,并在 Android M 及更高版本的运行时请求它。见developer.android.com/training/permissions/requesting.html -
另外,你应该避免使用 try/catch 来隐藏异常,除非你意识到你在做什么。否则,您应该让异常使您的应用崩溃,以便您知道要修复什么
-
谢谢你!有效!我在 ArrayList 之前添加了这些代码。
-
@marmor
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, first); ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CONTACTS}, second); -
@marmornow 我有几个问题:1:添加的代码是否足够? 2:有时我需要按几次按钮才能操作,我的意思是有时我只按一次按钮,它不起作用,当我反复触摸它时,它就起作用了。可能是由于联系人的ID吗?我输入了数字 1 作为 ID。每次我运行应用程序时,联系人的 ID 都会动态变化吗?例如,一次 ID 号 1 指的是联系人“a”,另一次是指联系人“b”?
标签: java android android-contacts