Android KitKat (API 19) - Comment écrire des messages en SMS Fournisseur de Contenu, sans les envoyer, à partir de la Non-Application par Défaut?
Je suis en train de créer une application Android qui écrit des messages Envoyés, Boîte de de la système. Ces messages ne doivent pas être envoyées sur le réseau GSM pour le destinataire, l'idée est seulement de les écrire dans l'Envoyé de Fournisseur de Contenu.
Pour l'instant, j'ai ce code:
Fichier Manifeste
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
Classe Java
private final String SENT_SMS_CONTENT_PROVIDER_URI_OLDER_API_19 = "content://sms/sent";
ContentValues values = new ContentValues();
values.put("address", mNumber);
values.put("body", mMessage);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
mContext.getContentResolver().insert(Telephony.Sms.Sent.CONTENT_URI, values);
else mContext.getContentResolver().insert(Uri.parse(SENT_SMS_CONTENT_PROVIDER_URI_OLDER_API_19), values);
Pour un appareil avec une version de l'API est inférieure à 19, cette application fonctionne très bien. Pour ces anciennes versions du sdk, il est seulement nécessaire pour l'accès au fournisseur de contenu défini par l'uri contenu://sms/envoyé.
Pour les nouvelles versions du sdk, ce n'est pas de travail. Apparemment, Android a changé sa façon de gérer les SMS module dans la version KitKat. Selon l'article suivant, seuls les SMS par défaut de l'application permet d'écrire et de mettre à jour le nouveau SMS Fournisseur de Contenu (android.fournisseur de.La téléphonie.Sms.Envoyé - le contenu précédent://sms/envoyé n'est également pas disponible):
Considérant le comportement de cette application, il n'est pas logique de faire tourner l'application SMS par défaut. Cette application n'a pas besoin de lire des messages SMS à partir du fournisseur de contenu et ne doivent pas envoyer de message par SmsManager.getDefault().sendTextMessage. La seule chose qu'il doit faire est d'écrire des messages Envoyés, Fournisseur.
Comme vous pouvez le comprendre, il n'est pas acceptable et possible de demander à l'utilisateur de modifier la valeur par défaut d'application de la mine, puis revenir à la précédente, application SMS, à chaque fois qu'il est nécessaire d'écrire un message de l'Envoyé (ce qui est suggéré dans la "Conseils pour SMS backup & restaurer apps" dans la section de Développeurs Android Blogspot).
Le prochain article révèle quelques moyens pour afficher l'option OP_WRITE_SMS:
Malheureusement, le code suivant arrêté de travailler pour Android 4.4.2:
Intent intent = new Intent();
intent.setClassName("com.android.settings", "com.android.settings.Settings");
intent.setAction(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
intent.putExtra(":android:show_fragment", "com.android.settings.applications.AppOpsSummary");
startActivity(intent);
Je n'ai pas de solutions pour surmonter ce problème.
OriginalL'auteur supertreta | 2014-12-29
Vous devez vous connecter pour publier un commentaire.
La
SmsWriteOpUtils
classe utilise la réflexion pour les méthodes d'accès de laAppOpsManager
Service pour activer/désactiver un non-application SMS par défaut de l'accès en écriture pour le Fournisseur SMS, API de Niveau 19 (KitKat). Une fois réglé, l'accès d'une application en mode sera conservé jusqu'à ce qu'il soit réinitialisé, ou l'application est désinstallée.Permettant à une application d'accès en écriture permet l'application de toutes les méthodes standard de l'interaction avec le Fournisseur SMS, y compris
insert()
etdelete()
.Veuillez noter que cette classe ne comprend pas d'API de contrôle du Niveau, et que le
WRITE_SMS
autorisation est toujours nécessaire.Exemple d'utilisation:
NB: Pour les utilisateurs des applications, cela ne fonctionne que sur les API de Niveau 19 (KitKat). Le trou a été corrigé dans les versions ultérieures.
Pas encore en mesure de supprimer des sms
Souvenez-vous de la
WRITE_SMS
autorisation? Pouvez-vous insérer un message? Quelles sont les valeurs retournées pour lepublic static
méthodes? Est-ce que votre code de suppression de travailler sur une version antérieure à la version KitKat? Qui de l'appareil et de la version d'Android êtes-vous tester? J'ai un banc d'essai limitée, mais tout fonctionne pour moi, et, apparemment, l'OP.Si vous avez un environnement spécifique dans lequel cela ne fonctionne pas, s'il vous plaît laissez-moi savoir les détails, et je vais l'ajouter comme une mise en garde pour la réponse.
C'est un fantastique morceau de code de Mike. Il a travaillé superbement sur KitKat. Cependant sur ma version d'Android Lollipop 5.0.1-je obtenir un "ne pas avoir de android.la permission.UPDATE_APP_OPS_STATS" l'exception". Avez-vous des idées sur la façon de résoudre ce problème? Merci beaucoup
OriginalL'auteur Mike M.