بروز خطا
[message]
اشتراک در سوال
رای ها
[dataList]
یک سوال درباره interface ها در کاتلین
با سلام من کلاسی ساختم که وقتی پیامک اومد کار خاصی انجام بده الان میخوام پیامک اومد یک اینترفیسی صدا زده بشه و بتونم داخل 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
}
}
بعد حالا داخل متد onCreateSmsReceiver.setOnSmsReceived(this)
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .