检索联系人数据时出现 RuntimeException Android
RuntimeException on Retrieving Contact Data Android
作为我正在进行的简单练习计划的一部分,我想从我的手机 phone 的联系人中检索数据,特别是 phone 号码 selected 联系人,或所有联系人,如果有多个联系人。
我首先启动“联系人”应用程序并允许select联系联系人。我有一个块,已经尝试过并且是真实的,可以 selected 联系人的默认(或者如果有一个,一个)号码,但我想列出所有号码应该联系方式很多。我完全不适应,但是一旦这个片段出现并且 运行 我应该回到它。
我首先为联系人的select离子启动联系人应用程序:
void getNewTxtAlarmFromContacts(){
Intent intent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(intent, REQUEST_CONTACT_PICKER);
}
然后尝试使用以下代码段处理结果:(修改后的来源:All phone numbers of one contact for startActivityForResult):
String id = contactData.getLastPathSegment();
Cursor phoneCur = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id },
null);
final ArrayList<String> phonesList = new ArrayList<String>();
while (phoneCur.moveToNext()) {
String phone = phoneCur
.getString(phoneCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
phonesList.add(phone);
}
phoneCur.close();
现在,我首先将此块设置为在源中,检查接收到的数据是否不为空。接下来的几行,一直到 Cursor 的关闭,是我使用上面代码片段的真正目的。他们应该检索特定联系人的所有号码,即之前 selected 的那个。它们后面跟着 if-else 结构,只是为了让我可以随心所欲地处理数字。我的困难围绕着那些带有光标的行。我认为问题可能出在
的论点上
.query()
调用,因为我的功能代码,只选择默认数字的代码,只使用第一个参数。我一直收到以下错误。
02-16 11:53:01.988 3192-3192/com.naja.meno.william.notificationalarm E/ActivityThread﹕ Performing stop of activity that is not resumed: {com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu}
java.lang.RuntimeException: Performing stop of activity that is not resumed: {com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu}
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3362)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3449)
at android.app.ActivityThread.access00(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
在这个错误被 broad catch 处理程序捕获之后,系统恢复并执行第一个 if,因此表明没有数据可以找到,即使我只 select 与许多 phone 个号码联系。
我不确定我知道为什么会出现此错误。最终结果应该是我有一个包含所有相关数字的 ArrayList。
虽然可能是其他原因,但我的日志没有提供对错误站点的引用。我不明白activity我在停止什么,根据错误,我能做什么。但这就是我来这里的原因。我希望有人能帮帮忙。谢谢。
我选择为自己提供这个解决方案...
我按照代码选择了所选联系人的姓名,然后遍历了 all 联系人,显示并在我的 ArrayList 中记录了具有匹配关联名称的所有值。像这样:
它非常慢,大约需要一秒钟 (!!!!) 才能工作,但它现在可以完成工作。
String name = null;
switch (reqCode) {
case (REQUEST_CONTACT_PICKER):
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = getContentResolver().query(contactData, null, null, null, null);
if (c.moveToFirst()) {
name = c.getString(c.getColumnIndex(Phone.DISPLAY_NAME));
}
}
break;
}
if (reqCode == REQUEST_CONTACT_PICKER) {
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
Uri contactData = data.getData();
ArrayList <String> arrayList = new ArrayList<>();
try {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String nameCheck = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//Log.d("NAMES", "name: " + name + "... nameCom: " + nameCheck);
if(!nameCheck.equals(name))continue;
Log.d("SUCCESS", "Name Chosen");
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
StringBuilder sb = new StringBuilder("Range of Numbers: ");
switch (phoneType) {
case Phone.TYPE_MOBILE:
arrayList.add("Cell Number: " + phoneNumber);
sb.append("MOBILE: " + phoneNumber + "; ");
Log.e(name + "(mobile number)", phoneNumber);
break;
case Phone.TYPE_HOME:
arrayList.add("Home Number: " + phoneNumber);
sb.append("HOME: " + phoneNumber + "; ");
Log.e(name + "(home number)", phoneNumber);
break;
case Phone.TYPE_WORK:
arrayList.add("Work Number: " + phoneNumber);
sb.append("WORK: " + phoneNumber + "; ");
Log.e(name + "(work number)", phoneNumber);
break;
case Phone.TYPE_OTHER:
arrayList.add("Misc Number: " + phoneNumber);
sb.append("OTHER: " + phoneNumber + "; ");
Log.e(name + "(other number)", phoneNumber);
break;
default:
break;
}
//Toast.makeText(getBaseContext(), sb.toString(), Toast.LENGTH_SHORT).show();
}
pCur.close();
if(arrayList.isEmpty()){
Toast.makeText(getBaseContext(), "No Phone Number Found", Toast.LENGTH_LONG).show();
} else if(arrayList.size() == 1){
makeNewTxtAlarm(arrayList.get(0), name);
} else if (arrayList.size() > 1){
selectNewTxtAlarmNumber(arrayList, name);
} else{
Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
Log.d("FILES", "Failed to get phone data");
}
}
}
}
作为我正在进行的简单练习计划的一部分,我想从我的手机 phone 的联系人中检索数据,特别是 phone 号码 selected 联系人,或所有联系人,如果有多个联系人。
我首先启动“联系人”应用程序并允许select联系联系人。我有一个块,已经尝试过并且是真实的,可以 selected 联系人的默认(或者如果有一个,一个)号码,但我想列出所有号码应该联系方式很多。我完全不适应,但是一旦这个片段出现并且 运行 我应该回到它。
我首先为联系人的select离子启动联系人应用程序:
void getNewTxtAlarmFromContacts(){
Intent intent = new Intent(Intent.ACTION_PICK,
ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
startActivityForResult(intent, REQUEST_CONTACT_PICKER);
}
然后尝试使用以下代码段处理结果:(修改后的来源:All phone numbers of one contact for startActivityForResult):
String id = contactData.getLastPathSegment();
Cursor phoneCur = getContentResolver()
.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[] { id },
null);
final ArrayList<String> phonesList = new ArrayList<String>();
while (phoneCur.moveToNext()) {
String phone = phoneCur
.getString(phoneCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DATA));
phonesList.add(phone);
}
phoneCur.close();
现在,我首先将此块设置为在源中,检查接收到的数据是否不为空。接下来的几行,一直到 Cursor 的关闭,是我使用上面代码片段的真正目的。他们应该检索特定联系人的所有号码,即之前 selected 的那个。它们后面跟着 if-else 结构,只是为了让我可以随心所欲地处理数字。我的困难围绕着那些带有光标的行。我认为问题可能出在
.query()
调用,因为我的功能代码,只选择默认数字的代码,只使用第一个参数。我一直收到以下错误。
02-16 11:53:01.988 3192-3192/com.naja.meno.william.notificationalarm E/ActivityThread﹕ Performing stop of activity that is not resumed: {com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu}
java.lang.RuntimeException: Performing stop of activity that is not resumed: {com.naja.meno.william.notificationalarm/com.naja.meno.william.notificationalarm.StartMenu}
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:3362)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:3449)
at android.app.ActivityThread.access00(ActivityThread.java:169)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1307)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5487)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
在这个错误被 broad catch 处理程序捕获之后,系统恢复并执行第一个 if,因此表明没有数据可以找到,即使我只 select 与许多 phone 个号码联系。
我不确定我知道为什么会出现此错误。最终结果应该是我有一个包含所有相关数字的 ArrayList。
虽然可能是其他原因,但我的日志没有提供对错误站点的引用。我不明白activity我在停止什么,根据错误,我能做什么。但这就是我来这里的原因。我希望有人能帮帮忙。谢谢。
我选择为自己提供这个解决方案... 我按照代码选择了所选联系人的姓名,然后遍历了 all 联系人,显示并在我的 ArrayList 中记录了具有匹配关联名称的所有值。像这样:
它非常慢,大约需要一秒钟 (!!!!) 才能工作,但它现在可以完成工作。
String name = null;
switch (reqCode) {
case (REQUEST_CONTACT_PICKER):
if (resultCode == Activity.RESULT_OK) {
Uri contactData = data.getData();
Cursor c = getContentResolver().query(contactData, null, null, null, null);
if (c.moveToFirst()) {
name = c.getString(c.getColumnIndex(Phone.DISPLAY_NAME));
}
}
break;
}
if (reqCode == REQUEST_CONTACT_PICKER) {
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
Uri contactData = data.getData();
ArrayList <String> arrayList = new ArrayList<>();
try {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String nameCheck = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
//Log.d("NAMES", "name: " + name + "... nameCom: " + nameCheck);
if(!nameCheck.equals(name))continue;
Log.d("SUCCESS", "Name Chosen");
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",
new String[]{id}, null);
while (pCur.moveToNext()) {
int phoneType = pCur.getInt(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String phoneNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
StringBuilder sb = new StringBuilder("Range of Numbers: ");
switch (phoneType) {
case Phone.TYPE_MOBILE:
arrayList.add("Cell Number: " + phoneNumber);
sb.append("MOBILE: " + phoneNumber + "; ");
Log.e(name + "(mobile number)", phoneNumber);
break;
case Phone.TYPE_HOME:
arrayList.add("Home Number: " + phoneNumber);
sb.append("HOME: " + phoneNumber + "; ");
Log.e(name + "(home number)", phoneNumber);
break;
case Phone.TYPE_WORK:
arrayList.add("Work Number: " + phoneNumber);
sb.append("WORK: " + phoneNumber + "; ");
Log.e(name + "(work number)", phoneNumber);
break;
case Phone.TYPE_OTHER:
arrayList.add("Misc Number: " + phoneNumber);
sb.append("OTHER: " + phoneNumber + "; ");
Log.e(name + "(other number)", phoneNumber);
break;
default:
break;
}
//Toast.makeText(getBaseContext(), sb.toString(), Toast.LENGTH_SHORT).show();
}
pCur.close();
if(arrayList.isEmpty()){
Toast.makeText(getBaseContext(), "No Phone Number Found", Toast.LENGTH_LONG).show();
} else if(arrayList.size() == 1){
makeNewTxtAlarm(arrayList.get(0), name);
} else if (arrayList.size() > 1){
selectNewTxtAlarmNumber(arrayList, name);
} else{
Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getBaseContext(), "There is a problem with this contact...", Toast.LENGTH_LONG).show();
Log.d("FILES", "Failed to get phone data");
}
}
}
}