【问题标题】:Editing a contact's lastname not working on some APIs编辑联系人的姓氏不适用于某些 API
【发布时间】: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 的行复制到记事本中。这些是我触摸按钮后出现的行,而不是应用程序调试或运行时出现的行。当我触摸按钮时,什么都没有显示,应用程序也不做任何事情。

https://uploadfiles.io/0sz9n

其他 API 也有这些行。因此,我只复制了 API 24。你能找出问题所在吗?

【问题讨论】:

  • 您发布的日志显示错误:SecurityException ... requires READ_CONTACTS or WRITE_CONTACTS,您应该在清单上请求该权限,并在 Android M 及更高版本的运行时请求它。见developer.android.com/training/permissions/requesting.html
  • 另外,你应该避免使用 try/catch 来隐藏异常,除非你意识到你在做什么。否则,您应该让异常使您的应用崩溃,以便您知道要修复什么
  • 谢谢你!有效!我在 ArrayList 之前添加了这些代码。
  • @marmorActivityCompat.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


【解决方案1】:

将此作为答案:

您发布的日志显示错误:

SecurityException ... 需要 READ_CONTACTS 或 WRITE_CONTACTS

您应该在清单上请求该权限,并在 Android M 及更高版本的运行时请求它。见http://developer.android.com/training/permissions/requesting.html

关于您的后续问题:

不需要两个权限请求,可以将两者合二为一:

ActivityCompat.requestPermissions(this, 
    new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }, first);

联系人 ID 可能会更改,但它非常罕见并且很可能与代码无法正常工作的问题无关。 您应该在代码中添加一些日志,以查看当您单击按钮时流程停止的位置并且它不起作用。 此外,请确保您的代码中没有任何 try/catch,除非您期待异常并知道如何处理它,否则可能会导致流程“无所事事”而没有任何解释(由于崩溃)

编辑

根据 cmets 中提到的问题,以下是您应该如何处理权限请求流程:

public class MyActivity extends Activity {
    ...
    public void start(View v) {
        if (ActivityCompat.checkSelfPermission(this, permission.WRITE_CONTACTS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{ permission.WRITE_CONTACTS }, 12345);
        } else {
            // WE ALREADY HAVE PERMISSION, RUN THE MAIN FUNCTION
            editContacts();
        }
    }

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if ((requestCode == 12345) && (grantResults.length == 1) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) {
            // WE GOT THE PERMISSION, RUN THE MAIN FUNCTION
            editContacts();
        }
    }

    public void editContacts() {
        ...
    }
}

【讨论】:

  • 感谢您的澄清,但有两个问题,首先因为我是业余爱好者,我真的不知道如何使用日志。但我认为问题可能出在此处:当我删除 Try/Catch 时,这行代码:getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 得到此错误:Unhandled exceptions: android.os.RemoteException, android.content.OperationApplicationException ----- 然后我按下 Alt + Enter 和运行所有这些的函数代码更改为:public void start(View v) throws RemoteException, OperationApplicationException
  • 那行代码已修复,但是当我在 API 24(我测试的唯一一个)上运行应用程序时,应用程序出错并关闭,这是记事本中的新运行时代码:ufile.io/ltr15
  • 顺便说一句,代码现在可以在不需要获得许可的 API 21 (5.0.0) 上运行。当您第一次在 API 24 上运行它时,在它出错并关闭后,会弹出权限提示并询问您,如果您选择拒绝,此过程将在下一次重复并且应用程序再次崩溃,但奇怪的部分是当您在下次运行应用程序时选择了允许(在应用程序第一次关闭后),它不会关闭,也不会出错并且工作正常!
  • 它似乎只有在获得权限和错误上出现问题,我的意思是它似乎只需要打开一次允许/拒绝窗口,然后您选择允许,下次就可以了!
  • 有什么解决办法吗?我真的为此走到了尽头:(
猜你喜欢
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多