2010년 4월 29일 목요일

BlueWatch Project #1



Bluetooth Watch 연동 프로그램을 만들려면 먼저 폰에 언제 전화가 오거나 문자메시지를 받았는지 알 수 있어야만 한다. 안드로이드는 이벤트가 발생하면 해당 intent를 브로드캐스트 해 주기 때문에 BroadcastReceiver를 설정해주면 원하는 인텐트를 수신할 수 있게 된다.

        // TelephonyManager for receiving phone state change
        // (IDLE, OFFHOOK, RINGING)

        MyPhoneStateListener phoneListener=new MyPhoneStateListener();
        TelephonyManager telephony = (TelephonyManager)
        getSystemService(Context.TELEPHONY_SERVICE);
        telephony.listen(phoneListener,PhoneStateListener.LISTEN_CALL_STATE);

전화상태 변경(OFFHOOK, IDLE, RINGING)에 대한 브로드캐스트를 받는 리시버를 설정해주는 코드로 여기서 지정해 준 callback 함수인 phoneListener가 전화기의 상태가 변경될 때 마다 호출된다. 
               
        // BroadcastReceiver for SMS
        BroadcastReceiver rcvIncoming = new BroadcastReceiver() {
            public void onReceive(Context context, Intent intent) {
            Log.i("NAUTES", "SMS received");
            Bundle data=intent.getExtras();
                if (data!=null) {
                    Object pdus[] = (Object[])data.get("pdus");
                    String message = "New message:\n";
                    String sender = null;
                    for (Object pdu:pdus) {
                        SmsMessage part=SmsMessage.createFromPdu((byte[])pdu);
                        message += part.getDisplayMessageBody();
                        if (sender==null) {
                            sender = part.getDisplayOriginatingAddress();
                        }
                    }
                    Log.i("NAUTES", "From: " + sender);
                    Log.i("NAUTES", "Message: " + message);
                    // Do something using received message
                }
            }
        };
        registerReceiver(rcvIncoming, new IntentFilter("android.provider.Telephony.SMS_RECEIVED"));

rcvIncoming은 SMS가 수신되었다는 브로드캐스트를 받는 리시버로 문자메시지가 수신될 때 마다 호출된다.

위의 코드를 사용혀려면 AndroidManifest.xml파일에

<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>

가 추가되어 있어야만 한다.

--
MyPhoneStateListener의 코드는 다음과 같다. 호출되는 경우 파라미터로 state에 변경된 상태, incomingNumber에 발신자 번호가 들어있다.

public class MyPhoneStateListener extends PhoneStateListener {
      public void onCallStateChanged(int state,String incomingNumber){
      switch(state){
        case TelephonyManager.CALL_STATE_IDLE:
        break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            Log.i("NAUTES", "OFFHOOK");
        break;
        case TelephonyManager.CALL_STATE_RINGING:
            Log.i("NAUTES", "RINGING from " + incomingNumber);
        break;
        }
      }
}