एंड्रॉइड प्रोग्राम में इनबॉक्स से एक एसएमएस कैसे हटाएं?


98

एंड्रॉइड फोन पर एप्लिकेशन पर पंजीकृत एसएमएस संदेश भी डिवाइस के इनबॉक्स में भेजे जाते हैं। हालांकि अव्यवस्था को रोकने के लिए, उन संदेशों के संभावित अतिप्रवाह को कम करने के लिए इनबॉक्स से एप्लिकेशन विशिष्ट एसएमएस संदेशों को हटाने में सक्षम होना अच्छा होगा।

एंड्रॉइड इनबॉक्स से एसएमएस संदेशों को हटाने के लिए एक प्रोग्रामेटिक तरीके से एक निश्चित उत्तर प्राप्त करने पर अन्य Google समूहों पर सवाल दबाना प्रतीत नहीं होता है।

तो परिदृश्य:

  • Android ऐप स्टार्टअप।
  • रजिस्टर एसएमएस संदेश प्रकार एक्स, वाई और जेड
  • संदेश P, Q, X, Y, Z समय के साथ-साथ सभी स्ट्रीम में इनबॉक्स में जमा हो जाते हैं
  • Android एप्लिकेशन X, Y, Z की रसीद का पता लगाता है (संभवतः कार्यक्रम के बाधित होने वाले कार्यक्रम के हिस्से के रूप में)
  • प्रक्रिया एक्स, वाई, जेड
  • Desirement !!! Android इनबॉक्स से X, Y, Z हटा दिए जाते हैं

हो गया है? क्या यह किया जा सकता है?


4
मैंने एंड्रॉइड की फोन क्षमताओं के साथ बहुत अप्रिय अनुभव होने के लिए कुछ भी उपयोगी पाया है।
बॉबीशाफ्टो

1
अच्छा सवाल है दोस्त। मैं कुछ इसी तरह की तलाश कर रहा था: डी चीयर्स
हर्षा एमवी

3
सबसे पहले एसएमएस को इनबॉक्स में पहुंचने से रोकने के लिए सबसे अच्छा होगा: stackoverflow.com/questions/1741628/…
क्रिस्टोफर ओर

जवाबों:


87

"एंड्रॉयड 1.6 के रूप में, आने वाले एसएमएस संदेश प्रसारण ( android.provider.Telephony.SMS_RECEIVEDआदेश दिया प्रसारण) एक के रूप में दिया जाता है"। "- जिसका अर्थ है कि आप प्रणाली है जो घटकों पहला प्रसारण प्राप्त करना चाहिए बता सकते हैं"

इसका मतलब है कि आप आने वाले संदेश को रोक सकते हैं और इसके प्रसारण को आगे भी रोक सकते हैं।

अपनी AndroidManifest.xmlफ़ाइल में, प्राथमिकता को उच्चतम पर सेट करना सुनिश्चित करें:

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

अपने में BroadcastReceiver, में onReceive()विधि, अपने संदेश के साथ कुछ भी करने से पहले, बस फोनabortBroadcast();

संपादित करें: किटकैट के रूप में, यह अब जाहिरा तौर पर काम नहीं करता है।

EDIT2: किटकैट पर इसे कैसे करें, इस बारे में अधिक जानकारी:

4.4.4 पर Android से एसएमएस हटाएं (हटाए जाने के बाद प्रभावित पंक्तियों = 0 (शून्य),)



क्या आप कृपया यहां stackoverflow.com/questions/25988574/… देख सकते हैं ?
बजे गंगाधर निंबोली

इसके लिए सबसे अच्छा जवाब = D
माइक ब्रायन ओलिवरे

27

दूसरों के सुझावों का उपयोग करते हुए, मुझे लगता है कि मुझे यह काम करने के लिए मिला:

(एसडीके v1 आर 2 का उपयोग करके)

यह सही नहीं है, क्योंकि मुझे पूरी बातचीत को हटाने की आवश्यकता है, लेकिन हमारे उद्देश्यों के लिए, यह एक पर्याप्त समझौता है क्योंकि हम कम से कम सभी संदेशों को देखा और सत्यापित किया जाएगा। हमारे प्रवाह को संभवतः उस संदेश के लिए सुनना होगा, जिसे हम चाहते हैं उस संदेश के लिए कैप्चर करें, हाल ही में इनबाउंड संदेश के थ्रेड_आईडी पाने के लिए एक क्वेरी करें और हटाएं () कॉल करें।

हमारी गतिविधि में:

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);

नोट: मैं सामग्री को हटाने में सक्षम नहीं था: // sms / inbox / या सामग्री: // sms / all /

ऐसा लगता है कि थ्रेड पूर्वता लेता है, जो समझ में आता है, लेकिन त्रुटि संदेश ने मुझे एंगेरियर बनने के लिए प्रेरित किया। Sms / inbox / या sms / all / पर डिलीट का प्रयास करने पर, आपको संभवतः मिल जाएगा:

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)

अतिरिक्त संदर्भ के लिए भी, अपने इरादे रिसीवर के लिए इसे अपनी उपस्थिति में रखना सुनिश्चित करें:

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

ध्यान दें कि रिसीवर टैग इस तरह नहीं दिखता है:

<receiver android:name=".intent.MySmsReceiver" 
    android:permission="android.permission.RECEIVE_SMS">

जब मेरे पास वे सेटिंग्स थीं, तो एंड्रॉइड ने मुझे कुछ पागल अनुमति अपवाद दिए जो android.phone को मेरे इरादे से प्राप्त एसएमएस को बंद करने की अनुमति नहीं देते थे। इसलिए, अपने इरादे में उस RECEIVE_SMS अनुमति विशेषता को न डालें! उम्मीद है कि मेरे अलावा कोई समझदार मुझे बता सकता है कि ऐसा क्यों था।


क्या आप कृपया यहां stackoverflow.com/questions/25988574/… देख सकते हैं ?
गंगाधर निंबोली

24

तो, मैं एक नाटक था, और यह है एक प्राप्त एसएमएस हटाना संभव। दुर्भाग्य से यह सभी सादे नौकायन नहीं है :(

मेरे पास एक रिसीवर है जो आने वाले एसएमएस संदेशों को उठाता है। अब जिस तरह से एंड्रॉइड एसएमएस आने वाले राउटिंग काम करता है वह यह है कि संदेशों को डिकोड करने के लिए जिम्मेदार कोड का टुकड़ा एक ब्रॉडकास्ट भेजता है (यह sendBroadcast()विधि का उपयोग करता है - जो दुर्भाग्य से वह संस्करण नहीं है जो आपको बस कॉल करता है abortBroadcast()) जब भी कोई संदेश आता है।

सिस्टम रिसीवर के रिसीवर से पहले मेरे रिसीवर को कॉल किया जा सकता है या नहीं किया जा सकता है, और किसी भी मामले में प्राप्त प्रसारण में कोई संपत्ति नहीं है जो _idएसएमएस तालिका में कॉलम को प्रतिबिंबित कर सकती है ।

हालांकि, एक को रोका नहीं जा रहा है कि मैं आसानी से खुद को (एक हैंडलर के माध्यम से) SmsMessage के साथ संलग्न वस्तु के रूप में एक विलंबित संदेश पोस्ट करता हूं। (मुझे लगता है कि आप अपने आप को एक चलाने योग्य भी पोस्ट कर सकते हैं ...)

handler.sendMessageDelayed(handler.obtainMessage(MSG_DELETE_SMS, msg), 2500);

यह सुनिश्चित करने में देरी हो रही है कि जब तक संदेश पहुंचता है तब तक सभी ब्रॉडकास्ट रिसीवर अपने सामान को समाप्त कर चुके होंगे और एसएमएस तालिका में संदेश सुरक्षित रूप से सुनिश्चित किया जाएगा।

जब संदेश (या Runnable) यहां प्राप्त होता है तो मैं क्या करता हूं:

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())});

मैं मूल पते और टाइमस्टैम्प फ़ील्ड का उपयोग करता हूं, केवल उस संदेश को हटाने की बहुत अधिक संभावना सुनिश्चित करने के लिए जिसमें मुझे दिलचस्पी है। यदि मैं और भी अधिक पागल होना चाहता था तो मैं msg.getMessageBody()क्वेरी के हिस्से के रूप में सामग्री शामिल कर सकता हूं ।

हां, संदेश हटा दिया गया है (हुर्रे!)। दुर्भाग्य से अधिसूचना बार अपडेट नहीं किया गया है :(

जब आप सूचना क्षेत्र खोलते हैं, तो आप संदेश को आपके लिए वहीं बैठे देखेंगे ... लेकिन जब आप इसे खोलने के लिए इसे टैप करते हैं - यह चला गया है!

मेरे लिए, यह काफी अच्छा नहीं है - मैं चाहता हूं कि संदेश के सभी ट्रेस गायब हो जाएं - मैं नहीं चाहता कि उपयोगकर्ता सोचें कि कोई TXT है जब वहाँ नहीं है (जो केवल बग रिपोर्ट का कारण होगा)।

आंतरिक रूप से ओएस में फोन कॉल होता है MessagingNotification.updateNewMessageIndicator(Context), लेकिन मुझे वह वर्ग एपीआई से छिपाया गया है, और मैं संकेतक को सटीक बनाने के लिए उस कोड के सभी को दोहराना नहीं चाहता था।


डौग, यह बहुत अच्छा है। एक प्रश्न के रूप में, क्या आप जानते हैं कि क्या हैंडलर को पोस्ट करना आवश्यक है? मुझे आश्चर्य है कि क्या एसएमएस और प्रसारण रिसीवर से पहले सिस्टम एसएमएस डेटाबेस में एसएमएस डाला जाता है? मुझे संभवतः ओएस में देखने के लिए देखना होगा कि प्रविष्टि कहाँ होती है, लेकिन मैं यह मानूंगा कि प्रसारण डेटाबेस के सूचित होने से पहले एसएमएस को कुछ डेटाबेस में सम्मिलित करना होता है। इस बारे में कोई अंतर्दृष्टि है या क्या आपने पहले से ही इसके लिए जांच की है?
हमी

क्या आप कृपया यहां stackoverflow.com/questions/25988574/… देख सकते हैं ?
बजे गंगाधर निंबोली

11
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;
}

AndroidManifiest में इस अनुमति का उपयोग करें

<uses-permission android:name="android.permission.WRITE_SMS"/>

1
हम sms id कैसे प्राप्त करते है?
देव ०१


@ Dev01if आप एक विशेष sms को हटाना चाहते हैं जो आपके पास सही होना चाहिए? और अगर आपको आईडी या smsbody के साथ आईडी की क्वेरी नहीं करनी है
डॉ। एनडीआरओ

6

किसी संदेश को हटाने के लिए _id और thread_id का उपयोग करना बेहतर है।

Thread_id कुछ उसी उपयोगकर्ता से आने वाले संदेशों को असाइन किया गया है। इसलिए, यदि आप केवल थ्रेड_आईडी का उपयोग करते हैं, तो प्रेषक के सभी संदेश हटा दिए जाएंगे।

यदि आप _id, thread_id के संयोजन का उपयोग करते हैं, तो यह आपके द्वारा हटाए जा रहे सटीक संदेश को हटा देगा।

Uri thread = Uri.parse( "content://sms");
int deleted = contentResolver.delete( thread, "thread_id=? and _id=?", new String[]{String.valueOf(thread_id), String.valueOf(id)} );

क्या आप कृपया यहां stackoverflow.com/questions/25988574/… देख सकते हैं ?
गंगाधर निंबोली

5

आपको संदेश का URI ढूंढना होगा । लेकिन एक बार जब आप सोचते हैं कि आपको android.content.ContentResolver.delete (...) यह करने में सक्षम होना चाहिए।

यहाँ कुछ और जानकारी है


2

मुझे लगता है कि यह पूरी तरह से समय के लिए नहीं किया जा सकता है। 2 बुनियादी समस्याएं हैं:

  1. जब आप इसे हटाने का प्रयास कर रहे हैं तो आप यह कैसे सुनिश्चित कर सकते हैं कि sms पहले से ही इनबॉक्स में है?
    ध्यान दें कि SMS_RECEIVED एक आदेशित प्रसारण नहीं है।
    इसलिए डाइंगंग का समाधान पूरी तरह से किसी के भाग्य की कोशिश कर रहा है; डौग के जवाब में देरी भी कोई गारंटी नहीं है।

  2. SmsProvider थ्रेड सुरक्षित नहीं है। (देखें http://code.google.com/p/android/issues/detail?id=2916#c0 )
    यह तथ्य कि एक से अधिक क्लाइंट डिलीट करने और उसमें डालने का अनुरोध कर रहे हैं। उसी समय डेटा भ्रष्टाचार या तत्काल रनटाइम अपवाद का कारण होगा।


2

मैं इसे डाइंग के समाधान का उपयोग करने के लिए काम नहीं कर सका, इसने मुझे एक अपवाद दिया जब संदेश आईडी या थ्रेड आईडी मिल रहा था।

अंत में, मैंने थ्रेड आईडी प्राप्त करने के लिए निम्नलिखित विधि का उपयोग किया है:

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;
}

तब मैं इसे हटा सकता था। हालांकि, जैसा कि डग ने कहा, अधिसूचना अभी भी है, यहां तक ​​कि अधिसूचना पैनल को खोलने पर भी संदेश प्रदर्शित होता है। केवल संदेश को टैप करते समय मैं वास्तव में देख सकता था कि यह खाली है।

इसलिए मुझे लगता है कि यह काम करने का एकमात्र तरीका वास्तव में किसी तरह एसएमएस को इंटरसेप्ट करने से पहले सिस्टम में डिलीवर कर देना होगा, इससे पहले कि यह इनबॉक्स में पहुंच जाए। हालांकि, मुझे बहुत संदेह है कि यह उल्लेखनीय है। कृपया मुझे सुधारें अगर मैं गलत हूं।


ठीक है, आप इनबॉक्स से पहले संदेशों को रोकने के बारे में गलत हैं : आप एक प्रसारण android.provider.Telephony.SMS_RECEIVED प्राप्त कर सकते हैं, आपको केवल एक अनुमापन android.permission.RECEIVE_SMS की आवश्यकता है। आप आसानी से संदेश को इनबॉक्स में पहुंचने से रोक सकते हैं, क्योंकि यह एक आदेशित प्रसारण है। PS को 2 साल बाद सही होने के लिए मज़ेदार होना चाहिए :)
lapis

2

विशिष्ट संदेश थ्रेड को हटाने या अपनी आवश्यकताओं के अनुसार संशोधित करने के लिए इस फ़ंक्शन का उपयोग करें:

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) {

  }
}

इस फ़ंक्शन को बस नीचे कॉल करें:

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

नीचे Android mainfest अनुमति जोड़ना न भूलें:

<uses-permission android:name="android.permission.WRITE_SMS"/>

1

बस डिफ़ॉल्ट एसएमएस ऐप के लिए सूचनाएं बंद करें। सभी पाठ संदेशों के लिए अपनी स्वयं की सूचनाएं संसाधित करें!


1

बस इस लिंक पर एक नज़र डालें, यह आपको तर्क का एक संक्षिप्त विचार देगा:

https://gist.github.com/5178e798d9a00cac4ddb
बस कुछ देरी के साथ deleteSMS () फ़ंक्शन को कॉल करें, क्योंकि समय के बीच मामूली अंतर है अधिसूचना और जब यह वास्तव में सहेजा जाता है ...., विवरण के लिए इस लिंक पर भी एक नज़र डालें ..........

http://htmlcoderhelper.com/how-to-delete-sms-from- inbox-in-android-programmatically /

धन्यवाद ..........


1

आप बस निम्नलिखित कोड का प्रयास करें। यह सभी एसएमएस को हटा देगा जो सभी फोन में हैं (प्राप्त या भेजा गया)

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);
}

1

इसके अलावा मैनिफ़ेस्ट फ़ाइल को अपडेट करें जैसे कि आपको sms को हटाने के लिए लिखने की अनुमति चाहिए।

<uses-permission android:name="android.permission.WRITE_SMS"/>

1

अब abortBroadcast();इनबॉक्स में जाने के लिए आने वाले संदेश को प्रतिबंधित करने के लिए विधि का उपयोग किया जा सकता है।


0

एक एसएमएस हटाने के लिए नमूना, बातचीत नहीं:

getContentResolver().delete(Uri.parse("content://sms/conversations/" + threadID), "_id = ?", new String[]{id});

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;
}

0

इसे आज़माएं, मुझे यकीन है कि यह 100% ठीक होगा: - // बस यहाँ रूपांतरण पता पते के लिए पूरे रूपांतरण को हटाने के लिए डाल दें (रीड जोड़ना न भूलें, mainfest में अनुमति लिखना) यहाँ कोड है:

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) {

}

0

अंतिम प्राप्त एसएमएस का चयन करने और उसे हटाने के लिए इस विधि में से किसी एक का उपयोग करें, इस मामले में मैं शीर्ष सबसे अधिक एसएमएस प्राप्त कर रहा हूं और एसएमएस के थ्रेड और आईडी मूल्य का उपयोग करके हटाने जा रहा हूं,

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();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.