添加联系人组会在 HTC 和三星设备上出现 NullPointerexception
Adding a contact group gives NullPointerexception on HTC and Samsung devices
我正在尝试添加一个 ContentProviderOperation
的联系人组。这适用于 Nexus、Moto G 和华硕设备,但它在 HTC M7、M8、M8 mini 和 M9、三星 S4、S5 上崩溃。因为我只有正常清理的来源Android我无法通过调试找到Nullpointer导致的问题
我在此 ContentProviderOperation
中使用的 None 个值为空。
这些组被添加到 authenticator.xml 中指定的自定义帐户类型。
代码:
public Uri addContactGroup(String title, boolean autoAdd, boolean isReadOnly, boolean isVisible){
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Groups.CONTENT_URI)
.withValue(ContactsContract.Groups.TITLE, title)
.withValue(ContactsContract.Groups.ACCOUNT_TYPE, getAccount().type)
.withValue(ContactsContract.Groups.ACCOUNT_NAME, getAccount().name)
.withValue(ContactsContract.Groups.AUTO_ADD, autoAdd)
.withValue(ContactsContract.Groups.GROUP_IS_READ_ONLY, isReadOnly)
.withValue(ContactsContract.Groups.GROUP_VISIBLE, isVisible)
.build());
try {
ContentProviderResult[] result = mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if(result.length > 0) {
return result[0].uri;
}
} catch (RemoteException | OperationApplicationException e){
Log.e(TAG, e.toString());
}
return null;
}
引发此异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'int
java.lang.Integer.intValue()' on a null object reference
at android.os.Parcel.readException(Parcel.java:1555)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185)
at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:160)
at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:573)
at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:377)
at android.content.ContentResolver.applyBatch(ContentResolver.java:1265)
at nl.dalvikvm.Whosebugquestion.content.proces.CardProcess.addContactGroup(CardProcess.java:284)
at nl.dalvikvm.Whosebugquestion.content.proces.CardProcess.initGroups(CardProcess.java:244)
at nl.dalvikvm.Whosebugquestion.sync.SyncUtils.CreateSyncAccount(SyncUtils.java:55)
at nl.dalvikvm.Whosebugquestion.ui.MainActivity.run(MainActivity.java:288)
at java.lang.Thread.run(Thread.java:818)
终于找到解决办法了!
.withValue(ContactsContract.Groups.AUTO_ADD, autoAdd ? 1 : 0)
.withValue(ContactsContract.Groups.GROUP_IS_READ_ONLY, isReadOnly ? 1 : 0)
.withValue(ContactsContract.Groups.GROUP_VISIBLE, isVisible ? 1 : 0)
显然在 Samsung 和 HTC 设备上不接受布尔值作为值,必须先将它们转换为整数。我不知道为什么它可以在其他设备上运行。
我正在尝试添加一个 ContentProviderOperation
的联系人组。这适用于 Nexus、Moto G 和华硕设备,但它在 HTC M7、M8、M8 mini 和 M9、三星 S4、S5 上崩溃。因为我只有正常清理的来源Android我无法通过调试找到Nullpointer导致的问题
ContentProviderOperation
中使用的 None 个值为空。 这些组被添加到 authenticator.xml 中指定的自定义帐户类型。
代码:
public Uri addContactGroup(String title, boolean autoAdd, boolean isReadOnly, boolean isVisible){
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
ops.add(ContentProviderOperation
.newInsert(ContactsContract.Groups.CONTENT_URI)
.withValue(ContactsContract.Groups.TITLE, title)
.withValue(ContactsContract.Groups.ACCOUNT_TYPE, getAccount().type)
.withValue(ContactsContract.Groups.ACCOUNT_NAME, getAccount().name)
.withValue(ContactsContract.Groups.AUTO_ADD, autoAdd)
.withValue(ContactsContract.Groups.GROUP_IS_READ_ONLY, isReadOnly)
.withValue(ContactsContract.Groups.GROUP_VISIBLE, isVisible)
.build());
try {
ContentProviderResult[] result = mContext.getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
if(result.length > 0) {
return result[0].uri;
}
} catch (RemoteException | OperationApplicationException e){
Log.e(TAG, e.toString());
}
return null;
}
引发此异常:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference at android.os.Parcel.readException(Parcel.java:1555) at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:185) at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:160) at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:573) at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:377) at android.content.ContentResolver.applyBatch(ContentResolver.java:1265) at nl.dalvikvm.Whosebugquestion.content.proces.CardProcess.addContactGroup(CardProcess.java:284) at nl.dalvikvm.Whosebugquestion.content.proces.CardProcess.initGroups(CardProcess.java:244) at nl.dalvikvm.Whosebugquestion.sync.SyncUtils.CreateSyncAccount(SyncUtils.java:55) at nl.dalvikvm.Whosebugquestion.ui.MainActivity.run(MainActivity.java:288) at java.lang.Thread.run(Thread.java:818)
终于找到解决办法了!
.withValue(ContactsContract.Groups.AUTO_ADD, autoAdd ? 1 : 0)
.withValue(ContactsContract.Groups.GROUP_IS_READ_ONLY, isReadOnly ? 1 : 0)
.withValue(ContactsContract.Groups.GROUP_VISIBLE, isVisible ? 1 : 0)
显然在 Samsung 和 HTC 设备上不接受布尔值作为值,必须先将它们转换为整数。我不知道为什么它可以在其他设备上运行。