package com.example.firstapp.receiver
|
|
import android.content.BroadcastReceiver
|
import android.content.Context
|
import android.content.Intent
|
import android.os.Build
|
import android.os.Bundle
|
import android.provider.Telephony
|
import android.telephony.SmsMessage
|
import android.util.Log
|
import androidx.annotation.RequiresApi
|
import com.example.firstapp.core.Core
|
import com.example.firstapp.database.entity.Code
|
import com.example.firstapp.database.entity.Msg
|
import com.example.firstapp.database.service.RetrofitClient
|
import com.example.firstapp.database.service.RetrofitModelClient
|
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.launch
|
import java.text.SimpleDateFormat
|
import java.time.LocalDateTime
|
import java.time.ZoneId
|
import java.util.Date
|
import java.util.Locale
|
|
|
class SmsReceiver : BroadcastReceiver() {
|
|
// 安全防护关键词数组
|
private var securityKeywordsList = emptyList<String>()
|
|
@RequiresApi(Build.VERSION_CODES.O)
|
override fun onReceive(context: Context, intent: Intent) {
|
if (Telephony.Sms.Intents.SMS_RECEIVED_ACTION == intent.action) {
|
val bundle: Bundle? = intent.extras
|
bundle?.let {
|
val pdus = it.get("pdus") as Array<*>
|
val messages = arrayOfNulls<SmsMessage>(pdus.size)
|
val messageBody = StringBuilder()
|
|
for (i in pdus.indices) {
|
messages[i] = SmsMessage.createFromPdu(pdus[i] as ByteArray)
|
messageBody.append(messages[i]?.messageBody)
|
}
|
|
// 保存原始短信
|
val msg = Msg(0, "1111", "111111", messageBody.toString(), 1, "111", 1, 1)
|
val msgId = Core.msg.insert(msg)
|
|
// 这里需要查看消息是否含有securityKeywordsList这个列表中的关键词,如果含有,则不进行下一步操作
|
if (securityKeywordsList.any { it in messageBody.toString() }) {
|
Log.d("SmsReceiver", "含有禁用关键词,${it}")
|
return
|
}
|
|
Log.d("SmsReceiver", "运行到正则匹配")
|
|
// 调用API处理短信
|
CoroutineScope(Dispatchers.IO).launch {
|
try {
|
val response =
|
RetrofitModelClient.modelService.processSms(mapOf("content" to messageBody.toString()))
|
|
if (response.status == "success") {
|
// 获取当前时间
|
val currentTime = LocalDateTime.now()
|
val date =
|
Date.from(currentTime.atZone(ZoneId.systemDefault()).toInstant())
|
val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault())
|
val createtime = sdf.format(date)
|
|
// 根据不同类型处理数据
|
when (response.data.category) {
|
"快递" -> {
|
val code = Code(
|
id = 0,
|
category = response.data.category,
|
categoryId = 1, // 1-快递类型
|
typeId = 1, //暂时没有根据type分类
|
ruleId = 1, //1-快递类型
|
msgId = msgId,
|
createTime = createtime,
|
oneLevel = response.data.details.post ?: "",
|
secondLevel = response.data.details.company ?: "",
|
code = response.data.details.pickupCode ?: "",
|
pickup = 0, // 0-未取件,1-已取件
|
pickupTime = "", // 取件时间为空
|
overTime = "", // 超时时间为空,暂时没有这块处理逻辑
|
address = response.data.details.address ?: "",
|
remarks = response.data.details.time ?: "",
|
)
|
if(code.oneLevel!="" && code.secondLevel!="" && code.code!="") {
|
Core.code.insert(code)
|
}
|
}
|
|
"还款" -> {
|
val code = Code(
|
id = 0,
|
category = response.data.category,
|
categoryId = 2, // 2-还款类型
|
typeId = 1, //暂时没有根据type分类
|
ruleId = 2, //1-还款类型
|
msgId = msgId,
|
createTime = createtime,
|
oneLevel = response.data.details.type ?: "",
|
secondLevel = response.data.details.bank ?: "",
|
code = response.data.details.amount ?: "",
|
pickup = 0, // 0-未取件,1-已取件
|
pickupTime = "", // 取件时间为空
|
overTime = response.data.details.date
|
?: "", // 超时时间为空,暂时没有这块处理逻辑
|
address = response.data.details.address ?: "",
|
remarks = "最小还款金额" + response.data.details.min_amount + "还款卡号" + response.data.details.number
|
?: "",
|
)
|
if(code.oneLevel!="" && code.secondLevel!="" && code.code!="") {
|
Core.code.insert(code)
|
}
|
}
|
|
"收入" -> {
|
val code = Code(
|
id = 0,
|
category = response.data.category,
|
categoryId = 3, // 3-收入类型
|
typeId = 1, //暂时没有根据type分类
|
ruleId = 2, //1-还款类型
|
msgId = msgId,
|
createTime = createtime,
|
oneLevel = response.data.details.bank ?: "",
|
secondLevel = response.data.details.bank ?: "",
|
code = response.data.details.amount ?: "",
|
pickup = 0, // 0-未取件,1-已取件
|
pickupTime = "", // 取件时间为空
|
overTime = response.data.details.datetime
|
?: "", // 超时时间为空,暂时没有这块处理逻辑
|
address = response.data.details.address ?: "",
|
remarks = "余额" + response.data.details.balance ?: "",
|
)
|
if(code.oneLevel!="" && code.secondLevel!="" && code.code!="") {
|
Core.code.insert(code)
|
}
|
}
|
}
|
|
// 发送广播通知数据已更新
|
val updateIntent = Intent("com.example.firstapp.DATA_UPDATED")
|
context.sendBroadcast(updateIntent)
|
Log.d("SMS_DEBUG", "新短信已保存到数据库")
|
}
|
} catch (e: Exception) {
|
Log.e("SmsReceiver", "Error processing SMS", e)
|
}
|
}
|
}
|
}
|
}
|
}
|