"I'm navigating through the labyrinth of developing an application that requires the ability to detect SMS Messages. My journey through the vast expanse of the internet has yielded numerous examples, yet none seem to be the key I'm seeking. Can someone enlighten me on where I may be going astray?"
public class SMSReadReceiver extends BroadcastReceiver {
private static final String TAG = SMSReadReceiver.class.getSimpleName();
@Override
public void onReceive(Context context, Intent intent) {
if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION.equals(intent.getAction())) {
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdus = (Object[]) bundle.get("pdus");
if (pdus != null) {
String format = bundle.getString("format");
String senderNumber = "***********";
for (Object o : pdus) {
SmsMessage sms = SmsMessage.createFromPdu((byte[]) o, format);
senderNumber = sms.getOriginatingAddress();
String message = sms.getDisplayMessageBody();
Log.i(TAG, "SMS Message " + senderNumber + ", " + message);
}
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("+18888888888", null, "We received", null, null);
}
}
}
}
}
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final int REQUEST_SEND_SMS = 777;
private ActivityMainBinding binding;
private EditText etMessage, etPhone;
private Button btnGo;
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI, deliveredPI;
BroadcastReceiver smsSentReceiver, smsDeliveredReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
if(ContextCompat.checkSelfPermission(this,Manifest.permission.SEND_SMS)!= PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"no permission for Send SMS",Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.SEND_SMS},PackageManager.PERMISSION_GRANTED);
}
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.READ_SMS)!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"no permission for read",Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_SMS}, PackageManager.PERMISSION_GRANTED);
}
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.RECEIVE_SMS)!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(MainActivity.this,"no permission for receive",Toast.LENGTH_SHORT).show();
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.RECEIVE_SMS},PackageManager.PERMISSION_GRANTED);
}
etMessage = binding.etMessage;
etPhone = binding.etPhoneNumber;
btnGo = binding.btGo;
btnGo.setOnClickListener(v -> {
String message = etMessage.getText().toString();
String telno = etPhone.getText().toString();
sentPI = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(SENT), PendingIntent.FLAG_IMMUTABLE);
deliveredPI = PendingIntent.getBroadcast(MainActivity.this, 0, new Intent(DELIVERED), PendingIntent.FLAG_IMMUTABLE);
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.SEND_SMS}, REQUEST_SEND_SMS);
} else {
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(telno, null, message, sentPI, deliveredPI);
}
});
}
@RequiresApi(api = Build.VERSION_CODES.TIRAMISU)
@Override
protected void onResume() {
super.onResume();
smsSentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(MainActivity.this, "SMS Sent", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(MainActivity.this, "Generic Failure", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(MainActivity.this, "No Service", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(MainActivity.this, "Null PDU", Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(MainActivity.this, "Radio Off", Toast.LENGTH_SHORT).show();
break;
}
}
};
smsDeliveredReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (getResultCode()) {
case Activity.RESULT_OK:
Toast.makeText(MainActivity.this, "SMS Delivered", Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(MainActivity.this, "SMS Not Delivered", Toast.LENGTH_SHORT).show();
break;
}
}
};
registerReceiver(smsSentReceiver, new IntentFilter(SENT), Context.RECEIVER_NOT_EXPORTED);
registerReceiver(smsDeliveredReceiver, new IntentFilter(DELIVERED), Context.RECEIVER_NOT_EXPORTED);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(smsDeliveredReceiver);
unregisterReceiver(smsSentReceiver);
}
}
Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-feature
android:name="android.hardware.telephony"
android:required="true" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MeetInMiddle">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver
android:name=".receivers.SMSReceiver"
android:enabled="true"
android:exported="true"
android:permission="android.permission.BROADCAST_SMS">
</receiver>
</application>
</manifest>