Как получить уведомление при ответе на исходящий телефонный звонок?
Фон
Мне нужно получить уведомление, когда на телефонный звонок ответили и повесили.
Для входящего звонка я использую TelephonyManager.ACTION_PHONE_STATE_CHANGED
Намерение с TelephonyManager.EXTRA_STATE
это идет с этим.
Эта проблема
Для исходящих звонков вы получаете обратный вызов TelephonyManager.ACTION_PHONE_STATE_CHANGED
сразу после начала набора, но не тогда, когда на звонок ответили.
Я искал по Интернету, и все утверждают, что это невозможно сделать.
Тем не менее, я заметил, что некоторым приложениям для записи звонков (таким как " Boldbeast рекордер") удалось преодолеть это и каким-то образом определить момент ответа на звонок.
Что я пробовал
Я попытался зарегистрировать ContentObserver для журналов вызовов, но это не помогло, потому что он получает обратный вызов только после завершения вызова.
Для проверки проблемы вот код, с которым я играл:
MainActivity.kt
class MainActivity : AppCompatActivity() {
companion object {
private val REQUEST_CODE = 0
@JvmStatic
fun getAppDeclaredPermissions(context: Context): Array<out String>? {
val pm = context.packageManager
try {
val packageInfo = pm.getPackageInfo(context.packageName, PackageManager.GET_PERMISSIONS)
return packageInfo.requestedPermissions ?: return null
} catch (ignored: PackageManager.NameNotFoundException) {
}
throw RuntimeException("cannot find current app?!")
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val permissionsToRequest = getAppDeclaredPermissions(this)
requestPermissions(permissionsToRequest, 0)
}
}
}
PhoneBroadcastReceiver.kt
class PhoneBroadcastReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
val state = intent.getStringExtra(TelephonyManager.EXTRA_STATE)
val incomingNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER)
Log.d("AppLog", "PhoneBroadcastReceiver $action $state $incomingNumber")
}
}
манифест
<manifest package="com.example.user.myapplication" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.READ_CALL_LOG"/>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<application
android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<receiver android:name=".PhoneBroadcastReceiver">
<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>
</application>
</manifest>
Вопросы
Как работают эти приложения? Как они получают уведомление при ответе на исходящий звонок?