Jak odstranit SMS z e-mailové schránky v Androidu programově?

hlasů
96

Na telefonech se systémem Android SMS zprávy registrovaní k aplikacím také pošlou do e-mailové schránky zařízení. Nicméně, aby se zabránilo nepořádek, bylo by hezké mít možnost odstranit konkrétní aplikace SMS zpráv z e-mailové schránky, aby se snížil potenciální přetečení těchto zpráv.

Otázky týkající se jiných skupin Google na dostat definitivní odpověď na programovou cestou odstranit SMS zprávy z Android e-mailové schránky se nezdají být lisování.

Takže scénář:

  • Android spuštění App.
  • registrovat typů SMS zpráv X, Y a Z
  • zprávy P, Q, X, Y, Z proud v průběhu času, to vše uloženo v e-mailové schránky
  • Aplikace pro Android zjišťuje příjem X, Y, Z (pravděpodobně v rámci akce programu přerušení)
  • Způsob X, Y, Z
  • Desirement !!! X, Y, Z jsou odstraněny z Android e-mailové schránky

Má to bylo provedeno? Může to být provedeno?

Položena 07/01/2009 v 05:25
zdroj uživatelem
V jiných jazycích...                            


18 odpovědí

hlasů
5

Budete muset najít URI zprávy. Ale jakmile jste si nemyslím, že byste měli být schopni android.content.ContentResolver.delete (...) to.

Zde je několik více info .

Odpovězeno 08/01/2009 v 22:23
zdroj uživatelem

hlasů
27

Používání návrhy od ostatních, myslím, že jsem se dostal do práce:

(Za použití SDK v1 R2)

Není to ideální, protože jsem třeba odstranit celou konverzaci, ale pro naše účely, že je to dostačující kompromis, jak budeme alespoň vědět, všechny zprávy se bude řešit a ověřeny. Náš tok bude pravděpodobně potřebovat pak poslouchat zprávy, zachytit pro zprávu, kterou chceme, provést dotaz, jak dostat thread_id k nedávno inbounded zprávu a provést odstranění () volání.

V naší činnosti:

Uri uriSms = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uriSms, null,null,null,null); 
int id = c.getInt(0);
int thread_id = c.getInt(1); //get the thread_id
getContentResolver().delete(Uri.parse("content://sms/conversations/" + thread_id),null,null);

Poznámka: Nebyl jsem schopen udělat odstranění obsahu: // sms / e-mailové schránky / nebo obsah: // sms / all /

Vypadá to, že nit má přednost, což dává smysl, ale chybová zpráva mě jen povzbudil, aby rozhněvanější. Při pokusu Delete na SMS / inbox / nebo sms / všechny /, budete pravděpodobně získat:

java.lang.IllegalArgumentException: Unknown URL
    at com.android.providers.telephony.SmsProvider.delete(SmsProvider.java:510)
    at android.content.ContentProvider$Transport.delete(ContentProvider.java:149)
    at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:149)

Pro další reference také, ujistěte se, dát to do svého manifestu pro svůj záměr příjemce:

<receiver android:name=".intent.MySmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
    </intent-filter>
</receiver>

Všimněte si značku přijímače nemá vypadat takto:

<receiver android:name=".intent.MySmsReceiver" 
    android:permission="android.permission.RECEIVE_SMS">

Když jsem měl takové nastavení, android mi dal nějaké šílené oprávnění výjimky, které neumožnily android.phone předat mimo přijaté SMS do mého záměru. Takže nedávejte že RECEIVE_SMS atribut oprávnění ve svém záměru! Doufejme, že někdo moudřejší než já, můžete mi říct, proč tomu tak bylo.

Odpovězeno 13/01/2009 v 16:53
zdroj uživatelem

hlasů
24

Takže jsem měl hrát, a to je možné odstranit přijatou SMS. Bohužel to není všechno hračka :(

Mám přijímač, který navazuje na příchozích SMS zpráv. Právě způsob, jakým Android SMS příchozí směrování funguje tak, že část kódu odpovědný za dekódování zprávy odešle vysílání (používá sendBroadcast()metodu - což bohužel není verze, která vám umožní jednoduše nazývat abortBroadcast()) vždy, když přijde zpráva.

Můj přijímač může nebo nemusí být volána před přijímače Systems SMS, a v každém případě přijal vysílání nemá žádný majetek, který by mohl odrážet _idsloupec v tabulce SMS.

Nicméně, není jeden, aby se zastavil, které se snadno jsem psát sám (přes Handler) zpožděným zprávy s SmsMessage jako připojené objektu. (Myslím, že byste mohli přidat sami pro Runnable taky ...)

handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);

Zpoždění je tu, aby zajistily, že v době, kdy zpráva dorazí všechny přijímače Vysílání bude ukončeno své věci a zpráva bude bezpečně usadili v tabulce SMS.

Když je zpráva (nebo Runnable) Zde je obdrželi, je to, co mám dělat:

case MSG_DELETE_SMS:
    Uri deleteUri = Uri.parse("content://sms");
    SmsMessage msg = (SmsMessage)message.obj;

    getContentResolver().delete(deleteUri, "address=? and date=?", new String[] {msg.getOriginatingAddress(), String.valueOf(msg.getTimestampMillis())});

Používám původu adresu a časové razítko pole, aby zajistily velmi vysokou pravděpodobnost, že smazáním pouze zprávy Mám zájem. Kdybych chtěl být ještě paranoidní jsem mohl zahrnovat msg.getMessageBody()obsah jako součást vyhledávacího dotazu.

Ano, je zpráva odstraněna (hurá!). Bohužel notifikační lišta není aktualizován :(

Když otevřete oznamovací oblast uvidíte zprávu sedí tu pro vás ... ale když klepnete na něj otevřít ho - je to pryč!

Pro mě to není tak docela dost dobrý - chci všechny stopy zprávy zmizí - nechci, aby uživatel myslí, že je TXT, pokud není (to by mohlo způsobit pouze zprávy o chybách).

Interně v OS telefonní hovory MessagingNotification.updateNewMessageIndicator(Context), ale myslím, že třída byla skryta API, a nechtěl jsem, aby replikovat všechny tohoto kodexu právě kvůli vytváření indikátor přesné.

Odpovězeno 12/05/2009 v 05:38
zdroj uživatelem

hlasů
2

Myslím, že to nemůže být dokonale provedeno v současné době. K dispozici jsou 2 základní problémy:

  1. Jak můžete ujistěte se, že sms je již ve schránce při pokusu jej odstranit?
    Všimněte si, že SMS_RECEIVED není nařízeno vysílání.
    Takže dmyung je řešením je kompletně snaží něčí štěstí; i zpoždění při Dougovy odpověď není zárukou.

  2. SmsProvider není závit bezpečné. (Viz http://code.google.com/p/android/issues/detail?id=2916#c0 )
    Skutečnost, že více než jeden klienti žádající smazat a vložit do ní at the ve stejnou dobu může způsobit poškození dat nebo dokonce okamžité výjimka za běhu.

Odpovězeno 08/06/2009 v 14:56
zdroj uživatelem

hlasů
2

Nemohl jsem se dostat do práce pomocí roztoku dmyung, to mi dal výjimku při získávání buď ID zprávy nebo ID vlákna.

Na konci, jsem použil následující metody k získání závitu id:

private long getThreadId(Context context) {
    long threadId = 0;

    String SMS_READ_COLUMN = "read";
    String WHERE_CONDITION = SMS_READ_COLUMN + " = 0";
    String SORT_ORDER = "date DESC";
    int count = 0;

    Cursor cursor = context.getContentResolver().query(
                    SMS_INBOX_CONTENT_URI,
          new String[] { "_id", "thread_id", "address", "person", "date", "body" },
                    WHERE_CONDITION,
                    null,
                    SORT_ORDER);

    if (cursor != null) {
            try {
                count = cursor.getCount();
                if (count > 0) {
                    cursor.moveToFirst();
                    threadId = cursor.getLong(1);                              
                }
            } finally {
                    cursor.close();
            }
    }


    return threadId;
}

Pak bych mohl odstranit. Nicméně, jak uvedl Doug toto oznámení je stále existuje, se zobrazí i zpráva při otevření panel upozornění. Pouze tehdy, když klepnete na zprávu, jsem mohl skutečně vidět, že je prázdná.

Takže myslím, že jediný způsob, jak by to fungovat bude skutečně nějak zachytit SMS dříve, než budou dodány do systému, před tím, než dorazí na e-mailové schránky. Nicméně jsem velmi pochybuji, to je proveditelné. Prosím, opravte mě, jestli se mýlím.

Odpovězeno 12/06/2009 v 14:08
zdroj uživatelem

hlasů
1

Prostě vypnout oznámení na Výchozí aplikace SMS. Zpracovat své vlastní oznámení pro všechny textové zprávy!

Odpovězeno 21/06/2010 v 18:34
zdroj uživatelem

hlasů
1

Stačí se podívat na tento odkaz, bude vám nástinem toho logiky:

https://gist.github.com/5178e798d9a00cac4ddb
jen volání funkce deleteSMS () s určitým zpožděním, protože tam je nepatrný rozdíl mezi dobou oznámení, a když je uložen ve skutečnosti ...., podrobnosti se podívat na tento odkaz také ..........

http://htmlcoderhelper.com/how-to-delete-sms-from- inbox-in-android-programově /

Díky ..........

Odpovězeno 27/12/2010 v 11:10
zdroj uživatelem

hlasů
0

Prostě zkuste následující code.It smaže všechny SMS, které jsou všechny v telefonu (přijatý nebo odeslaný)

Uri uri = Uri.parse("content://sms");

ContentResolver contentResolver = getContentResolver();

Cursor cursor = contentResolver.query(uri, null, null, null,
  null);



while (cursor.moveToNext()) {

 long thread_id = cursor.getLong(1);
 Uri thread = Uri.parse("content://sms/conversations/"
   + thread_id);
 getContentResolver().delete(thread, null, null);
}
Odpovězeno 28/12/2010 v 11:44
zdroj uživatelem

hlasů
0

Vzorek pro smazání jedné SMS, nikoli konverzace:

getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadID), "_id = ?", new String[]{id});
Odpovězeno 22/01/2011 v 03:37
zdroj uživatelem

hlasů
87

„Jak Android 1.6, vysílá příchozí SMS zprávy ( android.provider.Telephony.SMS_RECEIVED) jsou dodávány jako‚objednal vysílání.‘- což znamená, že můžete sdělit systému, které součásti by měly přijímat vysílání na prvním místě“

To znamená, že můžete zachytit příchozí zprávu a přerušit vysílání něj dále.

Ve svém AndroidManifest.xmlsouboru, ujistěte se, že máte následující nastavení priority: Nejvyšší:

<receiver android:name=".receiver.SMSReceiver" android:enabled="true">
    <intent-filter android:priority="1000">
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Ve vašich BroadcastReceiver, ve onReceive()způsobu, před provedením něco s vaší zprávy, stačí zavolatabortBroadcast();

EDIT: Jak KitKat, to nefunguje už zřejmě.

EDIT2: Více informací o tom, jak to na KitKat zde:

Smazat SMS z android na 4.4.4 (postižených řádky = 0 (nula), poté zrušen)

Odpovězeno 02/06/2011 v 07:29
zdroj uživatelem

hlasů
1

Také aktualizovat soubor manifestu jako odstranit sms potřebné oprávnění k zápisu.

<uses-permission android:name="android.permission.WRITE_SMS"/>