Java 编辑联系人';s lastname在某些API上不起作用

Java 编辑联系人';s lastname在某些API上不起作用,java,android,android-contacts,Java,Android,Android Contacts,我有一个代码可以将联系人的姓氏编辑为“anyname”,它在一些API上运行良好,在其他API上不起作用。主代码通过触摸带有此代码的按钮开始: android:onClick="start" 和主代码(无效开始): ArrayList ops=new ArrayList(); ContentProviderOperation.Builder=ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT\u URI); buil

我有一个代码可以将联系人的姓氏编辑为“anyname”,它在一些API上运行良好,在其他API上不起作用。主代码通过触摸带有此代码的按钮开始:

android:onClick="start"
和主代码(无效开始):

ArrayList ops=new ArrayList();
ContentProviderOperation.Builder=ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT\u URI);
builder.withSelection(ContactsContract.CommonDataTypes.StructuredName.CONTACT_ID+“=?”,新字符串[]{String.valueOf(1)});
builder.withValue(ContactsContract.CommonDataTypes.StructuredName.FAMILY_NAME,“anyname”);
ops.add(builder.build());
尝试
{
getContentResolver().applyBatch(contacts contract.AUTHORITY,ops);
}
捕获(例外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。你能找出问题所在吗?

将此作为答案:


您发布的日志显示了错误:

安全例外。。。需要读\ U联系人或写\ U联系人

您应该在清单上请求该权限,并在Android M及以上版本的运行时请求该权限。看

关于您的后续问题:

无需两个权限请求,您可以将两个权限请求合并为一个:

ActivityCompat.requestPermissions(this, 
    new String[]{ Manifest.permission.READ_CONTACTS, Manifest.permission.WRITE_CONTACTS }, first);
联系人ID可能会更改,但这是非常罕见的,很可能与代码不工作问题无关。 您应该在代码中添加一些日志,以查看当您单击按钮而该按钮不起作用时流停止的位置。 此外,请确保代码中没有任何try/catch,除非您期望出现异常并知道如何处理它,否则它可能会导致流在没有任何解释的情况下“无所作为”(由于崩溃)

编辑

以下是评论中提到的问题,下面是您应该如何处理权限请求流:

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() {
        ...
    }
}

您发布的日志显示错误:
SecurityException。。。需要读联系人或写联系人
,您应该在清单上请求该权限,并在Android M及以上版本的运行时请求该权限。另请参见,除非您意识到自己在做什么,否则应该避免使用try/catch隐藏异常。否则,你应该让异常崩溃你的应用程序,这样你就知道该修复什么了!成功了!我在ArrayList之前添加了这些代码。@marmor
ActivityCompat.requestPermissions(首先是新字符串[]{Manifest.permission.READ_CONTACTS});ActivityCompat.requestPermissions(这是新字符串[]{Manifest.permission.WRITE_CONTACTS},第二个)
@marmornow我有几个问题:1:添加的代码是否足够?2:有时候我需要触摸按钮几次才能操作,我的意思是有时候我只触摸按钮一次,它不工作,当我一次又一次地触摸它时,它工作了。可能是因为联系人的身份证吗?我为ID输入了数字1。联系人的ID是否是动态的,并且每次运行应用程序时都会更改?例如,一次ID号1指的是联系人“a”,另一次它指的是联系人“b”?感谢您的澄清,但有两个问题,首先因为我是业余爱好者,我真的不知道如何使用日志。但我认为问题可能在这里:当我删除Try/Catch时,这行代码:
getContentResolver().applyBatch(ContactsContract.AUTHORITY,ops)
获取此错误:
未处理的异常:android.os.RemoteException,android.content.OperationApplicationException
——然后我按Alt+Enter,运行所有这些代码的函数更改为:
public void start(视图v)抛出RemoteException,OperationApplicationException
这行代码已修复,但当我在API 24(我测试的唯一一个)上运行应用程序时,应用程序出现错误并关闭,这是记事本中的新运行时代码:顺便说一句,代码现在在API 21(5.0.0)上工作,不需要获得权限。当您第一次在API 24上运行它时,在它出错并关闭后,会弹出权限提示并询问您,如果您选择拒绝,此过程将再次重复,应用程序将再次崩溃,但奇怪的是,当您下次运行应用程序时选择允许(在应用程序第一次关闭后),它不会关闭,不会出错,工作正常!它似乎只在获取权限和错误方面存在问题,我的意思是,它似乎只需要打开一次允许/拒绝窗口,然后您选择允许,下次就可以了!有解决办法吗?我真的走到了死胡同:(
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() {
        ...
    }
}