Котлин: Как ЧИТАТЬ/ПОЛУЧАТЬ SMS-сообщения по мере их поступления на Android?Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Котлин: Как ЧИТАТЬ/ПОЛУЧАТЬ SMS-сообщения по мере их поступления на Android?

Сообщение Anonymous »

Android 12.0
Я просто хочу отправить 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
}
2.) Я объявил/определил BroadcastReceiver следующим образом в его собственном файле Kotlin, а ЗАТЕМ в MainActivity, когда ПРЕДЫДУЩАЯ версия не работала.

Код: Выделить всё

//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)
}
Итак, как я уже сказал, мое приложение компилируется и запускается БЕЗ ОШИБОК и может отправлять ТЕКСТОВЫЕ СООБЩЕНИЯ на мой телефон. Однако мое приложение никогда не ЧИТАЕТ текстовое сообщение, хотя мой телефон его получает. Это похоже на событие BroadcastReceiver onReceive НИКОГДА НЕ СРАБАТЫВАЙТЕ/ТРИГГЕРИРУЙТЕ. Что мне не хватает?

Подробнее здесь: https://stackoverflow.com/questions/797 ... on-android
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»