일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 시스템
- JVM
- oracle
- 유닉스
- 자바네트워크
- 웹 크롤링
- GIT
- NIO
- 역학
- 리눅스
- Spring boot
- 파이썬
- 인프라
- 자바
- write by chatGPT
- GPT-4's answer
- write by GPT-4
- 소프트웨어공학
- flet
- Database
- chatGPT's answer
- python
- 코틀린
- 자바암호
- Java
- kotlin
- 고전역학
- 뉴턴역학
- lombok
- android
- Today
- Total
Akashic Records
Android BroadcastReceiver을 이용한 전화 수신 Event Catch 본문
Android BroadcastReceiver을 이용한 전화 수신 Event Catch
Andrew's Akashic Records 2018. 4. 19. 14:32이번에는 Android Phone에서 전화 수신 Event을 받아서 특정 Activity를 실행시키는 방법을 살펴보도록 하겠습니다.
Step 1: Receiver Code, Callback Method onReceive
Phone 전화의 상태가 변경될때 Event을 수신하게 됩니다. onReceive Method가 자동 Callback되며 전화 상태를 정확히 파악하기 위해서는 PhoneStateListener를 등록해야 합니다.
public class ServiceReceiver extends BroadcastReceiver {
...
@Override
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "ServiceReceiver->onReceive();");
MyPhoneStateListener phoneListener = new MyPhoneStateListener();
TelephonyManager telephony = (TelephonyManager)
context.getSystemService(Context.TELEPHONY_SERVICE);
telephony.listen(phoneListener, PhoneStateListener.LISTEN_SERVICE_STATE);
telephony.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE);
Intent testActivityIntent = new Intent(context,CallCatcherActivity.class);
testActivityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
testActivityIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
context.startActivity(testActivityIntent);
}
Intent를 사용할때는 Method 파라미터로 전달된 intent를 사용하지 말고 새로 선언해서 사용합니다.
그리고 Intent 옵션에 “Intent.FLAG_ACTIVITY_NEW_TASK”를 꼭 포함하여야지 오류가 발생하지 않습니다.
Step 2: PhoneStateListener Code, Callback Method onCallSateChanged
Receiver Code에서 등록되는 Evednt Listener입니다. 전화통화 상태가 변경될 때 호출되는 Callback Method입니다.
public class MyPhoneStateListener extends PhoneStateListener
...
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_IDLE:
Log.i(TAG,
"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_IDLE "
+ incomingNumber);
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
Log.i(TAG,
"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_OFFHOOK "
+ incomingNumber);
break;
case TelephonyManager.CALL_STATE_RINGING:
Log.i(TAG,
"MyPhoneStateListener->onCallStateChanged() -> CALL_STATE_RINGING "
+ incomingNumber);
break;
default:
Log.i(TAG,
"MyPhoneStateListener->onCallStateChanged() -> default -> "
+ Integer.toString(state));
break;
}
}
Step 3: PhoneStateListener Code, Callback Method onServiceStateChanged
전화 서비스 상태가 변경될때 호출되는 Callback Method 입니다.
@Override
public void onServiceStateChanged(ServiceState serviceState) {
switch (serviceState.getState()) {
case ServiceState.STATE_IN_SERVICE:
Log.i(TAG,
"MyPhoneStateListener->onServiceStateChanged() -> STATE_IN_SERVICE");
serviceState.setState(ServiceState.STATE_IN_SERVICE);
break;
case ServiceState.STATE_OUT_OF_SERVICE:
Log.i(TAG,
"MyPhoneStateListener->onServiceStateChanged() -> STATE_OUT_OF_SERVICE");
serviceState.setState(ServiceState.STATE_OUT_OF_SERVICE);
break;
case ServiceState.STATE_EMERGENCY_ONLY:
Log.i(TAG,
"MyPhoneStateListener->onServiceStateChanged() -> STATE_EMERGENCY_ONLY");
serviceState.setState(ServiceState.STATE_EMERGENCY_ONLY);
break;
case ServiceState.STATE_POWER_OFF:
Log.i(TAG,
"MyPhoneStateListener->onServiceStateChanged() -> STATE_POWER_OFF");
serviceState.setState(ServiceState.STATE_POWER_OFF);
break;
default:
Log.i(TAG,
"MyPhoneStateListener->onServiceStateChanged() -> default -> "
+ Integer.toString(serviceState.getState()));
break;
}
}
Step 4: 아주 간단한 Activity
onReceiver Method에서 Activity를 정상 실행하는지 확인 할수 있는 간단한 UI가 포함된 Activity를 만들어줍니다. 저는 그냥 기본생성된것을 사용하였습니다...
Step 5: Android Manifest에 Receiver 등록
<receiver android:name=".ServiceReceiver">
<intent-filter>
<action android:name="android.intent.action.PHONE_STATE" />
</intent-filter>
</receiver>
Step 6: Android Manifest에 Permission 등록
전화기 상태를 접근하기 위해서는 아래 권한이 포함되어 있어야 합니다.
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Step 7: Test
AVD Emulator를 2개 띄우고 한쪽에 다른 한쪽으로 전화를 걸어봅니다. 전화번호는 어떻게 알까요? Emulator 좌측 상단에 “5554”,”5556”와 같은 숫자가 전화 번호 입니다.
전화를 거시면 본 예제”CallCatcher”가 실행되고 Android 기본 전화 Activity가 실행되면서 “CallCatcher”는 Background로 실행됩니다.
전화를 받게 되면 CallCatcher는 Foreground로 실행됩니다.
'오래된글 > Articles' 카테고리의 다른 글
VM 분석 : Chapter 1 Performance - 1 (0) | 2018.04.19 |
---|---|
Servlet 3.0 Async Processing for Tenfold Increase in Server Throughput (0) | 2018.04.19 |
Android Notifications (0) | 2018.04.19 |
Android Service Component(Start/Stop type) (0) | 2018.04.19 |
Java Generic Quick Tutorial (0) | 2018.04.19 |