Android'deki bir SMS gelen kutusuna ulaşmadan önce silebilir miyiz?


100

Gelen kutusundan bir SMS siliyorum ama bilmek istiyorum: Gelen kutusuna ulaşmadan önce onu nasıl silebilirim?


2
J2ee gerçekten burada eşleşen bir etiket mi?
seğirme

1
Java neden yanlış olsun, Android'de java'da programlama yapmıyorsunuz?
seğirme

3
Bu kötülük kokuyor. Bunu yapmamalısın.
MattC

43
Meşru kullanımlar var! Örneğin, telefonunuzun çalınması durumunda SMS yoluyla bir şey yapmak (GPS konumu göndermek, silmek veya başka bir şey) istiyorsanız; Telefonu çalan kişinin bu SMS mesajını görmesini istemezsiniz.
polyglot

21
Hadi millet! Bu kesinlikle "kötü" DEĞİLDİR. @polyglot doğru! Kullanıcının numarasını (Viber'in yaptığı gibi) onaylamak için bir uygulama yapıyorum ve buna ihtiyacım var. Her şey "kötü" olarak kullanılabilir. Kötü uygulamalar yüklemeyin, sadece bu.
Felipe

Yanıtlar:


187

Evet.

Bu soruya bazı olumsuz tepkilere rağmen, SMS dinlemenin meşru kullanımları vardır. Örneğin: telefon numarası doğrulamasının otomatikleştirilmesi, SMS yoluyla sağlanan hizmetler (ancak genellikle bu, veri SMS ile yapılmalıdır) veya hoş bir Android'de göstermek için özel olarak biçimlendirilmiş mesajları işleyerek kullanıcı deneyimini başka şekilde iyileştiren uygulamalar için -özel kullanıcı arayüzü.

Android 1.6'dan itibaren, gelen SMS mesajı yayınları ( android.provider.Telephony.SMS_RECEIVED) " sıralı yayın " olarak teslim edilir - bu, sisteme yayını önce hangi bileşenlerin alması gerektiğini söyleyebileceğiniz anlamına gelir.

android:prioritySMS dinlemenizde bir özellik tanımlarsanız <intent-filter>, yerel SMS uygulamasından önce bildirimi alırsınız.

Bu noktada yayını iptal ederek diğer uygulamalara yayılmasını engelleyebilirsiniz.


Güncelleme (Ekim 2013): Android 4.4 geldiğinde, SMS API'lerinde bir uygulamanın SMS teslimini etkileme yeteneğini etkileyebilecek değişiklikler yapacak.
Daha fazla bilgi için bu Android Developers blog gönderisine göz atın:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
Kutsal tanrı. Bu doğru! Her zaman tersi olacağını düşünmüşümdür! Kanıt için buraya bakın . Vay. Keşke size birden fazla olumlu oy verebilseydim;)
Hamy 01.10.2010

1
@kakopappa: Evet, cevapta da belirtildiği gibi Android 1.6+ ile çalışıyor.
Christopher Orr

1
@herom Öncelik kullanan uygulamalarım var 1000, bu yüzden mümkün. Aslında Handcent önceliği kullanıyor 2147483647.
Christopher Orr

2
Bu benim için çalıştı :) Uygulamam önce mesajı yakaladı ve bildirim yok, ancak sonra sms Mesajlar gelen kutusuna ulaşmıyor. Sanki hiç alınmamış gibi, sadece benim uygulamamda. Yayını iptal etmenin ancak gelen kutusundaki mesajları almanın bir yolu var mı?
pandabear

7
@ChristopherOrr güncellemesinde söylediği gibi yeni API seviyesi 19'u akılda tutmak önemlidir. Orada diyor "Beginning with Android 4.4—any attempt by your app to abort the SMS_RECEIVED_ACTION broadcast will be ignored so all apps interested have the chance to receive it.".
GoRoS

11

Adım-1: SMS almak için özel yayın alıcınızı oluşturun. Yayını iptal etme mantığını yazın, böylece mesaj gelen kutunuzda bulunmaz

public class SMSReceiver extends BroadcastReceiver
{
    public void onReceive(Context context, Intent intent)
    {
     if(conditionMatches){
     abortBroadcast();
     }
    }
}

Adım-2 Yayın alıcısını AndoridManifest'e kaydedin ve android: öncelik değerini çok sayıda koyun

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

Bu kadar

Yukarıdaki kod nasıl çalışır

SMS alma geniş yayın sıralı bir yayın olduğundan, yüksek önceliğe sahip alıcı önce alır, böylece ilk önce uygulamanız alır ve sizi aldıktan sonra yayını iptal edersiniz. Yani başka hiçbir uygulama bunu alamaz. Dolayısıyla sms gelen kutusunda olmayacak


Biz i bir kilit ekranı geliştirmek, böylece bir yayın alıcısı, kullanıcı presler mesajı gelen kutusu, olabilir ..
Vamsi Pavan Mahesh

9

Aşağıdaki ("android: öncelik" ve abortBroadcast ()) çözümü, varsayılan olarak Android Mesajlaşma uygulaması olduğu sürece çalışır (stok Android Mesajlaşma uygulamasını kastetmiştim). Kullanıcı "GoSMSPro" veya "HandcentSMS" yüklerse, bu uygulamalar hala gelen kutusunda mesajlar gösteriyor, bunun "android: öncelik" nedeniyle olduğuna inanıyorum. Telefona üçüncü taraf mesajlaşma uygulamaları yüklüyse, yukarıdaki sorunu çözmenin daha iyi bir yolunu görmüyorum.


2
İyi bir nokta. Ancak bu bir cevap değil, bir yorum olmalıdır. Hareket ettirmek mümkün mü? --- peki ya çok yüksek bir değer koyarsanız? Android olarak: öncelik = "9999"? Örneğin? Bunu denedin mi?
Felipe

4
@FelipeMicaroniLalli aslında SMS PRO GO, vb ... öncelikleri için 2147483647'yi kullanın
rf43

1
@DDoSAttack 2147483647 maksimum mu?
Felipe

3
En büyük işaretsiz tamsayıdır en.wikipedia.org/wiki/Integer_(computer_science) Android'in desteklediği maksimum 999'dur. Developer.android.com/reference/android/content/…
rf43

2
@NomanHamid Doğru. 999, maksimum önceliktir. Hangi numarayı seçerseniz seçin, Android yalnızca 999'a kadar garanti verir. Bundan daha büyük herhangi bir şey ve kararsız olabilir veya olmayabilir ve istenmeyen sonuçları olabilir. Şahsen, GO SMS PRO gibi uygulamaların üzerinden geçmek için 2147483647 kullanmak zorunda kaldım. Bazen kullanıcılar için çalıştı ve bazen yaramadı.
rf43

1
/**
 * Check priority
 * @param activity
 */
public static void receiverPriority(Activity activity){

    Intent smsRecvIntent = new Intent("android.provider.Telephony.SMS_RECEIVED");
    List<ResolveInfo> infos =  activity.getPackageManager().queryBroadcastReceivers(smsRecvIntent, 0);
    for (ResolveInfo info : infos) {
        System.out.println("Receiver: " + info.activityInfo.name + ", priority=" + info.priority);
    }
}

Önceliği kontrol edin ve diğer alıcılardan daha yüksek önceliği (bildiriminizde) ayarlayın.


0

Böyle bir senaryonuz varsa ve bu iletişim numarası "+ 44xxxxx" vb. İle ilgili mesajı silmek veya yok saymak istiyorsanız, SMS Yayını alıcısında bu kodu kullanın

 if(sender.equalsIgnoreCase("+44xxxxxx")
   this.abortBroadCast();

Ayrıca yüksek önceliğe ayarlamalısınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.