본문 바로가기

아옳옳의 코딩공부/아옳옳의 안드로이드스튜디오

2021-03-23안드로이드 스튜디오(브로드캐스트)

반응형

브로드캐스트 .... 넘나 어렵게만 느껴 지는데 .. 

글로만 봤을땐 외부에서 들어오는 신호를 수신하는것! 혹은 송신하는것 

카톡에서 여러 사람들에게 메시지를 전달할 때 그룹 채팅으로 메시지 보내는것 

안드로이드도 여러 앱 구성요소에 메시지를 전달할 때 브로드캐스팅을 사용함 

 

브로드캐스트 수신자는 onReceive()메소드를 정의해야된다 왜냐 이 메소드는 원하는 브로드캐스트 메시지가 도착하면 자동으로 호출 된다. 그런데 시스템의 모든 메시지를 받을수 없기에 인텐트 필터를 사용해 걸러줘야한다 ( 모든 메시지는 인텐트안에 전달 되기 때문) 

 

일단 브로드캐스트리시버를 만들고나면 다음 코드처럼 태그가 추가 되는데 그 추가에 액션값을 넣어준다

<receiver
            android:name=".SmsReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEVED"/>
            </intent-filter>

name속성에 수신자 이름 지정하고  intent-filter에 액션정보 넣어준다 

(이 액션값으로 걸러주겠다 )

단말기에서 sms를 수신했을 때 이 action(android.provider.Telephony.SMS_RECEVED)정보가 들어간 인텐트를 전달하므로 이값을 넣어주면 sms를 받아 볼수 있다. 

 

public class SmsReceiver extends BroadcastReceiver {

    private static final String TAG = "SmsReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "onreceive 호출됨 ");

        //1. 전달된 인텐트안을 보면 번들객체가 들어있음
        //인텐트에서 번들 객체 가져오기 
        Bundle bundle = intent.getExtras(); 
        //이 번들속엔 엑스트라 데이터 / 부가데이터가 들어있음

        //부가데이터 열어주기 ( parseSmsMassage메서드 호출 ) 
        SmsMessage[] messages = parseSmsMassage(bundle);
        
        if(messages != null && messages.length > 0){
           String sender =  messages[0].getOriginatingAddress();
            String contents =  messages[0].getMessageBody();

            Log.d(TAG, "sender : " + sender + "contets : " + contents );
        }

    }

sms를 받으면 onReceive메서드가 자동으로 호출되고 파라미터로 전달되는 Intent객체 안에 sms들어있다 

그리고 Intent객체 안에 들어 있는 Bundle객체를 getExtras메서드로 참조한다 

그리고난뒤에 parseSmsMassage메서드를 호출하여 메시지 객체를 만들어준다. 

%이 작업을 Parsing 이라고 하는데 언어학에서 구문 분석이라고 불리며 데이터를 조립해 원하는 데이터를 뺴내는 프로그램 하는것 

 

자 그럼 parseSmsMassage메서드를 정의 해보자

   //이 아래 코드는 거의 바뀌지 않기때문에 나중에 사용할때 복사붙여넣기 해서 사용해도 무관하다
    //sms를 받았을때 브로드캐스트 수신자 안에서 sms메시지를 파씽하는 작업
    private SmsMessage[] parseSmsMassage(Bundle bundle) {
        Object[] objs = (Object[]) bundle.get("pdus"); 
        // 번들객체에 들어있는 부가데이터중 키값이 pdus 인거 가져오기
        SmsMessage[] messages = new SmsMessage[objs.length];

        int smsCount = objs.length;
        for (int i = 0; i < smsCount; i++) {
            //안드로이드 버전에 따라서 코드가 바뀌었다 다른 코드를 넣을떄가 있는데 이럴때 사용하는게 아래 이프문이다
            // messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
                String format = bundle.getString("format");
                messages[i] = SmsMessage.createFromPdu((byte[]) objs[i], format);
            }else {
            messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
        }
        }
            return messages;
    }

}

중요한것은 번들객체에 들어있는 부가데이터중 키값이 pdus 인거 가져오는 것이다. 

이 메서드는 한번 입력해놓으면 다른 앱 만들때도 재사용 할 수 있다. 수정할 일이 거의 없음 !! 

 

그런데 sms를 수신할려면 권한이 있어야 수신이 가능하다 그래서 매니패스트에 권한을 추가 해준다 

<uses-permission android:name="android.permission.RECEIVE_SMS"/> 이렇게 추가해줌  

 

그리고 외부라이브러리 추가해서 간단하게 위험권한 추가하는 코드도 있다 

여기서 나의 앱을 찾아주고  아래로 내려가면 아래의 그림처럼 나오는데 노란부분 추가해주면 상단에 추가할것인지 물어보는 대화상자 뜬다 그거 체크해주면 됨 

 

 

자 거의 다 끝나간다 이제 메인 액티비티 코드를 보자 

public class MainActivity extends AppCompatActivity implements AutoPermissionsListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        AutoPermissions.Companion.loadAllPermissions(this,101);
    }
    //위험권한 요청하고나서 사용자가 확인했는지 거절했는지를 알수 있는 기본적인 함수
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        AutoPermissions.Companion.parsePermissions(this, requestCode, permissions,this);
    }

    @Override
    public void onDenied(int requestCode, String[] permissions) {
        Toast.makeText(this,"권한 거부된것 :" + permissions.length ,Toast.LENGTH_LONG).show();
    }

    @Override
    public void onGranted(int requestCode, String[] permissions) {
        Toast.makeText(this,"권한 허용된것 :" + permissions.length ,Toast.LENGTH_LONG).show();
    }
}

1. 먼저 AutoPermissionsListener 임플리먼트 주자 

2. AutoPermissions.Companion.loadAllPermissions(this,101); 위험 권한을 자동 부여하도록 하는 메서드 호출하기 

 

그리고 나서 위험권한 요청하고나서 사용자가 확인했는지 거절했는지를 알수 있는 기본적인 함수들을 위와같이 메소드 오버라이딩 해주면 된다. 

끝~!

 

내일은 메시지받을것을 직접 가지고 오는것까지 할거 같은데 오늘 강의 들은거 하나도 이해가 안되서 따로 책보고 나니까 조금 이해가 되는거 같다 ~! 오늘도역시 열공!!!! 

반응형