获取我从广播接收器到主要活动中的textview并调用phoneNumber的phoneNumber和messagetext

时间:2019-07-18 21:23:41

标签: android kotlin

我似乎无法从“广播接收器”中获取值到“主活动”中的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上, “点击”或通过编程方式拨打电话号码。

1 个答案:

答案 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 前两个答案看起来很有希望