Gelen kutusundan bir SMS siliyorum ama bilmek istiyorum: Gelen kutusuna ulaşmadan önce onu nasıl silebilirim?
Gelen kutusundan bir SMS siliyorum ama bilmek istiyorum: Gelen kutusuna ulaşmadan önce onu nasıl silebilirim?
Yanıtlar:
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:priority
SMS 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
1000
, bu yüzden mümkün. Aslında Handcent önceliği kullanıyor 2147483647
.
"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."
.
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
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.
/**
* 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.
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.