मैं एंड्रॉइड में प्रोग्राम से डिवाइस से एसएमएस संदेश कैसे पढ़ सकता हूं?


249

मैं डिवाइस से एसएमएस संदेश प्राप्त करना और उन्हें प्रदर्शित करना चाहता हूं?


@ दाविद फ्रीटास ने लिंक +1
शहजाद इमाम

3
@DavidFreitas इस लिंक पर काम नहीं कर रहा है, क्या आप कृपया thelatest लिंक साझा कर सकते हैं?
खोबेब

3
@ कबूबी, हमेशा की तरह इंटरनेट पर चीजें क्षणभंगुर हैं। मैं archive.org पर एक कॉपी मिल गया stackoverflow.com/a/19966227/40961 , उनके लिए भलाई धन्यवाद (मैं हाल ही में दान किया है उन्हें चालू रखने के लिए)। लेकिन हमें इस प्रश्न पर एक उत्तर में वाक्यविन्यास को मार्कडॉट की सामग्री web.archive.org/web/20121022021217/http://mobdev.olin.edu/… से बदलने पर विचार करना चाहिए । शायद एक घंटे का काम।
डेविड डी सी ई फ्रिटास

जवाबों:


157

एसएमएस पढ़ने के लिए कंटेंट रिज़ॉल्वर ( "सामग्री: // sms / इनबॉक्स" ) का उपयोग करें जो इनबॉक्स में हैं।

// public static final String INBOX = "content://sms/inbox";
// public static final String SENT = "content://sms/sent";
// public static final String DRAFT = "content://sms/draft";
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, null, null, null);

if (cursor.moveToFirst()) { // must check the result to prevent exception
    do {
       String msgData = "";
       for(int idx=0;idx<cursor.getColumnCount();idx++)
       {
           msgData += " " + cursor.getColumnName(idx) + ":" + cursor.getString(idx);
       }
       // use msgData
    } while (cursor.moveToNext());
} else {
   // empty box, no SMS
}

कृपया READ_SMS अनुमति जोड़ें ।

मुझे उम्मीद है यह मदद करेगा :)


7
धन्यवाद! आपने "getColumnName" को छोड़ दिया, इसके अलावा यह एक आकर्षण की तरह काम करता है। ओह, और अगर कोई इसका उपयोग करेगा, तो अनुमति को जोड़ना न भूलें android.permission.READ_SMS।
क्वर्टी

1
धन्यवाद। मैंने इसे संशोधित किया :)
सूर्यास्त टीआर

5
क्या यह उस अनिर्दिष्ट एप्टी का भी उपयोग करता है जो @CommonsWare ने अपनी टिप्पणी में निर्दिष्ट उत्तर के लिए दिया है?
कृष्णभद्र

1
ध्यान! याद मत करो moveToFirstजैसा मैंने किया।
एलेक्जेंड्रा प्रियक

4
@ कृष्णभद्र हां। यह अनिर्दिष्ट "सामग्री: // एसएमएस / इनबॉक्स" सामग्री प्रदाता का उपयोग करता है।
pm_labs

79
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        final String myPackageName = getPackageName();
        if (!Telephony.Sms.getDefaultSmsPackage(this).equals(myPackageName)) {

            Intent intent = new Intent(Telephony.Sms.Intents.ACTION_CHANGE_DEFAULT);
            intent.putExtra(Telephony.Sms.Intents.EXTRA_PACKAGE_NAME, myPackageName);
            startActivityForResult(intent, 1);
        }else {
            List<Sms> lst = getAllSms();
        }
    }else {
        List<Sms> lst = getAllSms();
    }

ऐप को डिफॉल्ट एसएमएस ऐप के रूप में सेट करें

    @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
    if (resultCode == RESULT_OK) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            final String myPackageName = getPackageName();
            if (Telephony.Sms.getDefaultSmsPackage(mActivity).equals(myPackageName)) {

                List<Sms> lst = getAllSms();
            }
        }
    }
}
}

एसएमएस प्राप्त करने का कार्य

public List<Sms> getAllSms() {
    List<Sms> lstSms = new ArrayList<Sms>();
    Sms objSms = new Sms();
    Uri message = Uri.parse("content://sms/");
    ContentResolver cr = mActivity.getContentResolver();

    Cursor c = cr.query(message, null, null, null, null);
    mActivity.startManagingCursor(c);
    int totalSMS = c.getCount();

    if (c.moveToFirst()) {
        for (int i = 0; i < totalSMS; i++) {

            objSms = new Sms();
            objSms.setId(c.getString(c.getColumnIndexOrThrow("_id")));
            objSms.setAddress(c.getString(c
                    .getColumnIndexOrThrow("address")));
            objSms.setMsg(c.getString(c.getColumnIndexOrThrow("body")));
            objSms.setReadState(c.getString(c.getColumnIndex("read")));
            objSms.setTime(c.getString(c.getColumnIndexOrThrow("date")));
            if (c.getString(c.getColumnIndexOrThrow("type")).contains("1")) {
                objSms.setFolderName("inbox");
            } else {
                objSms.setFolderName("sent");
            }

            lstSms.add(objSms);
            c.moveToNext();
        }
    }
    // else {
    // throw new RuntimeException("You have no SMS");
    // }
    c.close();

    return lstSms;
}

एसएमएस वर्ग नीचे है:

public class Sms{
private String _id;
private String _address;
private String _msg;
private String _readState; //"0" for have not read sms and "1" for have read sms
private String _time;
private String _folderName;

public String getId(){
return _id;
}
public String getAddress(){
return _address;
}
public String getMsg(){
return _msg;
}
public String getReadState(){
return _readState;
}
public String getTime(){
return _time;
}
public String getFolderName(){
return _folderName;
}


public void setId(String id){
_id = id;
}
public void setAddress(String address){
_address = address;
}
public void setMsg(String msg){
_msg = msg;
}
public void setReadState(String readState){
_readState = readState;
}
public void setTime(String time){
_time = time;
}
public void setFolderName(String folderName){
_folderName = folderName;
}

}

अपने AndroidManifest.xml में अनुमति को परिभाषित करने के लिए मत भूलना

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

2
यह एक अच्छा कोड है। बस एक चीज, समय मिलीसेकंड में प्राप्त होता है। मुझे लगता है कि इसे एक मानव पठनीय प्रारूप बनाना बेहतर होगा, जैसेString receiveDayTime = Functions.dateFromMilisec(Long.valueOf(c.getColumnIndexOrThrow("date")), "hh:mm a MMM dd, yyyy");
बिबासवन बंद्योपाध्याय

1
गेट्टर और सेटर के साथ सब कुछ बनाने का उद्देश्य क्या है, मुझे वास्तव में समझ में नहीं आता है कि सिर्फ एक एशोक ऐरे या क्लास का उपयोग क्यों नहीं किया जाता है जिनके तत्व सीधे
पहुंचते

1
@TomasNavara: गेट्टर और सेटर के उपयोग को समझने के लिए इस कोड की जाँच करें। pastebin.com/Nh8YXtyJ
Bugs Happen

@BibaswannBandyopadhyay यदि आप एंड्रॉइड लाइब्रेरी और जावा लाइब्रेरी के अलावा कुछ भी उपयोग नहीं करना चाहते हैं। new SimpleDateFormat("hh:mm", Locale.US).format(new Date(Long.parseLong(_time)));यह आपको 210 समय देगा।
क्रिस - जूनियर

mActivityपरिभाषित नहीं है। यह क्या है?
dthree

61

यह एक तुच्छ प्रक्रिया है। आप स्रोत कोड SMSPopup में एक अच्छा उदाहरण देख सकते हैं

निम्नलिखित विधियों की जाँच करें:

SmsMmsMessage getSmsDetails(Context context, long ignoreThreadId, boolean unreadOnly)
long findMessageId(Context context, long threadId, long _timestamp, int messageType
void setMessageRead(Context context, long messageId, int messageType)
void deleteMessage(Context context, long messageId, long threadId, int messageType)

यह पढ़ने की विधि है:

SmsMmsMessage getSmsDetails(Context context,
                            long ignoreThreadId, boolean unreadOnly)
{
   String SMS_READ_COLUMN = "read";
   String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;
   String SORT_ORDER = "date DESC";
   int count = 0;
   // Log.v(WHERE_CONDITION);
   if (ignoreThreadId > 0) {
      // Log.v("Ignoring sms threadId = " + ignoreThreadId);
      WHERE_CONDITION += " AND thread_id != " + ignoreThreadId;
   }
   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();
            // String[] columns = cursor.getColumnNames();
            // for (int i=0; i<columns.length; i++) {
            // Log.v("columns " + i + ": " + columns[i] + ": " + cursor.getString(i));
            // }                                         
            long messageId = cursor.getLong(0);
            long threadId = cursor.getLong(1);
            String address = cursor.getString(2);
            long contactId = cursor.getLong(3);
            String contactId_string = String.valueOf(contactId);
            long timestamp = cursor.getLong(4);

            String body = cursor.getString(5);                             
            if (!unreadOnly) {
                count = 0;
            }

            SmsMmsMessage smsMessage = new SmsMmsMessage(context, address,
                          contactId_string, body, timestamp,
                          threadId, count, messageId, SmsMmsMessage.MESSAGE_TYPE_SMS);
            return smsMessage;
         }
      } finally {
         cursor.close();
      }
   }               
   return null;
}

47
यह एंड्रॉइड एसडीके का हिस्सा नहीं है। यह कोड गलत धारणा बनाता है कि सभी डिवाइस इस अनजाने और असमर्थित सामग्री प्रदाता का समर्थन करते हैं। Google ने स्पष्ट रूप से संकेत दिया है कि इस पर भरोसा करना एक अच्छा विचार नहीं है: android-developers.blogspot.com/2010/05/…
CommonsWare

1
@ जानुस: कोई भी दस्तावेज और समर्थित साधन नहीं है जो सभी डिवाइसों पर सभी एसएमएस क्लाइंट के लिए काम करता हो।
कॉमन्सवेयर

9
@CommonsWare जिसे सुनकर दुख हुआ। तब इस एपीआई के साथ रहना पड़ सकता है।
Janusz

@ किसी भी विचार से आप प्रति संपर्क एसएमएस संदेशों की संख्या की गणना कैसे करेंगे?
स्पाइसीविनी

4
कोड स्थानांतरित हो गया है। SmsPopupUtils.java सर्च करने से मुझे google कोड में एक नई लिंक मिल गई। यदि वे इसे फिर से स्थानांतरित करते हैं या इसे पूरी तरह से बंद कर देते हैं, तो यहां एक बैकअप लिंक है - pastebin.com/iPt7MLyM
KalEl

25

एपीआई 19 के बाद से आप उसके लिए टेलीफोनी क्लास का उपयोग कर सकते हैं; चूंकि हार्डकोर वैल्यू हर डिवाइस में मैसेज रिसीव नहीं करेगी क्योंकि कंटेंट प्रोवाइडर Uri डिवाइस और निर्माताओं से बदल जाता है।

public void getAllSms(Context context) {

    ContentResolver cr = context.getContentResolver();
    Cursor c = cr.query(Telephony.Sms.CONTENT_URI, null, null, null, null);
    int totalSMS = 0;
    if (c != null) {
        totalSMS = c.getCount();
        if (c.moveToFirst()) {
            for (int j = 0; j < totalSMS; j++) {
                String smsDate = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.DATE));
                String number = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.ADDRESS));
                String body = c.getString(c.getColumnIndexOrThrow(Telephony.Sms.BODY));
                Date dateFormat= new Date(Long.valueOf(smsDate));
                String type;
                switch (Integer.parseInt(c.getString(c.getColumnIndexOrThrow(Telephony.Sms.TYPE)))) {
                    case Telephony.Sms.MESSAGE_TYPE_INBOX:
                        type = "inbox";
                        break;
                    case Telephony.Sms.MESSAGE_TYPE_SENT:
                        type = "sent";
                        break;
                    case Telephony.Sms.MESSAGE_TYPE_OUTBOX:
                        type = "outbox";
                        break;
                    default:
                        break;
                }


                c.moveToNext();
            }
        }

        c.close();

    } else {
        Toast.makeText(this, "No message to show!", Toast.LENGTH_SHORT).show();
    }
}

9
केवल वही उत्तर प्रतीत होता है जो अनिर्दिष्ट एपीआई का उपयोग नहीं करता है और तीसरे पक्ष के पुस्तकालयों को संदर्भित नहीं करता है।
इस्माईल

मैंने Hangouts से एसएमएस संदेश प्राप्त करने के लिए इस कोड का उपयोग करने की कोशिश की (जो कि मेरा डिफ़ॉल्ट एसएमएस ऐप है)। इसके बजाय, यह पिछले आउटगोइंग संदेश को पुनः प्राप्त करता है जो मैंने मैसेंजर के माध्यम से भेजा था ... क्या आप जानते हैं कि यह क्या कारण है?
मिकी पी

@ मेरी अनुमान शक्तियों का उपयोग करते हुए मैं कहूंगा कि मैसेंजर ऐप ने आपको एसएमएस प्रबंधन को मैसेंजर के साथ बदलने के बारे में पूछा है। यह कुछ अन्य मैसेजिंग ऐप के साथ होता है। मेरे पास कोई और स्पष्टीकरण नहीं है।
m3nda

2
C.close () को कॉल करना न भूलें;
सिसरो मौरा

1
@SardarAgabejli यदि हम "contenturi: sms" जैसे हार्डकोर मानों का उपयोग करते हैं, तो यह हर डिवाइस के लिए समान नहीं होगा, लेकिन यदि हम टेलीफोनी क्लास का उपयोग करते हैं, तो हम उस डिवाइस के लिए सीधे conetnt uri या sms db के पथ पर पहुँच रहे हैं, यह sms के db को इंगित करने के लिए एक सहायक वर्ग
मनोज पेरुमारथ

23

यह पोस्ट थोड़ी पुरानी है, लेकिन यहां SMSAndroid में सामग्री प्रदाता से संबंधित डेटा प्राप्त करने का एक और आसान उपाय है:

इस लिब का उपयोग करें: https://github.com/EverythingMe/easy-content-providers

  • सभी प्राप्त करें SMS:

    TelephonyProvider telephonyProvider = new TelephonyProvider(context);
    List<Sms> smses = telephonyProvider.getSms(Filter.ALL).getList();

    प्रत्येक Sms में सभी क्षेत्र होते हैं, इसलिए आप अपनी आवश्यकता की कोई भी जानकारी प्राप्त कर सकते हैं:
    पता, बॉडी, प्राप्त करें, टाइप करें (INBOX, SENT, DRAFT, ..), threadId, ...

  • सभी जेल MMS:

    List<Mms> mmses = telephonyProvider.getMms(Filter.ALL).getList();
  • सभी जेल Thread:

    List<Thread> threads = telephonyProvider.getThreads().getList();
  • सभी जेल Conversation:

    List<Conversation> conversations = telephonyProvider.getConversations().getList();

यह साथ काम करता है Listया Cursorयह देखने के लिए एक नमूना ऐप है कि यह कैसा दिखता है और कैसे काम करता है।

वास्तव में, सभी Android सामग्री प्रदाताओं के लिए एक समर्थन है जैसे: संपर्क, कॉल लॉग, कैलेंडर, ... सभी विकल्पों के साथ पूर्ण डॉक्टर: https://github.com/EverythingMe/easy-content-providers/wiki/Android- प्रदाताओं

आशा है कि यह भी मदद की :)


1
गीथूब पर स्रोत कोड और उदाहरण काफी उपयोगी हैं। यह सबसे आम प्रदाताओं के लिए एक अच्छा आवरण / मुखौटा है। धन्यवाद।
m3nda

14

चरण 1: पहले हमें मेनिफ़ेस्ट फ़ाइल जैसी अनुमतियों को जोड़ना होगा

<uses-permission android:name="android.permission.RECEIVE_SMS" android:protectionLevel="signature" />
<uses-permission android:name="android.permission.READ_SMS" />

चरण 2: फिर एसएमएस प्राप्त करने के लिए सेवा एसएमएस रिसीवर वर्ग जोड़ें

<receiver android:name="com.aquadeals.seller.services.SmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

चरण 3: रन टाइम अनुमति जोड़ें

private boolean checkAndRequestPermissions()
{
    int sms = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS);

    if (sms != PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, REQUEST_ID_MULTIPLE_PERMISSIONS);
        return false;
    }
    return true;
}

चरण 4: इस एप्लिकेशन को अपने ऐप में जोड़ें और इंटरफ़ेस क्लास का परीक्षण करें

public interface SmsListener {
   public void messageReceived(String messageText);
}

SmsReceiver.java

public class SmsReceiver extends BroadcastReceiver {
private static SmsListener mListener;
public Pattern p = Pattern.compile("(|^)\\d{6}");
@Override
public void onReceive(Context context, Intent intent) {
    Bundle data  = intent.getExtras();
    Object[] pdus = (Object[]) data.get("pdus");
    for(int i=0;i<pdus.length;i++)
    {
        SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdus[i]);
        String sender = smsMessage.getDisplayOriginatingAddress();
        String phoneNumber = smsMessage.getDisplayOriginatingAddress();
        String senderNum = phoneNumber ;
        String messageBody = smsMessage.getMessageBody();
        try
        {
  if(messageBody!=null){
   Matcher m = p.matcher(messageBody);
    if(m.find()) {
      mListener.messageReceived(m.group(0));  }
 else {}}  }
        catch(Exception e){} } }
public static void bindListener(SmsListener listener) {
    mListener = listener; }}

पैटर्न क्या करता है?
मार्क बुइकेमा

अच्छा ... वह है ("com.aquadeals.seller.services.msReceiver") सामान्य सेवा का नाम?
m3nda

हां वह सेवा का नाम नहीं है, जो कि मेरे ऐप में SmsReceiver क्लास पथ है
वेंकटेश

LOCATION के लिए अनुमति की आवश्यकता क्यों है?
ज़म सनक

1
मैं एक ऐप बनाने की कोशिश कर रहा हूं, जो ऐप को मारे जाने पर भी उपयोगकर्ता को एसएमएस सामग्री देता है
अंजनी मित्तल

11

बहुत सारे जवाब पहले से ही उपलब्ध हैं, लेकिन मुझे लगता है कि वे सभी इस सवाल का एक महत्वपूर्ण हिस्सा याद कर रहे हैं। आंतरिक डेटाबेस या उसकी तालिका से डेटा पढ़ने से पहले हमें यह समझना होगा कि इसमें डेटा कैसे संग्रहीत किया जाता है और फिर हम उपरोक्त प्रश्न का हल पा सकते हैं:

मैं एंड्रॉइड में प्रोग्राम से डिवाइस से एसएमएस संदेश कैसे पढ़ सकता हूं?

तो, In Android SMS तालिका इस तरह दिखती है

यहां छवि विवरण दर्ज करें

पता है, हम डेटाबेस से जो चाहें चुन सकते हैं। हमारे मामले में हमें केवल आवश्यकता है

आईडी, पता और शरीर

एसएमएस पढ़ने के मामले में:

अनुमतियों के लिए 1.Ask

int REQUEST_PHONE_CALL = 1;

   if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, REQUEST_PHONE_CALL);
        }

या

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

2.अब आपका कोड इस तरह जाता है

// Create Inbox box URI
Uri inboxURI = Uri.parse("content://sms/inbox");

// List required columns
String[] reqCols = new String[]{"_id", "address", "body"};

// Get Content Resolver object, which will deal with Content Provider
ContentResolver cr = getContentResolver();

// Fetch Inbox SMS Message from Built-in Content Provider
Cursor c = cr.query(inboxURI, reqCols, null, null, null);

// Attached Cursor with adapter and display in listview
adapter = new SimpleCursorAdapter(this, R.layout.a1_row, c,
        new String[]{"body", "address"}, new int[]{
        R.id.A1_txt_Msg, R.id.A1_txt_Number});
lst.setAdapter(adapter);

मुझे उम्मीद है कि यह मददगार होगा। धन्यवाद।


7

Google Play सेवाओं में दो एपीआई हैं जिनका उपयोग आप एसएमएस-आधारित सत्यापन प्रक्रिया को कारगर बनाने के लिए कर सकते हैं

एसएमएस रिट्रीवर एपीआई

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

  • संदेश की आवश्यकताएं - 11 अंकों का हैश कोड जो विशिष्ट रूप से आपके ऐप की पहचान करता है
  • प्रेषक आवश्यकताएँ - कोई नहीं
  • उपयोगकर्ता सहभागिता - कोई नहीं

एक Android ऐप में एसएमएस सत्यापन का अनुरोध करें

एक सर्वर पर एसएमएस सत्यापन करें

एसएमएस उपयोगकर्ता सहमति एपीआई

कस्टम हैश कोड की आवश्यकता नहीं है, हालांकि सत्यापन कोड वाले संदेश तक पहुंचने के लिए उपयोगकर्ता को आपके ऐप के अनुरोध को स्वीकार करने की आवश्यकता होती है। उपयोगकर्ता को गलत संदेश भेजने की संभावना को कम करने के लिए SMS User Consent, उपयोगकर्ता की संपर्क सूची में प्रेषकों के संदेशों को फ़िल्टर करेगा।

  • संदेश की आवश्यकताएं - कम से कम एक नंबर वाले 4-10 अंकों के अल्फ़ान्यूमेरिक कोड
  • प्रेषक आवश्यकताएँ - प्रेषक उपयोगकर्ता की संपर्क सूची में नहीं हो सकता
  • उपयोगकर्ता सहभागिता - अनुमोदन करने के लिए एक टैप

The SMS User Consent APIGoogle Play Services का हिस्सा है। इसका उपयोग करने के लिए आपको 17.0.0इन पुस्तकालयों के कम से कम संस्करण की आवश्यकता होगी :

implementation "com.google.android.gms:play-services-auth:17.0.0"
implementation "com.google.android.gms:play-services-auth-api-phone:17.1.0"

चरण 1: एसएमएस संदेशों के लिए सुनना शुरू करें

एसएमएस उपयोगकर्ता सहमति आने वाले एसएमएस संदेशों को सुनेंगे जिनमें पांच मिनट तक एक बार-कोड होता है। यह शुरू होने से पहले भेजे जाने वाले किसी भी संदेश को नहीं देखेगा। यदि आप उस फ़ोन नंबर को जानते हैं जो वन-टाइम-कोड भेजेगा, तो आप निर्दिष्ट कर सकते हैं senderPhoneNumber, या यदि आप nullकिसी भी नंबर से मेल नहीं खाते हैं।

 smsRetriever.startSmsUserConsent(senderPhoneNumber /* or null */)

चरण 2: संदेश पढ़ने के लिए सहमति का अनुरोध करें

एक बार जब आपका ऐप एक बार-कोड वाला संदेश प्राप्त करता है, तो उसे प्रसारण द्वारा अधिसूचित किया जाएगा। इस बिंदु पर, आपके पास संदेश पढ़ने के लिए सहमति नहीं है - इसके बजाय आपको यह दिया जाता है Intentकि आप सहमति के लिए उपयोगकर्ता को संकेत देना शुरू कर सकते हैं। आपके अंदर BroadcastReceiverहै, तो आप का उपयोग कर संकेत दिखाने Intentमें extras। जब आप वह इरादा शुरू करते हैं, तो यह उपयोगकर्ता को एक संदेश पढ़ने की अनुमति के लिए संकेत देगा। उन्हें वह संपूर्ण पाठ दिखाया जाएगा जो वे आपके ऐप के साथ साझा करेंगे।

val consentIntent = extras.getParcelable<Intent>(SmsRetriever.EXTRA_CONSENT_INTENT)
startActivityForResult(consentIntent, SMS_CONSENT_REQUEST)

यहां छवि विवरण दर्ज करें

चरण 3: एक-बार-कोड को पार्स करें और एसएमएस सत्यापन पूरा करें

जब उपयोगकर्ता क्लिक करता है “Allow”- यह वास्तव में संदेश पढ़ने का समय है! onActivityResultआप के अंदर डेटा से एसएमएस संदेश का पूरा पाठ प्राप्त कर सकते हैं:

val message = data.getStringExtra(SmsRetriever.EXTRA_SMS_MESSAGE)

फिर आप एसएमएस संदेश को पार्स करते हैं और अपने बैकएंड को वन-टाइम-कोड पास करते हैं!


4-10 digit alphanumeric code containing at least one numberक्या आप बता सकते हैं कि इसका क्या मतलब है? क्या इसका मतलब है कि पूरे संदेश की लंबाई सिर्फ एसएमएस कोड के 4-10 अक्षर होने चाहिए?
जीशान शब्बीर

साथ ही धन्यवाद
लेवॉन पेट्रोसियन

यह केवल ओटीपी सत्यापन के लिए काम करता है? फोन के अंदर अन्य सभी संदेशों, सभी एसएमएस आदि को पढ़ने के बारे में क्या? क्या इसके लिए कोई नया एपीआई है, कृपया मुझे बताएं। हैप्पी कोडिंग! :)
मनोज पेरुमरथ

हमें हमेशा टाइमआउट त्रुटि मिली है। कृपया मेरी मदद करें
मणिकंदन के

2
String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0" : null;

द्वारा बदला गया:

String WHERE_CONDITION = unreadOnly ? SMS_READ_COLUMN + " = 0 " : SMS_READ_COLUMN + " = 1 ";

2

एसएमएस पढ़ने के लिए कोटलिन कोड:

1- इस अनुमति को AndroidManifest.xml में जोड़ें:

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

2-एक ब्रॉडकास्टसीवर क्लास बनाएँ:

package utils.broadcastreceivers

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.SmsMessage
import android.util.Log

class MySMSBroadCastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
    var body = ""
    val bundle = intent?.extras
    val pdusArr = bundle!!.get("pdus") as Array<Any>
    var messages: Array<SmsMessage?>  = arrayOfNulls(pdusArr.size)

 // if SMSis Long and contain more than 1 Message we'll read all of them
    for (i in pdusArr.indices) {
        messages[i] = SmsMessage.createFromPdu(pdusArr[i] as ByteArray)
    }
      var MobileNumber: String? = messages[0]?.originatingAddress
       Log.i(TAG, "MobileNumber =$MobileNumber")         
       val bodyText = StringBuilder()
        for (i in messages.indices) {
            bodyText.append(messages[i]?.messageBody)
        }
        body = bodyText.toString()
        if (body.isNotEmpty()){
       // Do something, save SMS in DB or variable , static object or .... 
                       Log.i("Inside Receiver :" , "body =$body")
        }
    }
 }

3-एसएमएस एसएमएस की अनुमति प्राप्त करें अगर एंड्रॉइड 6 और उससे अधिक:

   if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && 
    ActivityCompat.checkSelfPermission(context!!,
            Manifest.permission.RECEIVE_SMS
        ) != PackageManager.PERMISSION_GRANTED
    ) { // Needs permission

            requestPermissions(arrayOf(Manifest.permission.RECEIVE_SMS),
            PERMISSIONS_REQUEST_READ_SMS
        )

    } else { // Permission has already been granted

    }

4- इस अनुरोध कोड को गतिविधि या टुकड़े में जोड़ें:

 companion object {
    const val PERMISSIONS_REQUEST_READ_SMS = 100
   }

5- ओवरराइड चेक परमिट अनुमति अनुरोध मज़ा परिणाम:

 override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<out String>,
    grantResults: IntArray
) {
    when (requestCode) {

        PERMISSIONS_REQUEST_READ_SMS -> {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Log.i("BroadCastReceiver", "PERMISSIONS_REQUEST_READ_SMS Granted")
            } else {
                //  toast("Permission must be granted  ")
            }
        }
    }
}

1

सबसे आसान कार्य

Sms पढ़ने के लिए मैंने एक फ़ंक्शन लिखा है जो एक वार्तालाप ऑब्जेक्ट लौटाता है:

class Conversation(val number: String, val message: List<Message>)
class Message(val number: String, val body: String, val date: Date)

fun getSmsConversation(context: Context, number: String? = null, completion: (conversations: List<Conversation>?) -> Unit) {
        val cursor = context.contentResolver.query(Telephony.Sms.CONTENT_URI, null, null, null, null)

        val numbers = ArrayList<String>()
        val messages = ArrayList<Message>()
        var results = ArrayList<Conversation>()

        while (cursor != null && cursor.moveToNext()) {
            val smsDate = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.DATE))
            val number = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.ADDRESS))
            val body = cursor.getString(cursor.getColumnIndexOrThrow(Telephony.Sms.BODY))

            numbers.add(number)
            messages.add(Message(number, body, Date(smsDate.toLong())))
        }

        cursor?.close()

        numbers.forEach { number ->
            if (results.find { it.number == number } == null) {
                val msg = messages.filter { it.number == number }
                results.add(Conversation(number = number, message = msg))
            }
        }

        if (number != null) {
            results = results.filter { it.number == number } as ArrayList<Conversation>
        }

        completion(results)
    }

का उपयोग करते हुए:

getSmsConversation(this){ conversations ->
    conversations.forEach { conversation ->
        println("Number: ${conversation.number}")
        println("Message One: ${conversation.message[0].body}")
        println("Message Two: ${conversation.message[1].body}")
    }
}

या केवल विशिष्ट संख्या की बातचीत करें:

getSmsConversation(this, "+33666494128"){ conversations ->
    conversations.forEach { conversation ->
        println("Number: ${conversation.number}")
        println("Message One: ${conversation.message[0].body}")
        println("Message Two: ${conversation.message[1].body}")
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.