"com.android.phone se ha detenido" después de parpadear sucio CM13

Después de mostrar suciamente mi OnePlus One (tocino) de CM12.1 a CM13, recibo constantemente ventanas emergentes de diálogo de cierre forzado

Unfortunately the process com.android.phone has stopped

Logcat está lleno de stacktraces como este:

Shutting down VM
FATAL EXCEPTION: main
Process: com.android.phone, PID: 13148
java.lang.RuntimeException: Unable to get provider com.android.providers.telephony.TelephonyProvider: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.app.ActivityThread.installProvider(ActivityThread.java:5205)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4797)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4737)
    at android.app.ActivityThread.-wrap1(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:148)
    at android.app.ActivityThread.main(ActivityThread.java:5466)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
    at android.database.CursorWindow.nativeGetString(Native Method)
    at android.database.CursorWindow.getString(CursorWindow.java:438)
    at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.getStringValueFromCursor(TelephonyProvider.java:993)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.copyPreservedApnsToNewTable(TelephonyProvider.java:905)
    at com.android.providers.telephony.TelephonyProvider$DatabaseHelper.onUpgrade(TelephonyProvider.java:641)
    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
    at com.android.providers.telephony.TelephonyProvider.onCreate(TelephonyProvider.java:1457)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
    at android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
    at android.app.ActivityThread.installProvider(ActivityThread.java:5202)
    ... 10 more

Una vez que de alguna manera me deshago de la ventana emergente persistente de la interfaz de usuario, parece que com.android.phonese bloquea al menos 10 veces por segundo, inunda logcat y hace que sea casi imposible usar el teléfono.

¿Hay alguna esperanza de una solución, o es un restablecimiento completo la única opción?

Borre los datos para com.android.providers.telephony(la aplicación se llama "Teléfono/almacenamiento de telefonía/proveedores"). Mientras lo hace, hágalo también para la aplicación Teléfono ( com.android.phone), reinicie y cuéntenos los resultados. Parece que la base de datos de com.android.providers.telephonyno se puede leer. Es posible que no pueda borrar los datos de esas aplicaciones. En ese caso, elimine sus directorios /data/data de la faz de la tierra.
Borrar el caché (desde la recuperación) puede ayudar
Intenté eliminar estas carpetas usando Total Commander en modo raíz. Me las arreglé para eliminar, pero no ayudó. También hice un reinicio :( No puedo llamar a nadie...

Respuestas (5)

Esto fue debido a un cambio en el código.

Como ha dicho Firelord, borre los datos de las aplicaciones. Esto se puede hacer así ( esto también eliminará su base de datos de SMS/MMS, así que asegúrese de hacer una copia de seguridad de ellos de antemano ):

adb shell
rm -fr /data/data/com.android.providers.telephony/
rm -fr /data/data/com.android.phone/
exit

El indicador -f es para fuerza y ​​el indicador -r significa recursivo.

¡Eso funciono! Gracias. También noté esta línea en mi logcat: TelephonyProvider: dbh.onUpgrade:+ db=SQLiteDatabase: /data/user/0/com.android.providers.telephony/databases/telephony.db oldV=1114120 newV=1376264después de eliminar el directorio de datos y reiniciar, los diálogos de cierre forzado se detuvieron. ¿Qué había en la base de datos? Me di cuenta de que todos mis mensajes de texto se han ido. ¿Algo más?
Lectores: asegúrese de reiniciar el dispositivo después de eliminar esos directorios.
Curiosamente, no fue posible eliminar los datos del menú de la aplicación. Necesitaba reiniciar en TWRP y eliminar la carpeta allí (la primera fue suficiente)
Este método no funciona para Cyanogenmod 14/Android 7
@Adem Nov, ¿cuál es el logcat?
Purgué cm14 y reinstalé cm13 porque cm14 estaba demasiado inacabado para mí. Todo funciona bien para mí en cm13.
Las bases de datos de @Adem pueden haberse movido android.stackexchange.com/a/155895/136434

Tuve el mismo problema al actualizar a CM13 desde CM12.1. Puede resolver este problema sin eliminar los archivos de su base de datos y, por lo tanto, perder datos como se sugiere en las otras respuestas.

El culpable parece ser una base de datos rota en el código de actualización en TelephonyProvider de CM. La ppp_numbercolumna de la tabla de transportistas no existe, pero el código de actualización asume que ya existe.

Lo resolví copiando telephony.db en mi máquina Linux local y revirtiendo la versión de la base de datos a la versión 16 << 16 | 6 = 1048582para forzar el código de actualización para agregar las columnas faltantes. Las ALTER TABLEsentencias en el código vinculado están protegidas por bloques try-catch, por lo que no importa si algunas de las columnas ya existen. Inicie el teléfono en modo de recuperación (p. ej., TWRP) para tener privilegios de root adb y evitar carreras de bloqueo con Android Runtime, que intenta constantemente iniciar el proveedor de telefonía.

% adb pull /data/user/0/com.android.providers.telephony/databases/telephony.db
% adb pull /data/user/0/com.android.providers.telephony/databases/telephony.db-journal

Crear copias de seguridad

% cp telephony.db telephony.db.bak
% cp telephony.db-journal telephony.db-journal.bak

Luego abra la base de datos con sqlite y configure la versión

% sqlite3 telephony.db
sqlite> PRAGMA user_version = 1048582;
sqlite> .quit

Vuelva a cargar la base de datos modificada en el dispositivo y corrija los permisos

% adb push telephony.db /data/user/0/com.android.providers.telephony/databases
% adb shell
~ # cd /data/user/0/com.android.providers.telephony/databases
/data/data/com.android.providers.telephony/databases # rm telephony.db-journal
/data/data/com.android.providers.telephony/databases # chown radio:radio telephony.db
/data/data/com.android.providers.telephony/databases # chmod 660 telephony.db

También podría probar esto en el sistema roto, lo cual no recomendaría. Probablemente tendría que volverse root con el adb rootfin de copiar y modificar los archivos con adb.

Excelente atención al detalle! Se agradece mucho la explicación. Al igual que @gedenkt, seguí estas instrucciones, pero tampoco me funcionaron. :-/ Sin embargo, simplemente eliminar estos dos *.db*archivos resolvió el problema.
Puede usar el comando "vacío" para fusionar el diario con la base de datos.$ sqlite3 telephony.db VACUUM

Probé la solución de Sebastian, pero el error persistió. La respuesta aceptada da como resultado la pérdida de todos sus SMS, por lo tanto, no era una opción para mí. Sin embargo, después de iniciar el modo de recuperación y eliminar los archivos

/data/data/com.android.providers.telephony/databases/telephony.db
/data/data/com.android.providers.telephony/databases/telephony.db-journal

el telefono volvio a funcionar perfectamente. Los archivos parecen contener solo datos generados automáticamente, por lo que es seguro eliminarlos.

¿Cómo puedo eliminar ciertos archivos en modo de recuperación?
@Hinrich Si usa una recuperación con todas las funciones como TWRP, puede usar el administrador de archivos incorporado.
Aquí hay un poco más de detalles sobre TWRP. En mi caso, estoy ejecutando Safestrap 3.75 (TWRP v2.7.1.0), y tuve que usar el botón "Montar", luego verificar "Datos", luego regresar, luego usar el botón "Avanzado" para usar el Botón "Administrador de archivos" (luego navegue, comenzando desde la carpeta "datos").

Si no puede acceder a un shell adb o eliminar el directorio de su teléfono porque no se puede utilizar, también puede eliminar el directorio de la recuperación TWRP.

Agregue las instrucciones necesarias para hacerlo en su respuesta. ¿Qué pasa si el OP no tiene TWRP?

Tuve el mismo problema después de actualizar de CM12 a CM13. Así es como pude arreglarlo:

Eliminé estos dos directorios.

/data/user/0/com.android.providers.telephony
/data/data/com.android.phone/

completamente desde mi teléfono (Nexus 5). Solía ES Explorer​​​​hacerlo, tenía que encender Root Modey Show Hidden Filespoder eliminar archivos en ese directorio.

El registro de llamadas y los SMS todavía están allí, no puedo ver ninguna desventaja resultante de eliminar esos directorios. Todo parece funcionar sin problemas de nuevo.