[英]get phoneNumber and messagetext I get from broadcast receiver to textviews in main activity and calling phoneNumber
我似乎無法從“廣播接收器”到“主活動”中的textviews中獲取值。
在Android(KOTLIN)中,我設法創建了一個廣播接收器,當接收到SMS消息時,該消息會在Toast事件中獲取phoneNumber和文本消息。
在主要活動中,我還有一個按鈕,單擊該按鈕時會呼叫#133#以檢查我的通話時間余額。
smsReceive類代碼;
package com.example.demmo
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
import android.telephony.SmsMessage
import android.widget.Toast
import android.app.Activity
class SmsReceiver : BroadcastReceiver(){
var activity : Activity? = null
override fun onReceive(context: Context, intent: Intent) {
val extras = intent.extras
if(extras != null){
val sms = extras.get("pdus") as Array<Any>
for(i in sms.indices) {
val format = extras.getString("format")
var smsMessage = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
SmsMessage.createFromPdu(sms[i] as ByteArray, format)
} else {
SmsMessage.createFromPdu(sms[i] as ByteArray)
}
val phoneNumber = smsMessage.originatingAddress
val messageText = smsMessage.messageBody.toString()
Toast.makeText(context, "From: $phoneNumber Message: $messageText", Toast.LENGTH_LONG).show()
}
}
}
}
MainActivity.kt代碼
package com.example.demmo
import android.content.pm.PackageManager
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.ActivityCompat
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.net.Uri
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val requestReceiveSms = 2
val balance = "*144%23"
val REQUEST_PHONE_CALL = 1
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS)
!= PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.RECEIVE_SMS), requestReceiveSms)
}
btnBalance.setOnClickListener {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), REQUEST_PHONE_CALL)
} else{
balance()
}
}
}
@SuppressLint("MissingPermission")
private fun balance() {
val callIntent = Intent(Intent.ACTION_CALL)
callIntent.data = (Uri.parse("tel:" + balance))
startActivity(callIntent)
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
if(requestCode == REQUEST_PHONE_CALL)balance
}
}
我想在'Toast.makeText(context,“ From:$ phoneNumber消息:$ messageText”,Toast.LENGTH_LONG).show()'之后添加一些代碼,以將值phoneNumber和textmessage分別放置到TextViews txtPhone和txtSMS以及'Click'或以編程方式致電phoneNumber。
我現在沒有安裝Android或Kotlin,因此無法提供工作代碼。 基本上,您應該遵循這種方法。 觀察者模式是一個廣泛使用的概念。 也許是實現您要尋找的最干凈的方法: BroadcastReceiver和Activity之間的通信-android
使用一些骯臟的代碼,您將能夠從SmsReceiver類調用“有趣的平衡”。 但這確實是您不想做的。 您可以嘗試通過練習來完成它,但是我不建議您使用它。 如果有更好的方法,則不會;)如果由於某種原因觀察者模式不起作用,我可以詳細說明其他可能性。
--------------編輯-------------
好的,如果您在觀察者模式上遇到麻煩,我會想到其他事情。
您想從其他活動中調用“娛樂平衡”。 廣播接收器沒有對Main類的引用。 因此,添加到您的MainActivity
static MainActivity reference
public static MainActivity getInstance() {
return reference;
}
將此添加到MainActivity的構造函數中
reference = this
在吐司之后的SmsReceiver中,添加:
MainActivity ma = MainActivity.getInstance()
ma.balance()
不要忘了宣布平衡為公開,否則將不起作用。 我說我無法對其進行測試……可能存在問題,因為我認為BroadcastReceiver在另一個線程內部執行,因此您可能必須在另一個線程上調用它。 不確定是否確實需要這樣做。 如果仍然不能正常運行,請檢查以下鏈接: 從Service類調用活動類方法前兩個答案看起來很有希望
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.