I’m writing an APP in Kotlin for testing mobile networks.
The APP must be able to log received calls and SMSs.
I defined the Broadcast Receiver in MainActivity, and it seems to work with calls but not with SMS.
Besides, in the onReceive I’m trying to get the location of the mobile phone, but it doesn’t work.
What is missing?
MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
private lateinit var managePermissions: ManagePermissions
private lateinit var smsCallReceiver: BroadcastReceiver
@SuppressLint("MissingPermission")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val svm = ViewModelProvider(this)[SharedViewModel::class.java] //
// ---------- ASK FOR PERMISSIONS NEEDED BY THE APP
val list = listOf(
android.Manifest.permission.ACCESS_COARSE_LOCATION,
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.INTERNET,
android.Manifest.permission.SEND_SMS,
android.Manifest.permission.RECEIVE_SMS,
android.Manifest.permission.BROADCAST_SMS,
android.Manifest.permission.READ_PHONE_STATE,
android.Manifest.permission.READ_BASIC_PHONE_STATE,
android.Manifest.permission.CALL_PHONE ,
android.Manifest.permission.READ_CALL_LOG
)
managePermissions = ManagePermissions(this,list,1)
managePermissions.checkPermissions()
// ------------ START LISTENING FOR SMS AND CALL RECEIVED
smsCallReceiver = SMSCallReceiver(this,svm)
var intentFilter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
intentFilter.addAction("android.intent.action.PHONE_STATE")
intentFilter.addCategory("android.intent.category.DEFAULT")
ContextCompat.registerReceiver(this, smsCallReceiver, intentFilter, ContextCompat.RECEIVER_NOT_EXPORTED)
// ------------- BINDING AND NAVIGATION BAR
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val navView: BottomNavigationView = binding.navView
val navController = findNavController(R.id.nav_host_fragment_activity_main)
val appBarConfiguration = AppBarConfiguration(
setOf(
R.id.navigation_home, R.id.navigation_dashboard, R.id.navigation_notifications
)
)
// ---------- SETUP NAVIGATION CONTROLLER
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
}
override fun onDestroy() {
super.onDestroy()
unregisterReceiver(smsCallReceiver)
}
}
Broadcast Receiver class
class SMSCallReceiver(private val act: Activity, private val svm:SharedViewModel): BroadcastReceiver() {
private lateinit var context: Context
private lateinit var fusedLocationProviderClient: FusedLocationProviderClient
private var lat = ""
private var long = ""
@SuppressLint("MissingPermission")
override fun onReceive(context: Context?, intent: Intent?) {
this.context = context!!
val fileMgmt = FileManagement(context)
val opName = svm.registeredNet
val lm = act.getSystemService(Activity.LOCATION_SERVICE) as LocationManager
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(act)
val task = fusedLocationProviderClient.lastLocation
task.addOnSuccessListener {
if (it != null){
lat = "${it.latitude}" // it.longitude is a Double
long = "${it.longitude}" // tvLongitude is a TextView
}
}
if (intent?.action.equals("android.intent.action.PHONE_STATE")) {
val state = intent?.getStringExtra(TelephonyManager.EXTRA_STATE)
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
val phoneNumber = intent?.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)
Log.i(TAG, "Incoming call from: $phoneNumber")
if (phoneNumber!=null)
fileMgmt.writeLogFile(
LocalDateTime.now().toString()+", $opName, Call Received from $phoneNumber, $lat, $long")
} else if (state.equals(TelephonyManager.EXTRA_STATE_IDLE)) {
Log.i(TAG, "Call ended")
}
} else if (intent?.action.equals("android.provider.Telephony.SMS_RECEIVED")) {
val smsMessages =
Telephony.Sms.Intents.getMessagesFromIntent(intent)
val phoneNumber = smsMessages[0].displayOriginatingAddress
fileMgmt.writeLogFile(
LocalDateTime.now().toString()+", $opName, SMS Received from $phoneNumber, $lat, $long")
}
}
}
Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-feature
android:name="android.hardware.telephony"
android:required="false" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.READ_BASIC_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<application
android:usesCleartextTraffic="true"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.RoamingQoSAPP"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:screenOrientation="portrait">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>