آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

یک سوال درباره interface ها در کاتلین

وحید گروسی  7 سال پیش  7 سال پیش
0 0

با سلام من کلاسی ساختم که وقتی پیامک اومد کار خاصی انجام بده الان میخوام پیامک اومد یک اینترفیسی صدا زده بشه و بتونم داخل MainActivity ازش استفاده کنم
الان میگه متغیر اینترفیس شما مقداردهی نشده NullPointerExeption میده
ممنون میشم بهم کمک کنید

 package project.services

import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.telephony.SmsMessage
import project.room.model.SMSModel
import project.services.SmsReceiver.OnSmsReceived

class SmsReceiver : BroadcastReceiver() {

interface OnSmsReceived {
fun smsReceived(smsModel: SMSModel)
}

private var onSmsReceived: OnSmsReceived? = null
override fun onReceive(context: Context?, intent: Intent?) {
//onSmsReceived = OnSmsReceived ?????????
if (intent!!.action == "android.provider.Telephony.SMS_RECEIVED") {
val bundle = intent.extras //---get the SMS message passed in---
val msgs: Array<SmsMessage?>

val msg_from: String

if (bundle != null) {
//---retrieve the SMS message received---
val pdus = bundle.get("pdus") as Array<*>
msgs = arrayOfNulls(pdus.size)
var smsModel: SMSModel? = null
val smsBuilder = StringBuilder()
for (i in 0 until msgs.size) {
msgs[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
//val msg = msgs[i]!!!!
val msgBody = msgs[i]!!.messageBody
smsModel = SMSModel()
if (msgBody != null && msgBody.isNotEmpty()) {
smsBuilder.append(msgBody)
smsModel.displayMessageBody = msgs[i]!!.displayMessageBody
smsModel.displayOriginatingAddress = msgs[i]!!.displayOriginatingAddress
smsModel.emailBody = msgs[i]!!.emailBody
smsModel.emailFrom = msgs[i]!!.emailFrom
smsModel.indexOnIcc = msgs[i]!!.indexOnIcc
smsModel.messageBody = smsBuilder.toString()
//SmsMessage.MessageClass messageClass = msgs[i]!!.getMessageClass();
//byte[] pdu = msgs[i]!!.getPdu();
smsModel.protocolIdentifier = msgs[i]!!.protocolIdentifier
smsModel.originatingAddress = msgs[i]!!.originatingAddress
smsModel.pseudoSubject = msgs[i]!!.pseudoSubject
smsModel.serviceCenterAddress = msgs[i]!!.serviceCenterAddress
//byte[] userData = msgs[i]!!.getUserData();
smsModel.status = msgs[i]!!.status
smsModel.timestampMillis = msgs[i]!!.timestampMillis
}
}
if (smsModel != null) {
//SMSModel.insertData(smsModel)
//DBHelper.insertSms(smsModel)
onSmsReceived!!.smsReceived(smsModel)
}
}
}
}
}

کد های MainActivity:

class MainActivity : AppCompatActivity(), SmsReceiver.OnSmsReceived {

override fun smsReceived(smsModel: SMSModel) {
//SMSModel.insertData(smsList, smsModel)
//DBHelper.insertSms(compositeDisposable, smsRepository, smsModel)
Toast.makeText(this, "smsReceived called!", Toast.LENGTH_SHORT).show()
}

private var smsList: MutableList<SMSModel> = ArrayList()

//Database
private var compositeDisposable: CompositeDisposable? = null
private var smsRepository: SmsRepository? = null

private var lst: ArrayList<SMSModel> = ArrayList()
private var hasSendSmsPermission: Boolean = false

//adapter
private lateinit var adapter: RecyclerViewAdapter

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
 برای این سوال 1 پاسخ وجود دارد. مشاهده پاسخ صحیح
پاسخ به سوال 
hossein_hr10  7 سال پیش
+2 0

 پاسخ صحیح

شما باید یه تابع بنویسی داخل کلاس SmsReceiver که یه نمونه از اون اینترفیس بدی بهش
مثلا داخل این کلاس اینکار بکنین
companion object {
fun setOnSmsReceived(listener : OnSmsReceived )
{
onSmsReceived = listener
}
}

بعد حالا داخل متد onCreate
SmsReceiver.setOnSmsReceived(this)

0 0
دوستانی که از این کد استفاده می کنند توجه کنند که وقتی اکتیویتی شما بسته باشه با کرش مواجه میشین (7 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .