Я просто хочу отправить SMS-сообщение на номер телефона, а затем ПРОЧИТАТЬ входящее SMS-сообщение. Затем поместите сообщение на экран, но мое приложение НИКОГДА не видит входящее SMS-сообщение (BroadcastReceiver onReceive никогда не срабатывает), хотя мое приложение может успешно отправлять SMS-сообщение. Я могу увидеть это, открыв свое приложение для текстовых сообщений.
Я просмотрел весь ИНТЕРНЕТ в поисках ответов и нашел множество примеров различных его версий, даже в вопросах StackOverflow, ПРЯМО касающихся моей проблемы. Я даже пробовал примеры кодов искусственного интеллекта (ИИ). Однако ни один из примеров или ответов не дает рабочего решения и ничего не делает для меня, но мое приложение успешно компилируется и запускается КАЖДЫЙ РАЗ.
Вот что я сделал до сих пор.
1.) В своем приложении я запросил все необходимые для этого разрешения, такие как READ_SMS, SEND_SMS, RECEIVE_SMS, следующим образом.
Код: Выделить всё
//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
}
Код: Выделить всё
//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 onDestroy(){
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)
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... on-android
Мобильная версия