Android KitKat (API 19) - Wie Sie schreiben-Nachrichten in SMS-Inhalte-Anbieter, ohne dass Sie von Nicht-Standard-App?
Ich versuche zum erstellen einer Android-app, schreibt Nachrichten in der sent-Box des Systems. Sollten diese Meldungen nicht gesendet werden über das GSM-Netz an den Empfänger, das ist die Idee nur zu schreiben, Sie in den Content-Provider Gesendet.
Jetzt habe ich diesen code:
Manifest-Datei
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
Java-Klasse
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);
Für ein Gerät mit einer API-version kleiner als 19, ist diese Umsetzung funktioniert gut. Für diese ältere sdk-Versionen, ist es nur notwendig, um Zugriff auf die Inhalte-Anbieter definiert durch die uri Inhalt://sms/gesendet.
Für die neueren sdk Versionen, das wird nicht funktionieren. Anscheinend, Android, änderte seinen Weg zum Umgang mit dem SMS-Modul in der KitKat-Version. Nach dem nächsten Artikel, werden nur die Standard-SMS-Anwendung schreiben können, und aktualisieren Sie die neue SMS Content-Provider (android.Anbieter.- Telefonie.Sms.Gesendet - die vorherigen Inhalt://sms/gesendet ist Sie auch nicht verfügbar):
Bedenkt man das Verhalten von dieser app, es macht keinen Sinn, um es der Standard-SMS-app. Diese app braucht nicht zu Lesen SMS-Nachrichten von dem content-provider und sollte nicht jede Nachricht von SmsManager.getDefault().sendTextMessage. Das einzige, was Sie tun sollten, ist, einige schreiben von Nachrichten in den Gesendet-Anbieter.
Verstehen Sie, es ist auch nicht akzeptabel und durchführbar ist und auf Anfrage dem Benutzer das ändern der Standard-app zu mir und dann gehen Sie zurück auf die Vorherige SMS-app, jedes mal, wenn es notwendig ist, eine Nachricht zu schreiben, in dem Gesendet wird (dies wird vorgeschlagen, in der "Beratung für SMS backup & restore apps" - Abschnitt in der Android-Entwickler Blogspot).
Nächsten Artikel zeigt einige Möglichkeiten zum einblenden der option OP_WRITE_SMS:
Leider, die nächste code-aufgehört zu arbeiten für 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);
Ich bin aus Lösungen um dieses problem zu überwinden.
- Sollte man nicht die Ordner "gesendet" spiegeln nur die Nachrichten, die gesendet wurden (oder zumindest versucht), und nicht "fake" diejenigen, die bisher noch nicht?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
SmsWriteOpUtils
Klasse verwendet reflektion, um Zugriff auf die Methoden derAppOpsManager
Service, um aktivieren/deaktivieren, nicht-Standard-SMS-app schreiben, die Zugriff auf den SMS-Anbieter-API Level 19 (KitKat). Einmal eingestellt, der Zugriff einer app-Modus werden beibehalten, bis es zurückgesetzt wird, oder die app deinstalliert.Ermöglicht einer app den Schreibzugriff ermöglicht, dass die app alle standard-Methoden der Interaktion mit der SMS-Anbieter, einschließlich
insert()
unddelete()
.Bitte beachten Sie, dass diese Klasse bietet keine API-Ebene zu überprüfen, und dass die
WRITE_SMS
Genehmigung ist noch erforderlich.Beispiel:
NB: Für den regulären Benutzer-apps funktioniert dies nur auf API-Ebene 19 (KitKat). Das Loch wurde geflickt in späteren Versionen.
WRITE_SMS
Erlaubnis? Können Sie eine Nachricht einfügen? Was sind die zurückgegebenen Werte für diepublic static
Methoden? Hat Ihr löschen-code arbeiten auf eine version vor KitKat? Welches Gerät und Android-version Sie testen auf? Ich habe ein begrenztes Testgebiet, aber alles funktioniert für mich, und anscheinend der OP.