FONESTATENTENTENTRECEIVERまたはPHONESTATELISTENERなしで、BroadCastreCeiverを介して着信コールを聴く
-
14-11-2019 - |
質問
PhonestateIntentReceiverまたはPhonestateListenerを使用せずに、BroadCastreCeiverを拡張することで、着信コールを聴く方法はあります。 また、マニフェストの行動と権限となることを教えてください。
次のようにしてみましたが、着信通話では機能していませんが、発信のために働いています
アプリの唯一の.javaファイルは次のとおりです(アプリは1つの.javaファイルと1つのマニフェストファイルのみ)
package com.crsardar.media.audio;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class IncommingCallReceiverCRS extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.e("Chitta : ", "Its working");
}
}
.
マニフェスト
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.crsardar.media.audio"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<receiver android:name="IncommingCallReceiverCRS" android:enabled="true">
<intent-filter>
<!--action android:name="android.intent.action.NEW_OUTGOING_CALL"/-->
<action android:name="android.intent.action.ANSWER" >
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
</manifest>
. 解決
マニフェストで定義したアクションは正しくありません。これは、呼び出しに応答し、着信コールを監視しないアクションインテントです。
new_outgoing_call ブロードキャスト目的。
action_phone_state_changedは、新しい着信コールがある場合に受信され、回答された、またはハングアップを呼び出します(この意図で受信したエクストラのマニュアルを参照)。
あなたのデバイスに新しい発信通話があるときにnew_outgoing_callを受信します。
許可の場合は、あなたがあなたのマニフェストの正しいことについてそれを得たと思います(私はあなたのアプリケーションの他の何かのためにRecord_Audioの許可が使われていると仮定する)
他のヒント
これは、Androidユニットテスト用のマイデモです。あなたはそれを参照することができます。
public interface ICallVerify {
void onOutgoing(Context context, Intent intent);
void onCallStateChange(Context context, Intent intent);
}
protected void setUpCallVerify(final ICallVerify callVerify) { //listen ingoing and outgoing
final CountDownLatch latch = new CountDownLatch(1);
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) { //state change
Log.i(TAG, "outgoing call...");
callVerify.onOutgoing(context, intent);
} else if (intent.getAction().equals(TelephonyManager.ACTION_PHONE_STATE_CHANGED)){ // state changed
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);
if (state.equals("RINGING")) {
state += " number:" + intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER);
}
Log.i(TAG, "call state changed.... " + state);
callVerify.onCallStateChange(context, intent);
}
}
};
IntentFilter filter = new IntentFilter(TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction(Intent.ACTION_NEW_OUTGOING_CALL);
ContextUtils.getTargetContext().registerReceiver(receiver, filter);
try {
latch.await(5, TimeUnit.MINUTES);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
.
権限を追加することを忘れないで
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission>
. 所属していません StackOverflow