0

我正在编写一个 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

为什么会这样,我该如何解决?

4

1 回答 1

0

将两个动作合二为一intent-filter

<receiver android:name=".PhoneStateReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE" />
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
</receiver>
于 2019-09-10T22:40:48.960 回答