phonestateIntentReceiver 또는 phonestateListener가없는 브로드 카스 테스트 리버를 통해 들어오는 호출을 듣습니다.
-
14-11-2019 - |
문제
는 PHONESTATEINTENTRECEIVER 또는 PHOSESTATATELISTENER 또는 PHOSESTATEListener를 사용하지 않고 BroadCastReceiver를 확장하여 OS의 방송을 청취함으로써 들어오는 호출을 청취 할 수있는 방법이 있습니다. 또한 명시 적으로 행동과 권한이 있는지 말해주십시오.
나는 다음과 같이 시도했지만 들어오는 호출을 위해 작동하지 않고 나가는 에 일하고있다.
앱의 유일한 단 하나의 .java 파일은 다음과 같습니다 (앱 하나만의 .java 파일 및 하나의 매니페스트 파일)
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>
. 해결책
귀하의 매니페스트에서 정의한 조치가 잘못되었습니다.이것은 호출에 응답하는 데 사용할 수 있고 들어오는 호출을 모니터링하지 않는 작업 의도입니다.
action_phone_state_changed 및 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>
.