簡體   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