8 votes

"com.android.phone a cessé de fonctionner" après avoir flashé CM13 de manière rapide

Après avoir flashé mon OnePlus One (bacon) de CM12.1 à CM13, je reçois constamment des fenêtres contextuelles de fermeture forcée

Malheureusement, le processus com.android.phone s'est arrêté

Logcat est rempli de traces de pile comme celle-ci :

Arrêt de la VM
FATAL EXCEPTION: main
Processus: com.android.phone, PID: 13148
java.lang.RuntimeException: Impossible d'obtenir le fournisseur com.android.providers.telephony.TelephonyProvider : java.lang.IllegalStateException: Impossible de lire la ligne 0, colonne -1 depuis CursorWindow.  Assurez-vous que le Cursor est correctement initialisé avant d'accéder à ses données.
    à android.app.ActivityThread.installProvider(ActivityThread.java:5205)
    à android.app.ActivityThread.installContentProviders(ActivityThread.java:4797)
    à android.app.ActivityThread.handleBindApplication(ActivityThread.java:4737)
    à android.app.ActivityThread.-wrap1(ActivityThread.java)
    à android.app.ActivityThread$H.handleMessage(ActivityThread.java:1424)
    à android.os.Handler.dispatchMessage(Handler.java:102)
    à android.os.Looper.loop(Looper.java:148)
    à android.app.ActivityThread.main(ActivityThread.java:5466)
    à java.lang.reflect.Method.invoke(Native Method)
    à com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
    à com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Impossible de lire la ligne 0, colonne -1 depuis CursorWindow.  Assurez-vous que le Cursor est correctement initialisé avant d'accéder à ses données.
    à android.database.CursorWindow.nativeGetString(Native Method)
    à android.database.CursorWindow.getString(CursorWindow.java:438)
    à android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
    à com.android.providers.telephony.TelephonyProvider$DatabaseHelper.getStringValueFromCursor(TelephonyProvider.java:993)
    à com.android.providers.telephony.TelephonyProvider$DatabaseHelper.copyPreservedApnsToNewTable(TelephonyProvider.java:905)
    à com.android.providers.telephony.TelephonyProvider$DatabaseHelper.onUpgrade(TelephonyProvider.java:641)
    à android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:256)
    à android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:187)
    à com.android.providers.telephony.TelephonyProvider.onCreate(TelephonyProvider.java:1457)
    à android.content.ContentProvider.attachInfo(ContentProvider.java:1748)
    à android.content.ContentProvider.attachInfo(ContentProvider.java:1723)
    à android.app.ActivityThread.installProvider(ActivityThread.java:5202)
    ... 10 more

Une fois que j'arrive d'une manière ou d'une autre à me débarrasser de la fenêtre contextuelle persistante, il semble que com.android.phone crash au moins 10 fois par seconde, inondant logcat et rendant presque impossible l'utilisation du téléphone.

Y a-t-il un espoir de solution, ou est-ce que la réinitialisation d'usine est la seule option ?

1 votes

Effacez les données pour com.android.providers.telephony (l'application est étiquetée "Stockage Téléphonique/Fournisseurs"). Pendant que vous y êtes, faites-le également pour l'application Téléphone (com.android.phone), redémarrez et dites-nous les résultats. Il semble que la base de données de com.android.providers.telephony ne puisse pas être lue. Il est possible que vous ne puissiez pas effacer les données de ces applications. Dans ce cas, supprimez leurs répertoires /data/data de la surface de la terre.

0 votes

Effacer le cache (à partir de la récupération) peut aider

0 votes

J'ai essayé de supprimer ces dossiers en utilisant Total Commander en mode root. J'ai réussi à les supprimer mais cela n'a pas aidé. J'ai aussi redémarré :( Je ne peux appeler personne...

8voto

Aaahh Points 96

Cela était dû à un changement dans le code.

Comme l'a dit Firelord, effacez les données des applications, Cela peut être fait comme ceci (cela supprimera également votre base de données SMS/MMS, alors assurez-vous de les sauvegarder au préalable):

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

Le drapeau -f est pour forcer et le drapeau -r signifie récursif.

0 votes

Ça a fonctionné! Merci. J'ai également remarqué cette ligne dans mon logcat: TelephonyProvider: dbh.onUpgrade:+ db=SQLiteDatabase: /data/user/0/com.android.providers.telephony/databases/telep‌​hony.db oldV=1114120 newV=1376264 Après avoir supprimé le répertoire de données et redémarré, les boîtes de dialogue de fermeture forcée ont cessé. Qu'y avait-il dans la base de données? J'ai remarqué que tous mes messages texte ont disparu. Autre chose?

2 votes

Lecteurs : assurez-vous de redémarrer l'appareil après avoir supprimé ces répertoires.

0 votes

De manière intéressante, il n'était pas possible de supprimer les données du menu de l'application. J'ai dû redémarrer en TWRP et supprimer le dossier là-bas (le premier était suffisant)

6voto

iSid Points 4063

J'ai eu le même problème lors de la mise à jour vers CM13 depuis CM12.1. Vous pouvez résoudre ce problème sans supprimer vos fichiers de base de données et donc sans perdre de données comme suggéré dans les autres réponses.

Le coupable semble être le code de mise à niveau de la base de données onUpgrade dans le fournisseur de téléphonie de CM. La colonne ppp_number de la table des opérateurs n'existe pas, mais le code de mise à niveau suppose qu'elle existe déjà.

J'ai résolu le problème en copiant la téléphonie.db sur ma machine Linux locale et en revenant à la version de la base de données 16 << 16 | 6 = 1048582 pour forcer le code de mise à niveau à ajouter les colonnes manquantes. Les déclarations ALTER TABLE dans le code lié sont protégées par des blocs try-catch, donc cela n'a pas d'importance si certaines colonnes existent déjà. Démarrez le téléphone en mode de récupération (par exemple TWRP) pour avoir les privilèges root adb et éviter les conflits de verrouillage avec le Android Runtime qui essaie constamment de démarrer le fournisseur de téléphonie.

% 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

Créez des sauvegardes

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

Ouvrez ensuite la base de données avec sqlite et définissez la version

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

Téléversez la base de données modifiée de nouveau sur l'appareil et corrigez les autorisations

% 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

Vous pourriez également essayer ceci sur le système cassé, ce que je ne recommanderais pas. Vous devriez probablement devenir root avec adb root pour copier et modifier les fichiers avec adb.

0 votes

Excellente attention aux détails! L'explication est grandement appréciée. Comme @gedenkt, j'ai suivi ces instructions, mais elles n'ont pas fonctionné pour moi non plus. :-/ Supprimer simplement ces deux fichiers *.db* a résolu le problème.

0 votes

Vous pouvez utiliser la commande "vacuum" pour fusionner le journal avec la base de données. $ sqlite3 telephony.db VACUUM

4voto

gedenkt Points 41

J'ai essayé la solution de Sebastian, mais l'erreur persistait. La réponse acceptée entraîne la perte de tous vos SMS, donc ce n'était pas une option pour moi. Cependant, après avoir démarré en mode de récupération et supprimé les fichiers

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

le téléphone fonctionnait à nouveau parfaitement. Les fichiers semblent contenir uniquement des données générées automatiquement, il est donc sûr de les supprimer.

0 votes

Comment puis-je supprimer certains fichiers en mode de récupération ?

1 votes

@Hinrich Si vous utilisez une récupération complète comme TWRP, vous pouvez utiliser le gestionnaire de fichiers intégré.

0 votes

Voici un peu plus de détails sur TWRP. Dans mon cas, j'utilise Safestrap 3.75 (TWRP v2.7.1.0), et j'ai dû utiliser le bouton "Montage", puis cocher "Données", puis retourner en arrière, puis utiliser le bouton "Avancé" pour utiliser le bouton "Gestionnaire de fichiers" (puis naviguer, en partant du dossier "data").

1voto

Bossdwarf Points 11

Si vous ne pouvez pas accéder à une coquille adb ou supprimer le répertoire de votre téléphone car il est inutilisable, vous pouvez également supprimer le répertoire depuis la récupération TWRP.

1 votes

Veuillez ajouter les instructions nécessaires pour faire cela dans votre réponse. Et si l'OP n'a pas TWRP?

0voto

Hinrich Points 101

Après avoir mis à jour de CM12 à CM13, j'ai rencontré le même problème. Voici comment j'ai réussi à le résoudre :

J'ai supprimé ces deux répertoires

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

complètement de mon téléphone (Nexus 5). J'ai utilisé ES Explorer pour le faire, j'ai dû activer Root Mode et Show Hidden Files pour pouvoir supprimer des fichiers dans ce répertoire.

L'historique des appels et des SMS est toujours là, je ne vois aucun inconvénient à avoir supprimé ces répertoires. Tout semble fonctionner à nouveau parfaitement.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X