Bisakah kita menghapus SMS di Android sebelum masuk ke kotak masuk?

100

Saya menghapus SMS dari kotak masuk tetapi saya ingin tahu: Bagaimana cara menghapusnya sebelum masuk ke kotak masuk?

umakant
sumber
2
Apakah j2ee benar-benar tag yang cocok di sini?
jitter
1
Mengapa java salah, bukankah Anda memprogram java di Android?
jitter
3
Ini berbau kejahatan. Anda seharusnya tidak melakukan ini.
MattC
43
Ada kegunaan yang sah! Misalnya jika Anda ingin melakukan sesuatu (mengirim lokasi GPS, menghapus atau sesuatu) pada ponsel Anda melalui SMS jika ponsel dicuri; Anda tidak ingin siapapun yang mencuri telepon melihat pesan SMS itu.
poliglot
21
Ayo semuanya! Ini jelas TIDAK "jahat" sama sekali. @polyglot benar! Saya melakukan aplikasi untuk mengonfirmasi nomor pengguna (seperti yang dilakukan Viber) dan saya membutuhkannya. Semuanya bisa digunakan sebagai "kejahatan". Jangan memasang aplikasi jahat, hanya itu.
Felipe

Jawaban:

187

Iya.

Terlepas dari beberapa reaksi negatif terhadap pertanyaan ini, ada penggunaan yang sah untuk intersepsi SMS. Misalnya: mengotomatiskan verifikasi nomor telepon, layanan yang disediakan melalui SMS (meskipun umumnya hal ini harus dilakukan dengan SMS data), atau untuk aplikasi yang meningkatkan pengalaman pengguna dengan memproses pesan yang diformat khusus untuk ditampilkan di Android yang bagus UI -specific.

Mulai Android 1.6, siaran pesan SMS yang masuk ( android.provider.Telephony.SMS_RECEIVED) dikirim sebagai " siaran yang dipesan " - artinya Anda dapat memberi tahu sistem komponen mana yang harus menerima siaran terlebih dahulu.

Jika Anda menentukan android:priorityatribut pada mendengarkan SMS <intent-filter>, Anda akan menerima pemberitahuan sebelum aplikasi SMS asli.

Pada tahap ini, Anda dapat membatalkan siaran, mencegahnya disebarkan ke aplikasi lain.


Pembaruan (Oktober 2013): Saat Android 4.4 tiba, itu akan membuat perubahan pada API SMS yang dapat memengaruhi kemampuan aplikasi untuk memengaruhi pengiriman SMS.
Lihat entri blog Pengembang Android ini untuk info lebih lanjut:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html

Christopher Orr
sumber
13
Ya Tuhan. Ini benar! Saya selalu berasumsi bahwa yang terjadi adalah sebaliknya! Buktinya, lihat di sini . Wow. Seandainya saya bisa memberi Anda lebih dari satu suara positif;)
Hamy
1
@kakopappa: Ya, seperti yang disebutkan dalam jawaban, ini berfungsi dari Android 1.6+.
Christopher Orr
1
@herom Saya memiliki aplikasi yang menggunakan prioritas 1000, jadi itu mungkin. Faktanya, Handcent menggunakan prioritas 2147483647.
Christopher Orr
2
Ini berhasil bagi saya untuk :) Aplikasi saya menangkap pesan terlebih dahulu dan tidak ada pemberitahuan tetapi kemudian sms tidak masuk ke kotak masuk Pesan. Seperti tidak pernah diterima, hanya di aplikasi saya. Apakah ada cara untuk menggunakan batalkan siaran tetapi menerima pesan di kotak masuk?
pandabear
7
Penting untuk mengingat API level 19 baru seperti yang dikatakan @ChristopherOrr dalam pembaruannya. Di sana tertulis "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

Langkah-1: Buat penerima siaran khusus Anda untuk menerima sms. tulis logika untuk membatalkan luas sehingga pesan tidak akan tersedia di kotak masuk Anda

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

Langkah-2 Daftarkan penerima siaran di AndoridManifest dan masukkan android: nilai prioritas dengan angka yang besar

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

Itu dia

Bagaimana cara kerja kode di atas

Karena menerima siaran SMS adalah siaran yang dipesan, penerima dengan prioritas tinggi akan menerima terlebih dahulu sehingga aplikasi Anda menerima terlebih dahulu dan setelah menerima Anda membatalkan siaran. Jadi tidak ada aplikasi lain yang bisa menerimanya. Karenanya sms tidak akan ada di inbox

Sunil Kumar Sahoo
sumber
dapatkah kita memiliki penerima siaran, ketika pengguna menekan kotak masuk pesan, sehingga saya dapat mengembangkan layar kunci ..
Vamsi Pavan Mahesh
9

Solusi di bawah ini ("android: priority" dan abortBroadcast ()) berfungsi selama aplikasi Perpesanan Android sebagai default (maksud saya aplikasi perpesanan Android stok). Jika pengguna menginstal "GoSMSPro" atau "HandcentSMS", aplikasi ini masih menampilkan pesan di kotak masuk, saya yakin ini karena "android: priority". Saya tidak melihat cara yang lebih baik untuk memperbaiki masalah di atas, jika aplikasi perpesanan pihak ketiga diinstal di telepon.

Subba
sumber
2
Poin yang bagus. Tapi ini harus menjadi komentar, bukan jawaban. Apakah mungkin untuk dipindahkan? --- dan bagaimana jika Anda memberi nilai yang sangat tinggi? Sebagai android: priority = "9999"? sebagai contoh? Sudahkah kamu mencobanya?
Felipe
4
@FelipeMicaroniLalli sebenarnya GO SMS PRO, dll ... gunakan 2147483647 untuk prioritas mereka
rf43
1
@DDoSAttack 2147483647 sudah maksimal?
Felipe
3
Ini adalah bilangan bulat unsigned terbesar en.wikipedia.org/wiki/Integer_(computer_science) maks yang didukung Android adalah 999. developer.android.com/reference/android/content/…
rf43
2
@NomanHamid Itu benar. 999 adalah prioritas maksimal. Anda dapat menggunakan nomor apa pun yang Anda pilih, Android hanya akan menjamin hingga 999. Sesuatu yang lebih besar dari itu dan mungkin atau mungkin tidak tidak stabil dan memiliki konsekuensi yang tidak diinginkan. Secara pribadi, saya harus menggunakan 2147483647 untuk mencoba membuka aplikasi seperti GO SMS PRO. Terkadang itu berhasil untuk pengguna dan terkadang tidak.
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);
    }
}

Periksa prioritas dan tetapkan prioritas yang lebih tinggi (dalam manifes Anda) daripada penerima lainnya.

taran mahal
sumber
0

Jika Anda memiliki skenario seperti ini dan Anda ingin menghapus atau mengabaikan pesan yang terkait dengan nomor kontak ini "+ 44xxxxx" dll, maka gunakan kode ini di penerima Siaran SMS

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

Anda juga harus menetapkannya sebagai prioritas tinggi.

Pir Fahim Shah
sumber