Androidでプログラムで通話を終了することは不可能であるという多くの質問があります。同時に、グーグルプレイ市場には多くのダイヤラーアプリがあります。そこでは、通話を有効にしてドロップすることもできます。彼らはどのように機能しますか?
編集:私のアプリはシステムアプリでなければならないことをどこかで読みました。それからそれをシステムにする方法、そしてシステムとユーザーアプリの違いは何ですか?
あなたはシステムアプリである必要はありません。まず、パッケージを作成しますcom.Android.internal.telephony
をプロジェクトに追加し、これを「ITelephony.aidl
":
package com.Android.internal.telephony;
interface ITelephony {
boolean endCall();
void answerRingingCall();
void silenceRinger();
}
それができたら、このコードを使用して通話を終了できます:
TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
Class clazz = Class.forName(telephonyManager.getClass().getName());
Method method = clazz.getDeclaredMethod("getITelephony");
method.setAccessible(true);
ITelephony telephonyService = (ITelephony) method.invoke(telephonyManager);
telephonyService.endCall();
たとえば、これをPhoneStateListener内で使用できます。これを機能させるには、マニフェストにアクセス許可が必要です
<uses-permission Android:name="Android.permission.MODIFY_PHONE_STATE" />
<uses-permission Android:name="Android.permission.CALL_PHONE" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
編集:恐ろしい書式設定についておApび申し上げますが、ここでコードブロックを適切に行う方法はまだわかりません:/
Android P(ベータ2以降)以上では、最終的にendCallの正式なAPIがあります。
https://developer.Android.com/reference/Android/telecom/TelecomManager#endCall()
マニフェストには_ANSWER_PHONE_CALLS
_権限が必要です。
_<uses-permission Android:name="Android.permission.ANSWER_PHONE_CALLS" />
_
許可を得て、APIレベル28以上の場合:
_TelecomManager tm = (TelecomManager) mContext.getSystemService(Context.TELECOM_SERVICE);
if (tm != null) {
boolean success = tm.endCall();
// success == true if call was terminated.
}
_
同時に、TelephonyManager
の下の元のendCall()
メソッドは_MODIFY_PHONE_STATE
_許可によって保護され、許可なしのリフレクションによって非システムアプリから呼び出せなくなりました(そうでない場合は、セキュリティ例外がトリガーされます)。
Androidテレフォニーインターフェースとブロードキャストレシーバーの追加に加えて、インテントを処理するレシーバーのアクションAndroid.intent.action.PHONE_STATE
を含むAndroidマニフェストレシーバーエントリを追加する必要があります。
追加するとコンパイル時エラーが発生します
uses-permission Android:name="Android.permission.MODIFY_PHONE_STATE`
マニフェストファイル内。ただし、これを削除しても、着信コールは自動的に拒否されます。
詳細については。
状況によっては役に立つかもしれません。 InCallService
クラスを使用する潜在的な回避策があります。必要な情報のほとんどはこちらです。 https://developer.Android.com/reference/Android/telecom/InCallService.html#onCallRemoved(Android.telecom.Call)
アプリをデフォルトの電話アプリとして設定し、次のことを確認する必要があります。
_<uses-permission Android:name="Android.permission.CALL_PHONE" />
_
InCallService
を拡張する独自のクラスを実装する場合、呼び出しが開始されると、呼び出しはアプリにバインドされ、onCallAdded()
関数を介して呼び出し情報を取得します。その後、単純にcall.disconnect()
すると、呼び出しは終了します。
SilenceRinger()
は、Android 2.3+バージョンでは機能しません。コメントするだけで、他のコードは正常に機能します。
@headuckの答えに追加するだけです。 API 28の場合、以下も追加する必要があります。
<uses-permission Android:name="Android.permission.READ_CALL_LOG"/>
その後、アクティビティで許可をリクエストします。合計で、これらの権限を要求して機能させました(READ_PHONE_STATE、CALL_PHONE、ANSWER_PHONE_CALLS、READ_CONTACTS、READ_CALL_LOG)
public static boolean isCallActive(Context context){
AudioManager manager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE);
if(manager.getMode()==AudioManager.MODE_IN_CALL || manager.getMode()==AudioManager.MODE_IN_COMMUNICATION){
return true;
}
return false;
}