私はtruecallerアプリに似た何かをしようとしてきました。そこでは、通話が切断された後にアプリが画面を表示することになっています。 manifest
ファイルにAndroid.intent.action.PHONE_STATE
暗黙のブロードキャストを登録することでこれを達成していました。
しかし、アプリをターゲットに変更すると機能しませんAndroid O、 Android Oブロードキャストの制限 のため、別の解決策を見つけようとしていますこのユースケースに。
Androidドキュメント:Job scheduler
で提案されている代替ソリューション、またはservice
をcontext
に登録します。
ジョブスケジューラ:Job scheduler
の最適化のため、コールバックの受信に多少の遅延が発生します。そのため、電話の数分後にアプリの画面が表示され、数秒ごとに新しい通話ログを確認するためのポーリングによってバッテリーの消耗の問題が発生すると、ユーザーエクスペリエンスに影響します。
Javaでコンテキストを使用してサービスを登録します:アプリがアクティブまたは稼働していない場合でも動作を機能させたいです。システムがService
を強制終了した場合、これは機能しません。
フォアグラウンドサービスの登録:これには、ユーザーに常に通知を表示する必要があります。これは、ユーザーにスパムを送信し、サービスを実行します24/7は多くのリソースを消費するため、ブロードキャスト制限の目的全体が無効になります。
ユーザーエクスペリエンスが変わらないように、別の解決策を提案してください。
前もって感謝します
Android OからPHONE_STATEを読み取る適切な解決策がないため、私たちが選択できる最善の方法は、 コンテンツプロバイダー 。これにより、通話終了後に画面を表示する動作が維持されます(数秒の遅延あり)。
注:欠点は、通話の状態(Ringingやoff_the_hookなど)を取得できないことです。コールバックは、新しいコールログがシステムDBに追加された後にのみ受信されます。
最終的に、アクションが「暗黙のブロードキャスト例外」リストに追加されたため、マニフェストにACTION_PHONE_STATE_CHANGED
を追加すると、次のように機能します。
https://developer.Android.com/guide/components/broadcast-exceptions
ACTION_CARRIER_CONFIG_CHANGED、TelephonyIntents.ACTION _ * _ SUBSCRIPTION_CHANGED、 "TelephonyIntents.SECRET_CODE_ACTION"、ACTION_PHONE_STATE_CHANGED、ACTION_PHONE_ACCOUNT_REGISTERED、ACTION_PHONE_ACCOUNT_UNREGISTERED
OEMテレフォニーアプリは、これらのブロードキャストを受信する必要がある場合があります。
解決策は1つだけです。フォアグラウンドサービスを使用し、ブロードキャストレシーバーをサービスに登録します。
ACTION_NEW_OUTGOING_CALL
には ブロードキャスト例外 があるようですが、着信コール(またはコール終了時)にはありません。発信用に1つあるが、着信用にはないのはバグのようです。 バグレポート グーグル課題追跡システムに提出されました。うまくいけば、彼らの答えは私たちが何をすべきかを明らかにするでしょう。
バグトラッカーが更新された場合は、この回答を更新します。
ここで述べたように: https://issuetracker.google.com/37273064#comment4 、ACTION_PHONE_STATE_CHANGED(Android.intent.action.PHONE_STATE)はAndroid Oリリース。将来のリリースで別のメカニズムに置き換えられる可能性がありますが。
私と私の本番アプリの場合、解決策は、より良い回避策/ apiが表示されるまで、api 25以降をターゲットにしないことです。
アプリがレベル24以下をターゲットにしている場合、新しい Implicit Broadcast Limitations の影響を受けず、アプリが実行されていなくても、アプリはPHONE_STATEブロードキャストを聞くことができます。
下位のAPIを対象とするアプリは、新しいAndroidバージョンで通常どおりダウンロードおよびインストールできます。sdkTarget値を更新する唯一の理由は、アプリで新しいAPIを使用する必要がある場合です。