通話中かどうか知りたいです。
通話中の場合は、サービスを開始します (サービス部分はクリアです)。どうすればいいですか?
通話中にサービスに電話する必要があります...どうすればよいかわかりませんか? 何か助けはありますか?
通話中かどうか知りたいです。
通話中の場合は、サービスを開始します (サービス部分はクリアです)。どうすればいいですか?
通話中にサービスに電話する必要があります...どうすればよいかわかりませんか? 何か助けはありますか?
放送受信機が必要です...
マニフェストでブロードキャストレシーバーを宣言します...
<receiver android:name=".PhoneStateBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE"/>
</intent-filter>
</receiver>
また、uses-permission を宣言します ...
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
ブロードキャスト レシーバー クラス ...
package x.y;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class PhoneStateBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.listen(new CustomPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE);
}
}
そして、電話状態リスナーをカスタマイズするための1つのクラス...
package x.y;
import android.content.Context;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
public class CustomPhoneStateListener extends PhoneStateListener {
//private static final String TAG = "PhoneStateChanged";
Context context; //Context to make Toast if required
public CustomPhoneStateListener(Context context) {
super();
this.context = context;
}
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
//when Idle i.e no call
Toast.makeText(context, "Phone state Idle", Toast.LENGTH_LONG).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
//when Off hook i.e in call
//Make intent and start your service here
Toast.makeText(context, "Phone state Off hook", Toast.LENGTH_LONG).show();
break;
case TelephonyManager.CALL_STATE_RINGING:
//when Ringing
Toast.makeText(context, "Phone state Ringing", Toast.LENGTH_LONG).show();
break;
default:
break;
}
}
}
TelephonyManager.getCallState()
のいずれかを返します
CALL_STATE_IDLE
CALL_STATE_OFFHOOK
CALL_STATE_RINGING
これが要件に適合する場合、Pied Piper のより包括的なソリューションよりもはるかに少ないコードです。
電話が来ていることを知ることはできますが、これを変更することはできません。:( なぜ2.3バージョンのアンドロイドがandroid.permission.MODIFY_PHONE_STATEを持っていないのか、これを見てください。そして、これに対する解決策は何ですか?
これは古い質問です。間違いありません。しかし、それは Google の最初の結果として表示されます。したがって、別の便利な方法を追加することにしました。
電話の状態が変更されると、システムはTelephonyManager.ACTION_PHONE_STATE_CHANGED
ブロードキャストを送信します。このブロードキャストには、 を使用して抽出できる追加の状態がありますTelephonyManager.EXTRA_STATE
。
余分な状態には、次の 3 つの選択肢があります。
EXTRA_STATE_IDLE
EXTRA_STATE_OFFHOOK
EXTRA_STATE_RINGING
これらすべてを処理する放送受信機を設計できます。
public class PhoneStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
if (intent.getAction().equals(TelephonyManager.ACTION_CALL_STATE_CHANGED){
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals(TelephonyManager.EXTRA_STATE_IDLE){
// No call currently active.
} else if (state.equals(TelephonyManager.EXTRA_STATE_RINGING){
// A call is ringing
} else if (state.equals(TelephonyManager.EXTRA_STATE_OFFHOOK){
// Call has been answered.
}
}
}
}
詳細については、こちらをご覧ください。
注:ブロードキャスト レシーバーはバックグラウンドでトリガーされます。Android O+ の時点では、バックグラウンド プロセスからバックグラウンド サービスを開始することはできません。でフォアグラウンド サービスを開始することを検討してくださいcontext.startForegroundService(intent)
。サービスのonStartCommand(...)
で、 を呼び出しますstartForeground(...)
。それ以外の場合、システムは致命的な例外を発生させます。context.startService(intent)
ただし、Android O 以下では、代わりに安全に使用できますstartForegroundService(...)
。