繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM