我正在编写一个 Android 应用程序(kotlin),它记录来电和去电(有关电话号码和日期的信息)。到目前为止,我可以从来电中获取电话号码,但无法从去电中获取。
我查看了教程,所有教程都建议我检查意图操作,然后获取我要拨打的号码。
在清单文件中,我添加了权限和接收者
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<receiver android:name=".PhoneStateReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
在 PhoneStateReceiver 我正在尝试获取电话号码
class PhoneStateReceiver : BroadcastReceiver() {
private val TAG = "PhoneStateReceiver"
private var lastState = TelephonyManager.CALL_STATE_IDLE
override fun onReceive(context: Context?, intent: Intent?) {
checkCall(intent)
}
private fun checkCall(intent: Intent?) {
val state = intent?.getStringExtra(TelephonyManager.EXTRA_STATE)
if (intent?.action.equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
var number = intent?.getStringExtra(Intent.EXTRA_PHONE_NUMBER)
Log.d(TAG, "Outgoing number : $number")
}else {
if (lastState == TelephonyManager.CALL_STATE_IDLE) {
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
val number = intent?.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)
Log.d(TAG, "Incoming number : $number")
}
}
}
Log.d(TAG, state)
lastState = intState(state)
}
在 MainActivity 我只要求权限:
class MainActivity : AppCompatActivity() {
private var PERMISSION_ALL = 1
private var PERMISSIONS = arrayOf(
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.PROCESS_OUTGOING_CALLS
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if(!hasPermissions(this, Manifest.permission.READ_PHONE_STATE, Manifest.permission.PROCESS_OUTGOING_CALLS)){
ActivityCompat.requestPermissions(this, PERMISSIONS, PERMISSION_ALL);
}
}
private fun hasPermissions(context: Context, vararg permissions: String): Boolean = permissions.all {
ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}
}
拨打电话时的操作应该是 Intent.ACTION_NEW_OUTGOING_CALL 但是,当我拨打电话时,此操作似乎是 Intent.PHONE_STATE
为什么会这样,我该如何解决?