私は、着信に応答し、いくつかの作業を行ってから通話を終了する必要がある Android アプリを作成しています。グーグル検索の結果、これを達成するための 2 つの異なる方法を見つけることができましたが、どちらも Android の最近のバージョン、特に 4.1 以降の Jelly Bean では機能しません。
I.) 「android.intent.action.PHONE_STATE」のブロードキャスト レシーバーで Java リフレクションを使用して「com.android.internal.telephony.ITelephony」にアクセスします。以下のサンプル コードは、何百もの関連記事で見つけることができます。
public class PhoneCallReceiver extends BroadcastReceiver {
Context context = null;
private static final String TAG = "Phone call";
private ITelephony telephonyService;
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
return;
Log.v(TAG, "Receving....");
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
try {
Log.v(TAG, "Get getTeleService...");
Class c = Class.forName(telephony.getClass().getName());
Method m = c.getDeclaredMethod("getITelephony");
m.setAccessible(true);
telephonyService = (ITelephony) m.invoke(telephony);
telephonyService.silenceRinger();
Log.v(TAG, "Answering Call now...");
telephonyService.answerRingingCall();
Log.v(TAG, "Call answered...");
//telephonyService.endCall();
} catch (Exception e) {
e.printStackTrace();
Log.e(TAG,
"FATAL ERROR: could not connect to telephony subsystem");
Log.e(TAG, "Exception object: " + e);
}
}
}
このコードの問題は、
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
このメソッドが機能するには が必要であり、この権限は Android v 2.3 から「システム アプリのみ」として定義されています。つまり、通常のユーザー アプリは、マニフェスト ファイルでこのアクセス許可を定義できなくなりました。
II.) もう 1 つの方法は、Android が通話に応答するようにするヘッドセット フックのプッシュをシミュレートすることです。これは、以下のコードに示すように「Intent.ACTION_MEDIA_BUTTON」をブロードキャストすることによって行われます。
public class PhoneCallReceiver extends BroadcastReceiver {
Context context = null;
private static final String TAG = "Phone call";
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getAction().equals("android.intent.action.PHONE_STATE"))
return;
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_RINGING)) {
String number = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
Intent answer = new Intent(Intent.ACTION_MEDIA_BUTTON);
answer.putExtra(Intent.EXTRA_KEY_EVENT, new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_HEADSETHOOK));
context.sendOrderedBroadcast(answer, null);
Log.d(TAG, "Answered incoming call from: " + number);
}
return;
}
}
このメソッドは Android 4.1 まで機能し、その後、Android はユーザー アプリを "Intent.ACTION_MEDIA_BUTTON" のブロードキャストから制限しました。
したがって、Android 4.1 以降でこれを実現する方法は現在のところないというのが私の結論です。
他の誰かがこの問題に対する他の解決策または回避策を見つけましたか?