バックグラウンド
電話が応答されてハングしたときに通知を受け取る必要があります。
着信には、付属のTelephonyManager.ACTION_PHONE_STATE_CHANGED
Intentを使用します。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>
質問
それらのアプリはどのように機能しますか? 発信通話に応答したときにどのように通知を受け取るのですか?