Kotlin: Wie liest/empfängt man SMS-Nachrichten, sobald sie auf Android eingehen?Android

Forum für diejenigen, die für Android programmieren
Anonymous
 Kotlin: Wie liest/empfängt man SMS-Nachrichten, sobald sie auf Android eingehen?

Post by Anonymous »

Android 12.0
Ich möchte lediglich eine SMS-Nachricht an eine Telefonnummer senden und dann die eingehende SMS-Nachricht LESEN. Zeigen Sie dann die Nachricht auf dem Bildschirm an, aber meine App sieht die eingehende SMS-Nachricht NIEMALS (BroadcastReceiver onReceive wird nie ausgelöst), obwohl meine App erfolgreich eine SMS-Nachricht senden kann. Ich kann es sehen, indem ich meine SMS-App öffne.
Ich habe im gesamten INTERNET nach Antworten gesucht und viele Beispiele für verschiedene Versionen davon gefunden, sogar bei StackOverflow-Fragen, die sich DIREKT mit meinem Anliegen befassen. Ich habe sogar Beispielcodes für künstliche Intelligenz (KI) ausprobiert. Allerdings bietet keines der Beispiele oder Antworten eine funktionierende Lösung oder bringt mir etwas, aber meine App wird JEDES MAL erfolgreich kompiliert und gestartet.
Hier ist, was ich bisher getan habe.
1.) In meiner App habe ich alle erforderlichen Berechtigungen dafür wie READ_SMS, SEND_SMS, RECEIVE_SMS wie folgt angefordert.

Code: Select all

//In AndroidManifest.xml













//In addition to the above listing of SMS permissions within AndroidManifest.xml,
//I also request for the same permissions within my app during runtime as follows. All work as expected.

class MainActivity : AppCompatActivity() {
private val requestSmsPermissionLauncher =
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
if (isGranted) {
// Permission is granted, proceed with sending SMS
Toast.makeText(this, "SMS permission granted", Toast.LENGTH_SHORT).show()
// Call your function to send SMS here
} else {
// Permission is denied, handle the case appropriately
Toast.makeText(this, "SMS permission denied", Toast.LENGTH_SHORT).show()
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

if (!hasSmsSENDPermission(this)) {
requestSmsPermissionLauncher.launch(android.Manifest.permission.SEND_SMS)
} else {
// Permission already granted, proceed with SMS functionality
Toast.makeText(this, "SEND_SMS already granted", Toast.LENGTH_SHORT).show()
}

if (!hasSmsREADPermission2(this)) {
requestSmsPermissionLauncher.launch(android.Manifest.permission.READ_SMS)
} else {
// Permission already granted, proceed with SMS functionality
Toast.makeText(this, "READ_SMS already granted", Toast.LENGTH_SHORT).show()
}

if (!hasSmsRECEIVEPermission3(this)) {
requestSmsPermissionLauncher.launch(android.Manifest.permission.RECEIVE_SMS)
} else {
// Permission already granted, proceed with SMS functionality
Toast.makeText(this, "RECEIVE_SMS already granted", Toast.LENGTH_SHORT).show()
}

val button: Button = findViewById(R.id.sendSMS)
button.setOnClickListener {

val phoneNumber = "**********"
val message = "F*** OF*!!! lol...  "

try {

val smsManager: SmsManager
if (Build.VERSION.SDK_INT >= 23) {
smsManager = this.getSystemService(SmsManager::class.java)
} else {
smsManager = SmsManager.getDefault()
Toast.makeText(applicationContext, "less", Toast.LENGTH_LONG).show()
}
smsManager.sendTextMessage(phoneNumber, null, message, null, null)
Toast.makeText(applicationContext, "Message Sent", Toast.LENGTH_LONG).show()

} catch (e: Exception) {

Toast.makeText(
applicationContext,
e.message.toString(),
Toast.LENGTH_LONG
)
.show()
}
}
}

fun hasSmsSENDPermission(context: Context): Boolean {
return ContextCompat.checkSelfPermission(
context,
android.Manifest.permission.SEND_SMS
) == PackageManager.PERMISSION_GRANTED
}

fun hasSmsREADPermission(context: Context): Boolean {
return ContextCompat.checkSelfPermission(
context,
android.Manifest.permission.READ_SMS
) == PackageManager.PERMISSION_GRANTED
}

fun hasSmsRECEIVEPermission(context: Context): Boolean {
return ContextCompat.checkSelfPermission(
context,
android.Manifest.permission.RECEIVE_SMS
) == PackageManager.PERMISSION_GRANTED
}
2.) Ich habe BroadcastReceiver wie folgt in seiner eigenen Kotlin-Datei und DANN in MainActivity deklariert/definiert, als die VORHERIGE Version nicht funktionierte.

Code: Select all

//version 1 in its own file:
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.provider.Telephony
import androidx.localbroadcastmanager.content.LocalBroadcastManager

// In a new file, e.g., SmsReceiver.kt
class SmsReceiver1 : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == Telephony.Sms.Intents.SMS_RECEIVED_ACTION) {
val messages = Telephony.Sms.Intents.getMessagesFromIntent(intent)
for (smsMessage in messages) {
val sender = smsMessage.displayOriginatingAddress
val messageBody = smsMessage.displayMessageBody
val localIntent = Intent("SmsReceived")
localIntent.putExtra("sender", sender)
localIntent.putExtra("messageBody", messageBody)
LocalBroadcastManager.getInstance(context!!).sendBroadcast(localIntent)
}
}
}
}

//within MainActivity:
smsReceiver = SmsReceiver1()
val intentFilter = IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION)
registerReceiver(smsReceiver, intentFilter)

val smsBroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val sender = intent?.getStringExtra("sender")
val messageBody = intent?.getStringExtra("messageBody")
// Update your UI or process the SMS in MainActivity
Toast.makeText(context, "New SMS from: $sender\nMessage: $messageBody", Toast.LENGTH_LONG).show()
}
}

fun onCreate(savedInstanceState: Bundle?) {
// ...
LocalBroadcastManager.getInstance(this).registerReceiver(smsBroadcastReceiver, IntentFilter("SmsReceived"))
}

fun onDestroy() {
super.onDestroy()
unregisterReceiver(smsReceiver) // Unregister to avoid memory leaks
unregisterReceiver(smsBroadcastReceiver)
}

=================================================================
//HERE is a different version of BroadcastReceiver in MainActivity

val receiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
if (intent.action == Telephony.Sms.Intents.SMS_RECEIVED_ACTION) {
val bundle:  Bundle? = intent.extras
val pdus = bundle?.get("pdus") as Array
for (pdu in pdus) {
val smsMessage = SmsMessage.createFromPdu(pdu as ByteArray)
val sender = smsMessage.displayOriginatingAddress
val messageBody = smsMessage.messageBody
// Process the received SMS
Toast.makeText(applicationContext, messageBody, Toast.LENGTH_LONG).show()
}
}
}
}

fun onResume(){
registerReceiver(receiver, IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION))
}

fun onDestory(){
UnregisterReceiver(receiver);
}

=========================================================================
//YET, another version of BroadcastReceiver in MainActivity

val br = object : BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
for (sms in Telephony.Sms.Intents.getMessagesFromIntent(
p1
)) {
val smsSender = sms.originatingAddress
val smsMessageBody = sms.displayMessageBody
if (smsSender == "**********") {
Toast.makeText(p0, smsMessageBody, Toast.LENGTH_LONG).show()
break
}
}
}
}

registerReceiver(br, IntentFilter(Telephony.Sms.Intents.SMS_RECEIVED_ACTION))

fun onDestroy(){
UnregisterReceiver(br)
}
Also, wie ich schon sagte, meine App wird OHNE FEHLER kompiliert und gestartet und kann TEXTMELDUNGEN an mein Telefon senden. Allerdings liest meine App die Textnachricht nie, obwohl mein Telefon die Textnachricht empfängt. Es ist so, als ob das BroadcastReceiver onReceive-Ereignis NIEMALS AUSLÖST/TRIGGERT. Was übersehe ich?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post