Reputation: 43
I have a crash that some times happening. According to firebase keys : -Fatal Exception: java.lang.NullPointerException phoneCursor.getString( … ) must not be null
this crash caused by ContactHelperClass the code will be below :
fun getContactInformation(activity: Activity, data: Intent, completion: (Buyer) -> Unit) {
val buyer = Buyer()
val contentUri = data.data
val contentResolver = activity.contentResolver
val cursor = contentResolver.query(contentUri!!, null, null, null, null)
if (cursor != null) {
if (cursor.moveToFirst()) {
val contactId =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID))
if (cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME) > 0) {
buyer.firstName =
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
}
if (cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER) > 0) {
val phoneCursor = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
arrayOf(contactId),
null
)
if (phoneCursor != null) {
if (phoneCursor.count > 1) {
val values = ArrayList<ContactBuyer>()
while (phoneCursor.moveToNext()) {
val contact = ContactBuyer()
contact.phoneNumber = phoneCursor.getString(
phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
)
try {
when (phoneCursor.getString(
phoneCursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.TYPE
)
).toInt()) {
ContactsContract.CommonDataKinds.Phone.TYPE_HOME -> {
contact.name =
R.string.buyer_select_phone_number_type_home.localized()
}
ContactsContract.CommonDataKinds.Phone.TYPE_WORK -> {
contact.name =
R.string.buyer_select_phone_number_type_work.localized()
}
ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME, ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK -> {
contact.name =
R.string.buyer_select_phone_number_type_fax.localized()
}
ContactsContract.CommonDataKinds.Phone.TYPE_OTHER -> {
contact.name =
R.string.shared_other.localized()
}
ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE -> {
contact.name =
R.string.buyer_select_phone_number_type_mobile.localized()
}
}
} catch (ex: Throwable) {
contact.name =
R.string.shared_other.localized()
}
values.add((contact))
}
BuyerMultiNumberDialog().showDialog(
values,
object : BuyerMultiNumberInterface {
override fun onSelectedNumber(phoneNumber: String) {
try {
parsePhoneNumberFromContacts(
activity,
phoneNumber
) { extractedCountryCode, nationalNumber ->
buyer.cellPhone =
java.lang.Long.valueOf(nationalNumber)
.toString()
buyer.countryCode = "+$extractedCountryCode"
}
phoneCursor.close()
cursor.close()
completion(buyer)
} catch (e: Exception) {
}
}
})
} else {
var phoneNumber = ""
while (phoneCursor.moveToNext()) {
phoneNumber = phoneCursor.getString(
phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
)
}
try {
parsePhoneNumberFromContacts(
activity,
phoneNumber
) { extractedCountryCode, nationalNumber ->
buyer.cellPhone =
java.lang.Long.valueOf(nationalNumber).toString()
buyer.countryCode = "+$extractedCountryCode"
}
phoneCursor.close()
cursor.close()
completion(buyer)
} catch (e: Exception) {
}
}
}
}
}
}
}
I know that it can be complicated to answer related question but any lead will be great to fix that situation.
Stack trace is below :
Fatal Exception: java.lang.NullPointerException: phoneCursor.getString( … ) must not be null at com...business.helpers.utils.ContactHelper.getContactInformation(ContactHelper.kt:71) at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog.resultLauncher$lambda-12(ShareListingSendDialog.kt:734) at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog.$r8$lambda$9BI94Y5eKf3mim33AzjWutfS-bk() at com...ui.layout.modules.shareListing.dialogs.ShareListingSendDialog$$ExternalSyntheticLambda8.onActivityResult(:4) at androidx.activity.result.ActivityResultRegistry$1.onStateChanged(ActivityResultRegistry.java:149) at androidx.lifecycle.LifecycleRegistry$ObserverWithState.dispatchEvent(LifecycleRegistry.java:360) at androidx.lifecycle.LifecycleRegistry.forwardPass(LifecycleRegistry.java:271) at androidx.lifecycle.LifecycleRegistry.sync(LifecycleRegistry.java:313) at androidx.lifecycle.LifecycleRegistry.moveToState(LifecycleRegistry.java:151) at androidx.lifecycle.LifecycleRegistry.handleLifecycleEvent(LifecycleRegistry.java:134) at androidx.fragment.app.Fragment.performStart(Fragment.java:3026) at androidx.fragment.app.FragmentStateManager.start(FragmentStateManager.java:589) at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:300) at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:112) at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1647) at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:3128) at androidx.fragment.app.FragmentManager.dispatchStart(FragmentManager.java:3079) at androidx.fragment.app.FragmentController.dispatchStart(FragmentController.java:262) at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:510) at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:248) at com...ui.layout.modules.listing.activities.listingDetail.ActivityListingDetail.onStart(ActivityListingDetail.kt:469) at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1433) at android.app.Activity.performStart(Activity.java:7986) at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3677) at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221) at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201) at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173) at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2267) at android.os.Handler.dispatchMessage(Handler.java:107) at android.os.Looper.loop(Looper.java:237) at android.app.ActivityThread.main(ActivityThread.java:8167) at java.lang.reflect.Method.invoke(Method.java) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:496) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1100)
Upvotes: 0
Views: 1045
Reputation: 2011
You seems to have some missing column/data.
I recommend using the safer getStringOrNull
variant and handle nullability
phoneCursor.getStringOrNull(
phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)
)?.let {
contact.phoneNumber = it
}
Upvotes: 0