Я использую следующий код для чтения контактов и сохранения некоторой информации в оперативной памяти. На некоторых телефонах это не работает. Исключение выдается из этого кода. Я думаю, что это происходит от moveToNext (). Может кто-то может взглянуть на это и сказать мне, если он видит что-то не так. Ниже приведен код трассировки стека из отчета об ошибках в консоли разработчика.
String[] ContactsProjection = new String[] {ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME};
String[] PhoneProjection = new String[] {Phone.NUMBER, Phone.TYPE, Phone.IS_PRIMARY};
/* Make a query for all contacts that have at least one phone number */
Cursor PhoneContacts = theActivity.managedQuery(ContactsContract.Contacts.CONTENT_URI,
ContactsProjection,
ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'",
null, null);
if(PhoneContacts == null)
return false;
String Id, Name;
/* Iterate through contacts and store them in RAM */
while(PhoneContacts.moveToNext()
{
/* ID and name can already be stored. Because there has to be least one phone number */
Id = PhoneContacts.getString(
PhoneContacts.getColumnIndex(ContactsContract.Contacts._ID));
Name = PhoneContacts.getString(
PhoneContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if((Id != null) && (Name != null))
{
/* Now get all available phone numbers for the current contact*/
Cursor Numbers = theActivity.managedQuery(Phone.CONTENT_URI, PhoneProjection,
Phone.CONTACT_ID + " = " + Id, null, null);
if(Numbers != null)
{
while(Numbers.moveToNext()) /* Store all phone numbers */
{
String Number = Numbers.getString(Numbers.getColumnIndex(Phone.NUMBER));
int Type = Numbers.getInt(Numbers.getColumnIndex(Phone.TYPE));
mCallOptions.add(new CallOption(Id, Name, Number, Type));
}
}
}
}
Получение ошибок следующим образом:
java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, display_name FROM view_htc_contacts_restricted WHERE ((has_phone_number = '1') AND (( ext_account_Type<>'DeviceOnly' ) OR ( ext_account_Type IS NULL ) )))
at android.os.Parcel.readException(Parcel.java:1255)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:217)
at android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:109)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:256)
at android.database.CursorWrapper.moveToNext(CursorWrapper.java:196)
at CallCommandHandler.boInit(CallCommandHandler.java:84)
at VoiceProcessor$1.run(VoiceProcessor.java:86)
at java.lang.Thread.run(Thread.java:1102)