Rohith Chanda
Rohith Chanda

Reputation: 1

How do I read SMS messages in Android (13 and above) using an Android app?

I am an Android developer working on a startup project that involves reading SMS messages from a specific number. However, due to restrictions in Android 12 and above, the app no longer has permission to read SMS messages directly. Is there an alternative method or workaround to access SMS messages under these new restrictions?

    private void checkSmsPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_SMS}, REQUEST_READ_SMS_PERMISSION);
        } else if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS_PERMISSION);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {
            case REQUEST_READ_SMS_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission granted for reading SMS
                    queryLatestSmsMessages();
                } else {
                    // Permission denied for reading SMS
                    showToast("Permission to read SMS denied.");
                }
                break;
            case REQUEST_SEND_SMS_PERMISSION:
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    // Permission granted for sending SMS
                } else {
                    // Permission denied for sending SMS
                    showToast("Permission to send SMS denied.");
                }
                break;
        }
    }

    private void registerSmsReceiver() {
        smsReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction() != null && intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                    Bundle bundle = intent.getExtras();
                    if (bundle != null) {
                        Object[] pdus = (Object[]) bundle.get("pdus");
                        if (pdus != null) {
                            for (Object pdu : pdus) {
                                SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
                                String sender = smsMessage.getDisplayOriginatingAddress();
                                String messageBody = smsMessage.getMessageBody();
                                handleSmsMessage(sender, messageBody);
                            }
                        }
                    }
                }
            }
        };

        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(smsReceiver, filter);
    }

    private void handleSmsMessage(String sender, String messageBody) {
        String messageHash = sender + "|" + messageBody;
        if (receivedMessageHashes.contains(messageHash)) {
            Log.d("SmsReceiver", "Duplicate message detected. Ignoring.");
            return;
        }
        receivedMessageHashes.add(messageHash);

        Log.d("SmsReceiver", "Sender: " + sender);
        Log.d("SmsReceiver", "Message Body: " + messageBody);

        if (!currentStater.getStarter_phone_number().isEmpty() && sender.contains(currentStater.getStarter_phone_number())) {
            Log.d("SmsReceiver", "Received SMS from starter: " + currentStater.getStarter_phone_number());

            if (messageBody.contains("3-PHASE OK")) {
                status.setText("3-PHASE OK");
                phase1.setImageResource(R.drawable.img_btn_background);
                phase2.setImageResource(R.drawable.img_btn_background);
                phase3.setImageResource(R.drawable.img_btn_background);
                isActivated = false;
                isActivated1 = false;
                isActivated2 = false;
            } else if (messageBody.contains("Line Fault")) {
                status.setText("Line Fault");
                phase1.setImageResource(R.drawable.img_btn_background);
                phase2.setImageResource(R.drawable.img_btn_background);
                phase3.setImageResource(R.drawable.img_btn_background);
            }
        }
    }

Upvotes: 0

Views: 223

Answers (0)

Related Questions