728x90
반응형
SMALL
전화 수신 감지 및 전화온 전화번호를 감지하는 코드이다.
브로드캐스트 리시버와, TelephonyManager 객체를 이용한다.
TelephonyManager 에서 PhoneStateListener 객체를 listen api에 달아주면 전화 상태를 감지할 수 있는데,
전화옴, 전화받음, 통화 종료 등 통화 관련한 상태 감지가 된다.
추가로, 저장된 전화번호인 경우 저장된 이름을 가져오는 코드도 추가하였다.
참고로, 안드로이드에서는 주요 요소들을 내부적으로 DB로 관리하는데, 전화번호도 내부 DB에 들어있고
그리하여 Cursor를 이용해서 가져와야된다고 한다.
자원 낭비를 막아야하기 때문에 cursor.close()는 잊지 말것!
public BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
switch (action) {
case BluetoothAdapter.ACTION_STATE_CHANGED:
//Do something
break;
case TelephonyManager.ACTION_PHONE_STATE_CHANGED:
TelephonyManager telManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
telManager.listen(new PhoneStateListener() {
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
Log.e("test", "calling 전화번호 : " + incomingNumber);
//전화번호부를 긁어와서
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(incomingNumber));
String[] projection = new String[]{ContactsContract.PhoneLookup.DISPLAY_NAME};
String displayName = "";
Cursor cursor = mContext.getContentResolver().query(uri, projection, null, null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
//이름이 있으면 찾고
displayName = cursor.getString(0);
}
}
cursor.close();
Log.e("test", "전화번호부에 저장된 이름 : " + displayName);
} else if (state == TelephonyManager.CALL_STATE_OFFHOOK) {
Log.e("test", "전화 받음 상태");
} else if (state == TelephonyManager.CALL_STATE_IDLE) {
Log.e("test", "통화 종료 상태");
}
}, PhoneStateListener.LISTEN_CALL_STATE);
break;
}
}
728x90
반응형
LIST
'Android' 카테고리의 다른 글
Android 진동 울리기 (0) | 2020.11.20 |
---|---|
안드로이드 전화 걸기 예제 (0) | 2020.11.20 |
Android advertising 데이터 수신 (0) | 2020.11.20 |
안드로이드 전화번호 가져오기 (0) | 2020.11.06 |
Unable to execute dex: Multiple dex files define Landroid/UnusedStub; (0) | 2020.11.05 |