我似乎无法从“广播接收器”中获取值到“主活动”中的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 Message:$ messageText”,Toast.LENGTH_LONG).show()'之后添加一些代码,以将值phoneNumber和textmessage分别放置到TextViews txtPhone和txtSMS上, “点击”或通过编程方式拨打电话号码。
答案 0 :(得分:0)
我无法提供有效的代码,因为我既没有安装Android也没有安装Kotlin。 基本上,您应该遵循这种方法。观察者模式是一个广泛使用的概念。也许是达到所需目标的最干净的方法: Communication between BroadcastReceiver and 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在另一个线程内部执行,因此您可能必须在另一个线程上调用它。不确定是否确实需要这样做。 如果效果不佳,请检查以下链接: Calling activity class method from Service class 前两个答案看起来很有希望