আমি কীভাবে ডিভাইস থেকে অ্যান্ড্রয়েডে এসএমএস বার্তা পড়তে পারি?


249

আমি ডিভাইস থেকে এসএমএস বার্তাগুলি পুনরুদ্ধার করতে এবং সেগুলি প্রদর্শন করতে চাই?


@ ডেভিড ফ্রেইটাস বিশ্বস্ত লিঙ্ক +1
শাহজাদ ইমাম ২

3
@ ডেভিডফ্রেইটাস এই লিঙ্কটি কাজ করছে না, আপনি দয়া করে শীর্ষস্থানীয় লিঙ্কটি ভাগ করে নিতে পারেন?
খোবাইব

3
@ খোবাইব, যথারীতি ইন্টারনেটের জিনিসগুলি ক্ষণস্থায়ী। আমি আর্কাইভ.অর্গ স্ট্যাকওভারফ্লো.com/ a/19966227/ 40961 এ একটি অনুলিপি পেয়েছি , তাদের জন্য সদাচরণের ধন্যবাদ জানাই (তাদের চালিয়ে যাওয়ার জন্য আমি সম্প্রতি দান করেছি)। তবে আমাদের এই পৃষ্ঠার বিষয়বস্তুটি web.archive.org/web/20121022021217/http://mobdev.olin.edu/… থেকে এই প্রশ্নের উত্তরে মার্কডাউন সিনট্যাক্সে রূপান্তর করা বিবেচনা করা উচিত । সম্ভবত এক ঘন্টা কাজ।
ডেভিড ডি সি ই ফ্রেইটাস

উত্তর:


157

ইনবক্সে থাকা এসএমএস পড়তে সামগ্রী সমাধানকারী ( "সামগ্রী: // এসএমএস / ইনবক্স" ) ব্যবহার করুন।

// 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
ধন্যবাদ! আপনি "গেটক্লোননাম" ভুল বানান করেছেন, অন্যথায় এটি মোহনগুলির মতো কাজ করে। ওহ, এবং যদি কেউ এটি ব্যবহার করে তবে অ্যান্ড্রয়েড.পারমিশন.আরএডএসএমএস যোগ করতে ভুলবেন না।
কিওয়ারটি

1
ধন্যবাদ। আমি এটি সংশোধন করেছি :)
সুর্যভেল টিআর

5
এটি কি এই অনাবন্ধিত এপিআই ব্যবহার করে যা @ কমন্সওয়্যার তার মন্তব্যে গৃহীত উত্তরের জন্য উল্লেখ করেছে?
কৃষ্ণভদ্র

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

}

আপনার AndroidManLive.xML এ অনুমতি নির্ধারণ করতে ভুলবেন না

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

2
এটি একটি দুর্দান্ত কোড piece কেবল একটি জিনিস, সময়টি মিলি সেকেন্ডে পাওয়া যায়। আমি মনে করি এটিকে মানুষের পাঠযোগ্য ফর্ম্যাট হিসাবে তৈরি করা আরও ভাল হবেString receiveDayTime = Functions.dateFromMilisec(Long.valueOf(c.getColumnIndexOrThrow("date")), "hh:mm a MMM dd, yyyy");
বিবাসওয়ান বন্দ্যোপাধ্যায়

1
গেটর এবং সেটার দিয়ে সবকিছু তৈরি করার উদ্দেশ্য কী, আমি সত্যিই বুঝতে পারি না কেন কেবল কোনও এসোসিয়ে অ্যারে বা শ্রেণি যার উপাদানগুলিতে সরাসরি অ্যাক্সেস করা হয় তা ব্যবহার করবেন না
মিচনোভকা

1
@ টমাসনাভারা: গিটার এবং সেটার ব্যবহার বোঝার জন্য এই কোডটি পরীক্ষা করুন। পেস্টবিন.com
বাগগুলি 11 ই

@ বিবাসওয়ানবান্দিপাধ্যায় যদি আপনি অ্যান্ড্রয়েড লাইব্রেরি এবং জাভা লাইব্রেরি ব্যতীত অন্য কিছু ব্যবহার করতে না চান। new SimpleDateFormat("hh:mm", Locale.US).format(new Date(Long.parseLong(_time)));এটি আপনাকে 24 ঘন্টা সময় দেবে।
ক্রিস - জুন

mActivityসংজ্ঞায়িত করা হয় নি. এটা কি?
dthree

61

এটি একটি তুচ্ছ প্রক্রিয়া। সোর্স কোড এসএমএসপপআপে আপনি একটি ভাল উদাহরণ দেখতে পারেন

নিম্নলিখিত পদ্ধতি পরীক্ষা করুন:

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
এটি অ্যান্ড্রয়েড এসডিকে-র অংশ নয়। এই কোডটি ভুল ধারণা তৈরি করে যে সমস্ত ডিভাইস এই অনিবন্ধিত এবং অসমর্থিত সামগ্রী সরবরাহকারীকে সমর্থন করে। গুগল স্পষ্টভাবে ইঙ্গিত দিয়েছে যে এর উপর নির্ভর করা ভাল ধারণা নয়: android-developers.blogspot.com/2010/05/…
CommonsWare

1
@ জানুস: এখানে কোনও ডকুমেন্টেড এবং সমর্থিত অর্থ নেই যা সমস্ত ডিভাইসে সমস্ত এসএমএস ক্লায়েন্ট জুড়ে কাজ করে।
কমন্সওয়্যার

9
@ কমন্সওয়্যারটি শুনে তা দুঃখজনক। এই API এর সাথে তখন থাকতে পারে।
জানুস

@ ওমার কোনও ধারণা আপনি কীভাবে যোগাযোগের জন্য এসএমএস বার্তার সংখ্যা গণনা করবেন?
মশলাদার উইনি

4
কোডটি সরানো হয়েছে। এসএমএসপপআপ ইউটিলেস.জেভা সন্ধান করা আমাকে গুগল কোডে এটির একটি নতুন লিঙ্ক পেয়েছে। যদি তারা এটিকে আবার সরিয়ে দেয় বা এটি পুরোপুরি বন্ধ করে দেয় তবে এখানে একটি ব্যাকআপ লিঙ্কটি রয়েছে - পেস্টবিন.
com

25

এপিআই 19 19 এর পরে আপনি তার জন্য টেলিফোনি বর্গ ব্যবহার করতে পারেন; যেহেতু হার্ডকর্ড করা মানগুলি প্রতিটি ডিভাইসে বার্তা পুনরুদ্ধার করে না কারণ সামগ্রী সরবরাহকারী উরি ডিভাইস এবং প্রস্তুতকারকদের থেকে পরিবর্তন করে।

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
একমাত্র উত্তর বলে মনে হচ্ছে যা অননুমোদিত API ব্যবহার করে না এবং তৃতীয় পক্ষের লাইব্রেরিগুলিকে উল্লেখ করে না।
ইসহামেল

আমি এই কোডটি Hangouts এর (যা আমার ডিফল্ট এসএমএস অ্যাপ্লিকেশন) থেকে এসএমএস বার্তা পেতে ব্যবহার করার চেষ্টা করেছি। পরিবর্তে, এটি মেসেঞ্জারের মাধ্যমে প্রেরিত সর্বশেষ বহির্গামী বার্তাটি পুনরুদ্ধার করেছে ... আপনি কি জানেন যে এটি কী কারণে ঘটছে?
মিকি পি

@ মিকিপ আমার অনুমানের ক্ষমতাগুলি ব্যবহার করে আমি বলব যে মেসেঞ্জার অ্যাপ আপনাকে মেসেঞ্জারের সাথে এসএমএস পরিচালনা প্রতিস্থাপন করতে বলেছে। এটি অন্য কিছু মেসেজিং অ্যাপ্লিকেশানের সাথে ঘটে। আমার আর কোন ব্যাখ্যা নেই।
m3nda

2
C.close () কল করতে ভুলবেন না;
সিসেরো মৌরা

1
@ সরদারআগাবেজলি যদি আমরা "কন্টেন্টুরি: এসএমএস" এর মতো কঠোর মানগুলি ব্যবহার করি তবে এটি প্রতিটি ডিভাইসের জন্য একই হবে না, তবে আমরা যদি টেলিফোনি ক্লাস ব্যবহার করি, তবে আমরা সেই কনটেন্ট ইউরি বা সেই ডিভাইসের এসএমএস ডিবি-এর পথে সরাসরি অ্যাক্সেস পাচ্ছি, এটি এসএমএসের ডিবিতে একটি সহায়ক শ্রেণি নির্দেশ করার জন্য
মনোজ পেরুমারথ

23

এই পোস্টটি কিছুটা পুরানো তবে SMSঅ্যান্ড্রয়েডে সামগ্রী সরবরাহকারীর সাথে সম্পর্কিত ডেটা পাওয়ার আরও একটি সহজ সমাধান এখানে দেওয়া হয়েছে:

এই লিবিবটি ব্যবহার করুন: https://github.com/EverythingMe/easy-content-providers

  • সমস্ত পান SMS:

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

    প্রতিটি এসএমএসের সমস্ত ক্ষেত্র রয়েছে, যাতে আপনি প্রয়োজনীয় যে কোনও তথ্য পেতে পারেন:
    ঠিকানা, শরীর, প্রাপ্ত তারিখ, টাইপ (আইএনবক্স, সেন্ট, ড্রাফ্ট, ..), থ্রেডআইডি, ...

  • জেল সব 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সেখানে কিভাবে এটি দেখায় এবং কাজ দেখার জন্য একটি নমুনা অ্যাপ্লিকেশন।

প্রকৃতপক্ষে, সমস্ত অ্যান্ড্রয়েড সামগ্রী সরবরাহকারী যেমন: পরিচিতি, কল লগ, ক্যালেন্ডার, ... সমস্ত বিকল্পের সাথে সম্পূর্ণ ডক : এর জন্য একটি সমর্থন রয়েছে : 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.SmsReceiver") সাধারণ পরিষেবা নাম?
m3nda

ইয়া সেবার নাম নয়, এটি আমার অ্যাপ্লিকেশনে এসএমএসরসিভার শ্রেণির পথ
ভেঙ্কটেশ

কেন LOCATION এর অনুমতি দরকার?
জ্যাম ডুব

1
আমি এমন একটি অ্যাপ্লিকেশন তৈরি করার চেষ্টা করছি যা অ্যাপ্লিকেশনটি মারা গেছে এমনকি এসএমএসের সামগ্রীগুলি পপ আপ করে দেয়
অঞ্জানী মিত্তাল

11

ইতিমধ্যে প্রচুর উত্তর ইতিমধ্যে উপলব্ধ আছে তবে আমি মনে করি এগুলির সমস্তই এই প্রশ্নের একটি গুরুত্বপূর্ণ অংশ অনুপস্থিত। কোনও অভ্যন্তরীণ ডাটাবেস বা এর সারণী থেকে ডেটা পড়ার আগে আমাদের বুঝতে হবে এটিতে কীভাবে ডেটা সংরক্ষণ করা হয় এবং তারপরে আমরা উপরের প্রশ্নের সমাধান খুঁজে পেতে পারি যে:

আমি কীভাবে ডিভাইস থেকে অ্যান্ড্রয়েডে এসএমএস বার্তা পড়তে পারি?

সুতরাং, অ্যান্ড্রয়েড এসএমএস টেবিলটি দেখতে এর মতো

এখানে চিত্র বর্ণনা লিখুন

জেনে রাখুন, আমরা ডাটাবেস থেকে যা খুশি তা নির্বাচন করতে পারি our আমাদের ক্ষেত্রে আমাদের কেবল প্রয়োজন

আইডি, ঠিকানা এবং শরীর

এসএমএস পড়ার ক্ষেত্রে:

1. অনুমতি জন্য জিজ্ঞাসা করুন

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

গুগল প্লে পরিষেবাগুলির দুটি এপিআই রয়েছে যা আপনি এসএমএস-ভিত্তিক যাচাইকরণ প্রক্রিয়াটি প্রবাহিত করতে ব্যবহার করতে পারেন

এসএমএস পুনরুদ্ধারকারী এপিআই

ব্যবহারকারীকে ম্যানুয়ালি যাচাইকরণ কোডগুলি টাইপ করার প্রয়োজন ছাড়াই এবং কোনও অতিরিক্ত অ্যাপ্লিকেশন অনুমতি প্রয়োজন না করে এবং একটি সম্পূর্ণ স্বয়ংক্রিয় ব্যবহারকারী অভিজ্ঞতা সরবরাহ করে এবং সম্ভব হলে ব্যবহার করা উচিত। তবে এটি আপনাকে বার্তার বডিতে একটি কাস্টম হ্যাশ কোড স্থাপনের প্রয়োজন, সুতরাং আপনার অবশ্যই সার্ভারের পাশের নিয়ন্ত্রণও রাখতে হবে

  • বার্তার প্রয়োজনীয়তা - 11-সংখ্যার হ্যাশ কোড যা আপনার অ্যাপ্লিকেশনটিকে স্বতন্ত্রভাবে সনাক্ত করে
  • প্রেরকের প্রয়োজনীয়তা - কিছুই নেই
  • ব্যবহারকারীর মিথস্ক্রিয়া - কিছুই নয়

অ্যান্ড্রয়েড অ্যাপে এসএমএস যাচাইকরণের জন্য অনুরোধ করুন

কোনও সার্ভারে এসএমএস যাচাই করুন

এসএমএস ব্যবহারকারী সম্মতি এপিআই

কাস্টম হ্যাশ কোডের প্রয়োজন হয় না, তবে যাচাইকরণ কোডযুক্ত বার্তাটি অ্যাক্সেস করার জন্য আপনার অ্যাপ্লিকেশনটির অনুরোধটি ব্যবহারকারীর কাছে প্রয়োজন। ব্যবহারকারীর কাছে ভুল বার্তাটি সরিয়ে দেওয়ার সম্ভাবনা হ্রাস করার জন্য, SMS User Consentব্যবহারকারীর পরিচিতি তালিকার প্রেরকদের বার্তাগুলি ফিল্টার করে দেবে।

  • বার্তার প্রয়োজনীয়তা - 4-10 ডিজিটের আলফানিউমেরিক কোড যাতে কমপক্ষে একটি নম্বর থাকে
  • প্রেরকের প্রয়োজনীয়তা - প্রেরক ব্যবহারকারীর পরিচিতি তালিকায় থাকতে পারে না
  • ব্যবহারকারীর মিথস্ক্রিয়া - অনুমোদনের জন্য একটি আলতো চাপ

The SMS User Consent APIগুগল প্লে পরিষেবাদির অংশ। এটি ব্যবহার করতে আপনার 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

এসএমএস পড়ার জন্য কোটলিন কোড:

1- AndroidManLive.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

সবচেয়ে সহজ কাজ

এসএমএস পড়তে আমি একটি ফাংশন লিখেছিলাম যা একটি কথোপকথনের অবজেক্টকে ফেরত দেয়:

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}")
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.