After the conversion to async update getAll crashes Android. No error is given as app crashes as soon as Contacts.getAll is called, seems the callback is never reached.
Permissions are granted (Read and write contacts).
Contacts.getPermission works fine.
RNC version 3.1.1
RN version: 57.1
Code throwing error:
Contacts.getAll((err, contacts) => {
if (err) {
console.log(err);
return;
}
this.props.storeLocalContacts(contacts);
});
Checking logcat I get this error:
java.lang.RuntimeException: An error occurred while executing doInBackground()
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.replace(java.lang.CharSequence, java.lang.CharSequence)' on a null object reference
at com.rt2zz.reactnativecontacts.ContactsProvider.loadContactsFrom(ContactsProvider.java:360)
at com.rt2zz.reactnativecontacts.ContactsProvider.getContacts(ContactsProvider.java:184)
at com.rt2zz.reactnativecontacts.ContactsManager$1.doInBackground(ContactsManager.java:101)
at com.rt2zz.reactnativecontacts.ContactsManager$1.doInBackground(ContactsManager.java:94)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)聽
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)聽
at java.lang.Thread.run(Thread.java:764)聽
Upon further digging it seems the issue is caused by line 359 in ContactsProvider.java:
String birthday = cursor.getString(cursor.getColumnIndex(Event.START_DATE)).replace("--", "");
It seems that cursor.getColumnIndex(Event.START_DATE) isn't verified as a string before calling replace. This throws the java error as it calls replace on: null
I don't require birthdays in my app so I'm just returning an arbitrary date right instead, when I have time I will look at a proper fix for this.
https://github.com/rt2zz/react-native-contacts/blame/master/android/src/main/java/com/rt2zz/reactnativecontacts/ContactsProvider.java#L360 @Diego-Franco @garethmccall @katsumeshi mind taking a peek?
@DavidASix do you have more logs? I didn't change anything there instead of changing all the if statement for switch/case so, in this case, could be something different.
can you print a log for this line cursor.getString(cursor.getColumnIndex(Event.START_DATE)) ?
Have the same issue on an android device when call getAll :
2020-01-20 15:26:19.335 5264-5289/com.donumgiftapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: com.donumgiftapp, PID: 5264
java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:355)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:784)
Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.contacts.ContactsProvider2 from ProcessRecord{aa3eea5 5264:com.donumgiftapp/u0a643} (pid=5264, uid=10643) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS
at android.os.Parcel.createException(Parcel.java:1953)
at android.os.Parcel.readException(Parcel.java:1921)
at android.os.Parcel.readException(Parcel.java:1871)
at android.app.IActivityManager$Stub$Proxy.getContentProvider(IActivityManager.java:4159)
at android.app.ActivityThread.acquireProvider(ActivityThread.java:6845)
at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2922)
at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1879)
at android.content.ContentResolver.query(ContentResolver.java:800)
at android.content.ContentResolver.query(ContentResolver.java:766)
at android.content.ContentResolver.query(ContentResolver.java:717)
at com.rt2zz.reactnativecontacts.ContactsProvider.getContacts(ContactsProvider.java:239)
at com.rt2zz.reactnativecontacts.ContactsManager$1.doInBackground(ContactsManager.java:101)
at com.rt2zz.reactnativecontacts.ContactsManager$1.doInBackground(ContactsManager.java:94)
at android.os.AsyncTask$2.call(AsyncTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)聽
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)聽
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)聽
at java.lang.Thread.run(Thread.java:784)聽
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.am.ActivityManagerService.getContentProviderImpl(ActivityManagerService.java:13586)
at com.android.server.am.ActivityManagerService.getContentProvider(ActivityManagerService.java:14079)
at android.app.IActivityManager$Stub.onTransact(IActivityManager.java:357)
at com.android.server.am.ActivityManagerService.onTransact(ActivityManagerService.java:3654)
at com.android.server.am.HwActivityManagerService.onTransact(HwActivityManagerService.java:609)
I found error and fixed it. My mistake sorry.
yeah you needed the permissions 5264:com.donumgiftapp/u0a643} (pid=5264, uid=10643) requires android.permission.READ_CONTACTS or android.permission.WRITE_CONTACTS read the readme carefully.
Most helpful comment
Upon further digging it seems the issue is caused by line 359 in ContactsProvider.java:
String birthday = cursor.getString(cursor.getColumnIndex(Event.START_DATE)).replace("--", "");It seems that cursor.getColumnIndex(Event.START_DATE) isn't verified as a string before calling replace. This throws the java error as it calls replace on:
nullI don't require birthdays in my app so I'm just returning an arbitrary date right instead, when I have time I will look at a proper fix for this.