เราสามารถลบ SMS ใน Android ก่อนถึงกล่องจดหมายได้หรือไม่?


100

ฉันกำลังลบ SMS ออกจากกล่องจดหมาย แต่ฉันต้องการทราบ: ฉันจะลบมันก่อนที่จะถึงกล่องจดหมายได้อย่างไร?


2
j2ee เป็นแท็กที่ตรงกันจริงๆหรือเปล่า
กระวนกระวายใจ

1
เหตุใด java จึงไม่ถูกต้องคุณไม่ตั้งโปรแกรมใน java บน Android
กระวนกระวายใจ

3
สิ่งนี้ทำให้เกิดความชั่วร้าย คุณไม่ควรทำเช่นนี้
MattC

43
มีการใช้งานที่ถูกต้องตามกฎหมาย! ตัวอย่างเช่นหากคุณต้องการทำบางสิ่งบางอย่าง (ส่งตำแหน่ง GPS ล้างข้อมูลหรือบางอย่าง) บนโทรศัพท์ของคุณผ่าน SMS ในกรณีที่ถูกขโมย คุณไม่ต้องการให้ใครก็ตามที่ขโมยโทรศัพท์เห็นข้อความ SMS นั้น
พูดได้หลายภาษา

21
มากับคน! นี่ไม่ใช่ "ความชั่วร้าย" อย่างแน่นอน @polyglot ถูก! ฉันกำลังทำแอปพลิเคชันเพื่อยืนยันหมายเลขของผู้ใช้ (เหมือนที่ Viber ทำ) และฉันต้องการมัน ทุกอย่างสามารถใช้เป็น "ตัวร้าย" ได้ อย่าติดตั้งแอปที่ชั่วร้ายเพียงแค่นั้น
Felipe

คำตอบ:


187

ใช่.

แม้จะมีปฏิกิริยาเชิงลบต่อคำถามนี้ แต่ก็มีการใช้การสกัดกั้น SMS อย่างถูกต้อง ตัวอย่างเช่น: การยืนยันหมายเลขโทรศัพท์โดยอัตโนมัติบริการที่จัดเตรียมผ่าน SMS (แม้ว่าโดยทั่วไปแล้วควรทำด้วย SMS ข้อมูล) หรือสำหรับแอปพลิเคชันที่ปรับปรุงประสบการณ์ของผู้ใช้โดยการประมวลผลข้อความที่จัดรูปแบบพิเศษเพื่อแสดงใน Android ที่ดี UI เฉพาะ

สำหรับ Android 1.6 การส่งข้อความ SMS ขาเข้า ( android.provider.Telephony.SMS_RECEIVED) จะถูกส่งเป็น "การออกอากาศตามสั่ง " ซึ่งหมายความว่าคุณสามารถบอกระบบได้ว่าส่วนประกอบใดควรได้รับการออกอากาศก่อน

หากคุณกำหนดandroid:priorityแอตทริบิวต์ในการฟัง SMS ของ<intent-filter>คุณคุณจะได้รับการแจ้งเตือนก่อนแอปพลิเคชัน SMS ดั้งเดิม

ณ จุดนี้คุณสามารถยกเลิกการออกอากาศเพื่อป้องกันไม่ให้แพร่กระจายไปยังแอปอื่น ๆ


อัปเดต (ตุลาคม 2013):เมื่อมาถึง Android 4.4 จะมีการเปลี่ยนแปลง SMS API ซึ่งอาจส่งผลต่อความสามารถของแอปในการส่งผลกระทบต่อการส่ง SMS
ดูบล็อกโพสต์ของนักพัฒนา Android สำหรับข้อมูลเพิ่มเติม:
http://android-developers.blogspot.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html


13
พระเจ้าศักดิ์สิทธิ์ นี่คือเรื่องจริง! ฉันคิดว่ามันน่าจะเป็นอีกทางหนึ่งเสมอ! เพื่อพิสูจน์ให้ดูที่นี่ ว้าว. หวังว่าฉันจะโหวตให้คุณมากกว่าหนึ่งโหวต)
Hamy

1
@kakopappa: ใช่ตามที่กล่าวไว้ในคำตอบมันใช้งานได้กับ Android 1.6+
Christopher Orr

1
@herom ฉันมีแอพที่ใช้ลำดับความสำคัญ1000ดังนั้นจึงเป็นไปได้ ในความเป็นจริง Handcent 2147483647ใช้จัดลำดับความสำคัญ
Christopher Orr

2
สิ่งนี้ใช้ได้ผลสำหรับฉัน :) แอปของฉันจับข้อความก่อนและไม่มีการแจ้งเตือน แต่จากนั้น sms ไม่เข้าสู่กล่องจดหมายข้อความ เหมือนไม่เคยได้รับมีเพียงในแอปของฉัน มีวิธีใช้ยกเลิกการออกอากาศ แต่รับข้อความในกล่องจดหมายหรือไม่?
pandabear

7
สิ่งสำคัญคือต้องจำ API ใหม่ระดับ 19 ตามที่ @ChristopherOrr กล่าวในการอัปเดตของเขา "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

ขั้นตอนที่ 1:สร้างเครื่องรับสัญญาณออกอากาศแบบกำหนดเองเพื่อรับ SMS เขียนตรรกะเพื่อยกเลิกแบบกว้างเพื่อที่ข้อความจะไม่พร้อมใช้งานในกล่องจดหมายของคุณ

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

ขั้นตอนที่ 2ลงทะเบียนเครื่องรับสัญญาณออกอากาศใน AndoridManifest และใส่ android: ค่าลำดับความสำคัญเป็นจำนวนมาก

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

แค่นั้นแหละ

โค้ดข้างต้นทำงานอย่างไร

เนื่องจาก SMS ที่ได้รับการส่งแบบกว้างเป็นการออกอากาศตามคำสั่งเครื่องรับที่มีลำดับความสำคัญสูงจะได้รับก่อนดังนั้นแอปพลิเคชันของคุณจะได้รับก่อนและหลังจากได้รับคุณจึงยกเลิกการออกอากาศ ดังนั้นจึงไม่มีแอปพลิเคชันอื่นใดสามารถรับได้ ดังนั้น SMS จะไม่มีอยู่ในกล่องจดหมาย


เราจะมีเครื่องรับสัญญาณออกอากาศได้ไหมเมื่อผู้ใช้กดกล่องข้อความเพื่อที่ฉันจะได้พัฒนาหน้าจอล็อก ..
Vamsi Pavan Mahesh

9

โซลูชันด้านล่าง ("android: priority" และ abortBroadcast ()) ใช้งานได้ตราบเท่าที่แอปพลิเคชันการส่งข้อความ Android เป็นค่าเริ่มต้น (ฉันหมายถึงแอปพลิเคชันการส่งข้อความ Android) หากผู้ใช้ติดตั้ง "GoSMSPro" หรือ "HandcentSMS" แอปพลิเคชันเหล่านี้ยังคงแสดงข้อความในกล่องจดหมายฉันเชื่อว่านี่เป็นเพราะ "android: priority" ฉันไม่เห็นวิธีที่ดีกว่าในการแก้ไขปัญหาข้างต้นหากติดตั้งแอปพลิเคชันการส่งข้อความของบุคคลที่สามในโทรศัพท์


2
จุดดี. แต่นี่ควรเป็นความคิดเห็นไม่ใช่คำตอบ เป็นไปได้ไหมที่จะย้าย --- แล้วถ้าใส่มูลค่าสูงมากล่ะ? เป็น android: priority = "9999"? ตัวอย่างเช่น? คุณลองแล้วหรือยัง?
Felipe

4
@FelipeMicaroniLalli GO SMS PRO จริง ๆ ฯลฯ ... ใช้ 2147483647 เพื่อจัดลำดับความสำคัญ
rf43

1
@DDoSAttack 2147483647 สูงสุด?
Felipe

3
เป็นจำนวนเต็มที่ไม่ได้ลงชื่อที่ใหญ่ที่สุดen.wikipedia.org/wiki/Integer_(computer_science)ค่าสูงสุดที่ Android รองรับคือ 999 developer.android.com/reference/android/content/…
rf43

2
@NomanHamid ที่ถูกต้อง 999 เป็นลำดับความสำคัญสูงสุด คุณสามารถใช้หมายเลขใดก็ได้ที่คุณเลือก Android จะรับประกันได้ถึง 999 เท่านั้น อะไรก็ตามที่ใหญ่กว่านั้นและมันอาจจะไม่เสถียรหรือไม่ก็ได้และมีผลที่ตามมาโดยไม่ได้ตั้งใจ โดยส่วนตัวแล้วฉันต้องใช้ 2147483647 เพื่อลองข้ามแอปอย่าง GO SMS PRO บางครั้งก็ใช้งานได้สำหรับผู้ใช้และบางครั้งก็ไม่ได้ผล
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);
    }
}

ตรวจสอบลำดับความสำคัญและกำหนดลำดับความสำคัญสูงกว่า (ในรายการของคุณ) มากกว่าเครื่องรับอื่น ๆ


0

หากคุณมีสถานการณ์เช่นนี้และต้องการลบหรือเพิกเฉยต่อข้อความที่เกี่ยวข้องกับหมายเลขติดต่อ "+ 44xxxxx" เป็นต้นให้ใช้รหัสนี้ในเครื่องรับ SMS Broadcast

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

คุณต้องตั้งค่าลำดับความสำคัญสูงด้วย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.