@ -29,7 +29,7 @@ import com.xuexiang.xutil.app.IntentUtils
import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import java.text.SimpleDateFormat
import java.util. *
import java.util. Locale
@Suppress ( " DEPRECATION " )
class PhoneUtils private constructor ( ) {
@ -43,7 +43,7 @@ class PhoneUtils private constructor() {
val infoList = HashMap < Int , SimInfo > ( )
try {
if ( Build . VERSION . SDK _INT >= Build . VERSION_CODES . LOLLIPOP _MR1 ) {
println ( " 1.版本超过5.1,调用系统方法 " )
Log . d ( TAG , " 1.版本超过5.1,调用系统方法 " )
val mSubscriptionManager = XUtil . getContext ( ) . getSystemService ( Context . TELEPHONY _SUBSCRIPTION _SERVICE ) as SubscriptionManager
ActivityCompat . checkSelfPermission (
XUtil . getContext ( ) , permission . READ _PHONE _STATE
@ -53,18 +53,18 @@ class PhoneUtils private constructor() {
//1.1.1 有使用的卡,就遍历所有卡
for ( subscriptionInfo in activeSubscriptionInfoList ) {
val simInfo = SimInfo ( )
simInfo . mCarrierName = subscriptionInfo . carrierName .toString ( )
simInfo . mIccId = subscriptionInfo . iccId .toString ( )
simInfo . mCarrierName = subscriptionInfo . carrierName ? .toString ( )
simInfo . mIccId = subscriptionInfo . iccId ? .toString ( )
simInfo . mSimSlotIndex = subscriptionInfo . simSlotIndex
simInfo . mNumber = subscriptionInfo . number .toString ( )
simInfo . mCountryIso = subscriptionInfo . countryIso .toString ( )
simInfo . mNumber = subscriptionInfo . number ? .toString ( )
simInfo . mCountryIso = subscriptionInfo . countryIso ? .toString ( )
simInfo . mSubscriptionId = subscriptionInfo . subscriptionId
println ( simInfo . toString ( ) )
Log . d ( TAG , simInfo . toString ( ) )
infoList [ simInfo . mSimSlotIndex ] = simInfo
}
}
} else {
println ( " 2.版本低于5.1的系统,首先调用数据库,看能不能访问到 " )
Log . d ( TAG , " 2.版本低于5.1的系统,首先调用数据库,看能不能访问到 " )
val uri = Uri . parse ( " content://telephony/siminfo " ) //访问raw_contacts表
val resolver : ContentResolver = XUtil . getContext ( ) . contentResolver
val cursor = resolver . query (
@ -81,7 +81,7 @@ class PhoneUtils private constructor() {
simInfo . mNumber = cursor . getString ( cursor . getColumnIndex ( " number " ) )
simInfo . mCountryIso = cursor . getString ( cursor . getColumnIndex ( " mcc " ) )
//val id = cursor.getString(cursor.getColumnIndex("_id"))
println ( simInfo . toString ( ) )
Log . d ( TAG , simInfo . toString ( ) )
infoList [ simInfo . mSimSlotIndex ] = simInfo
} while ( cursor . moveToNext ( ) )
cursor . close ( )
@ -93,7 +93,7 @@ class PhoneUtils private constructor() {
}
//仍然获取不到/只获取到一个->取出备注
/ * if ( infoList . isEmpty ( ) || infoList . size == 1 ) {
println ( " 3.直接取出备注框的数据作为信息 " )
Log . d ( TAG , " 3.直接取出备注框的数据作为信息 " )
//为空,两个卡都没有获取到信息
if ( infoList . isEmpty ( ) ) {
//卡1备注信息不为空
@ -142,7 +142,7 @@ class PhoneUtils private constructor() {
}
}
} * /
Log . e ( TAG , infoList . toString ( ) )
Log . i ( TAG , infoList . toString ( ) )
return infoList
}
@ -169,10 +169,21 @@ class PhoneUtils private constructor() {
@SuppressLint ( " SoonBlockedPrivateApi " , " DiscouragedPrivateApi " )
@RequiresPermission ( permission . SEND _SMS )
fun sendSms ( subId : Int , mobileList : String , message : String ) : String ? {
if ( TextUtils . isEmpty ( mobileList ) || TextUtils . isEmpty ( message ) ) {
Log . e ( TAG , " mobileList or message is empty! " )
return " mobileList or message is empty! "
}
val mobiles = mobileList . replace ( " ; " , " ; " ) . replace ( " , " , " ; " ) . replace ( " , " , " ; " )
Log . d ( TAG , " subId = $subId , mobiles = $mobiles , message = $message " )
val mobileArray = mobiles . split ( " ; " . toRegex ( ) ) . toTypedArray ( )
for ( mobile in mobileArray ) {
Log . d ( TAG , " mobile = $mobile " )
if ( !is ValidPhoneNumber ( mobile ) ) {
Log . e ( TAG , " mobile ( $mobile ) is invalid! " )
continue
}
try {
val sendFlags = if ( Build . VERSION . SDK _INT >= Build . VERSION_CODES . R ) PendingIntent . FLAG _IMMUTABLE else PendingIntent . FLAG _ONE _SHOT
val sendPI = PendingIntent . getBroadcast ( XUtil . getContext ( ) , 0 , Intent ( ) , sendFlags )
@ -559,6 +570,12 @@ class PhoneUtils private constructor() {
}
}
//判断是否是手机号码(宽松判断)
private fun isValidPhoneNumber ( phoneNumber : String ) : Boolean {
val regex = Regex ( " ^ \\ +? \\ d{3,20} $ " )
return regex . matches ( phoneNumber )
}
}
init {