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ů
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ů
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ů
10
public boolean deleteSms(String smsId) {
    boolean isSmsDeleted = false;
    try {
        mActivity.getContentResolver().delete(Uri.parse("content://sms/" + smsId), null, null);
        isSmsDeleted = true;

    } catch (Exception ex) {
        isSmsDeleted = false;
    }
    return isSmsDeleted;
}

Použití tohoto oprávnění v AndroidManifiest

<uses-permission android:name="android.permission.WRITE_SMS"/>
Odpovězeno 15/12/2012 v 19:54
zdroj uživatelem

hlasů
6

Je lepší použít _id a thread_id odstranit zprávu.

Thread_id je něco přiřazeno zpráv přicházejících ze stejného uživatele. Takže, pokud používáte pouze thread_id všechny zprávy od odesílatele budou mazány.

Pokud u použít kombinaci _id, thread_id, pak to smaže přesně tu zprávu, kterou hledáte odstranit.

Uri thread = Uri.parse( "content://sms");
int deleted = contentResolver.delete( thread, "thread_id=? and _id=?", new String[]{String.valueOf(thread_id), String.valueOf(id)} );
Odpovězeno 16/08/2011 v 13:56
zdroj uživatelem

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ů
2

Tuto funkci použijte k odstranění konkrétní posloupnost zpráv nebo upravit podle svých potřeb:

public void delete_thread(String thread) 
{ 
  Cursor c = getApplicationContext().getContentResolver().query(
  Uri.parse("content://sms/"),new String[] { 
  "_id", "thread_id", "address", "person", "date","body" }, null, null, null);

 try {
  while (c.moveToNext()) 
      {
    int id = c.getInt(0);
    String address = c.getString(2);
    if (address.equals(thread)) 
        {
     getApplicationContext().getContentResolver().delete(
     Uri.parse("content://sms/" + id), null, null);
    }

       }
} catch (Exception e) {

  }
}

Tuto funkci volat jednoduše níže:

delete_thread("54263726");//you can pass any number or thread id here

Nezapomeňte se přidat android mainfest povolení níže:

<uses-permission android:name="android.permission.WRITE_SMS"/>
Odpovězeno 15/03/2014 v 13:53
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ů
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ů
1

Nyní abortBroadcast();může být použita metoda k omezení příchozí zprávu jít do e-mailové schránky.

Odpovězeno 03/07/2012 v 13:19
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"/>
Odpovězeno 08/08/2011 v 13:11
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ů
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ů
0
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    SMSData sms = (SMSData) getListAdapter().getItem(position);
    Toast.makeText(getApplicationContext(), sms.getBody(),
            Toast.LENGTH_LONG).show();
    Toast.makeText(getApplicationContext(), sms.getNumber(),
            Toast.LENGTH_LONG).show();

    deleteSms(sms.getId());

}

public boolean deleteSms(String smsId) {
    boolean isSmsDeleted = false;
    try {
        MainActivity.this.getContentResolver().delete(
                Uri.parse("content://sms/" + smsId), null, null);
        isSmsDeleted = true;

    } catch (Exception ex) {
        isSmsDeleted = false;
    }
    return isSmsDeleted;
}
Odpovězeno 14/10/2013 v 10:29
zdroj uživatelem

hlasů
0

Zkuste to jsem 100% jistý, že to bude fungovat v pořádku: - // stačí vložit adresu konverzní zde Smazat celou konverzi podle adresy (ne zapomněl přidat číst, psát oprávnění v mainfest) Zde je kód:

String address="put address only";

Cursor c = getApplicationContext().getContentResolver().query(Uri.parse("content://sms/"), new String[] { "_id", "thread_id", "address", "person", "date", "body" }, null, null, null);

try {
    while (c.moveToNext()) {
        int id = c.getInt(0);
        String address = c.getString(2);
        if(address.equals(address)){
        getApplicationContext().getContentResolver().delete(Uri.parse("content://sms/" + id), null, null);}
    }
} catch(Exception e) {

}
Odpovězeno 03/09/2013 v 12:36
zdroj uživatelem

hlasů
0

Použijte jednu z této metody vyberte poslední přijaté SMS a odstranit ho zde v tomto případě jsem dostat top nejvíce sms a chystá vymazat pomocí závitu a id hodnotu sms,

try {
    Uri uri = Uri.parse("content://sms/inbox");
    Cursor c = v.getContext().getContentResolver().query(uri, null, null, null, null);
    int i = c.getCount();

    if (c.moveToFirst()) {
    }
} catch (CursorIndexOutOfBoundsException ee) {
    Toast.makeText(v.getContext(), "Error :" + ee.getMessage(), Toast.LENGTH_LONG).show();
}
Odpovězeno 10/12/2012 v 19:06
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ů
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

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more