본문 바로가기

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

2021-03-24안드로이드 스튜디오(브로드캐스트2, 위험권한)

반응형

어제에 이어 오늘도 브로드캐스트에 대해서 한번 더 짚고 넘어가자  

어제는 문자가 왔을때 브로드캐스트에서 정보를 받아오는 것과 위험 권한을 주는것에대해서 살짝 했었다 

오늘은 실제로 넘어온 정보를 뜯어서 나의 어플리케이션에 직접 사용해 보자~! 코드 살펴 보자~

public class SMSReceiver extends BroadcastReceiver {
    //날짜를 받을때 이렇게 포멧하겠다 
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd-HH:mm:ss");

    @Override // 메시지가 오면 이메소드가 자동호출됨 
    public void onReceive(Context context, Intent intent) {
        
        Bundle bundle = intent.getExtras();
        SmsMessage[] messages = parseSMSMessage(bundle); // 
        // 어제 배운것 아래의 parseSMSMessage메소드 
        // 호출하면서 번들로 들어온값 SmsMessage[]배열에 넣어줌 
        //그리고 메소드에서 리턴해주게 되면 messages여기에 데이터가 들어가 있다 
    
        // messages여기에들어 있는 데이터중 내가 필요한 데이터만 꺼내서 String에 넣어줌 
        String sender = messages[0].getOriginatingAddress(); //발신번호 확인
        String contents = messages[0].getMessageBody(); //발신메시지 바디
        Date receiveDate = new Date(messages[0].getTimestampMillis()); //발신날짜및 시간확인

        //예전에 배운 인텐트로 나의 액티비티 화면에 넘겨주도록 할것이다. 
        intent = new Intent(context, SMSActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP| 
                Intent.FLAG_ACTIVITY_CLEAR_TOP);
        intent.putExtra("sender",sender);
        intent.putExtra("contents",contents);
        intent.putExtra("receiveDate",dateFormat.format(receiveDate));
        context.startActivity(intent); // 그냥 시작하면 안되고 꼭 context 붙여 줘야 함 
    }

    private SmsMessage[] parseSMSMessage(Bundle bundle){
        //sms 데이터를 처리하는 SMTP가 있는데 그 안에 pdus라는 이름을 sms 정보들이 들어있음
        //실제 메시지는 pdus을 objects[]로 변환해야 함
        Object[] objects = (Object[])bundle.get("pdus");
        //sms를 받아올 SmsMessage 배열을 만듬
        SmsMessage[] messages = new SmsMessage[objects.length];

              for (int i = 0; i < objects.length; i++) {
            //안드로이드 버전에 따라서 코드가 바뀌었다 다른 코드를 넣을떄가 있는데 이럴때 사용하는게 아래 이프문이다
            // messages[i] = SmsMessage.createFromPdu((byte[]) objs[i]);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                //각 메시지를 추출하기 위해 사용 (pdus 포맷으로 되어 있는 메시지를 복원)
                String format = bundle.getString("format");
                messages[i] = SmsMessage.createFromPdu((byte[]) objects[i], format);
            } else {
                messages[i] = SmsMessage.createFromPdu((byte[]) objects[i]);
            }
        }
        return messages;
    }
}

(메인 액티비티는 전날거 보자) 잘 살펴보면 추가된 코드는 사실 그렇게 많지 않다 

일단 어제 메시지를 받으면 onReceive 가 자동으로(콜백) 되는것 이라고 알고 있었다 

콜백이 되면서 거기서 전달해준 인텐트를 가지고 풀어주는 메소드를 만들어서 풀어주었고 다시 리턴받아 message배열에 들어간것을 확인 할 수 있었다 . 그럼 이제 받은 정보를 인텐트에 넣어주고 내가 보낼 액티비티로 보내주는 과정이다. 

그럼 받는 sms엑티비티이다. 

public class SMSActivity extends AppCompatActivity {

    EditText edt_Sender, edt_Contents, edt_Date;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sms);

        edt_Contents = findViewById(R.id.editText2);
        edt_Sender = findViewById(R.id.editText);
        edt_Date = findViewById(R.id.editText3);

        Button button = findViewById(R.id.button);
        //1 인텐트 받아와서 이 액티비티에 처리해줌
        Intent intent = getIntent();
        if (intent != null) {
            String sender = intent.getStringExtra("sender");
            String contents = intent.getStringExtra("contents");
            String receiveDate = intent.getStringExtra("receiveDate");

            edt_Contents.setText(contents);
            edt_Date.setText(receiveDate);
            edt_Sender.setText(sender);
        }
    }
    //3 다시 화면이 실행되어도 아래 onNewIntent 메소드 실행 하고
    // onNewIntent여기서 던져준 인텐트 덕에 예전처럼 액티비티 설정 가능하다
    private void processIntent(Intent intent) {
        if (intent != null) {
            String sender = intent.getStringExtra("sender");
            String contents = intent.getStringExtra("contents");
            String receiveDate = intent.getStringExtra("receiveDate");

            edt_Contents.setText(contents);
            edt_Date.setText(receiveDate);
            edt_Sender.setText(sender);
        }
    }
    @Override  // 2.다시 실행했을때 정보손실을 막기위한 메소드
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        processIntent(intent); // 여기서 processIntent 여기로 인텐트 던저줌
    }

}

여긴 사실 인텐트 공부를 했다면 쉽게 이해할수 있을 부분이다 

 

이렇게 문자메시지(글로벌이벤트) 나 핸드폰 시스템에서 보내는 각종의 방송들을 수신하고 그 내용들을 꺼내고 사용해보는 것들을 다뤄 보았다 ~!! 

 


위험권한 부여하기 

우리가 일상에서 핸드폰을 사용할떄 잘 생각해보자 

카메라관련 어플을 깔고 처음 사용할떄를 생각해보면 카메라에 권한을 허용 하시겠습니까? 라는 문구가 뜨면서 

허용을 누르면 그 어플에서 카메라를 사용할 수 있는것을 볼 수있을텐데 그것이 바로 허용 권한이다. 

 

위험권한은 실행 시  권한 부여 할것인지 물어보는것! 

위 그림처럼 앱설치같은 일반 권한이 있고 

어플을 동작하는데 있어서 위험 권한을 수락해야 동작하는 경우가 있다. 

 

대표적인 위험권한들은 아래처럼 있다 ( 다 못외운다  그떄그때  필요에 맞게 찾아쓰면됨)

위험 권한 부여 요청 코드이다. 

중간중간 필요없는 코드들은 생략하고 빨간부분만 보면 될것이다. 

 

일단 맨위 코드에 노란 부분은 사용자가 권한을 허용한것인지 묻는 코드이다 

그 코드를 가지고 

1. 첫 실행이라고 가정하면 당연히 권한이 아직 없을것이다. 권한이 없다면 else가 실행되고 

2. 2번에서 노랜부분의 코드는 사용자가 기존에 거부를 했는지 확인을 한다 (처음실행 해당 x)

이것을 물어보는 이유는 사용자가 사용은 안한다고 했는데 매번 물어보면 사용자에게 정말 귀찮은 일이 될수 있기때문에 예전에 권한 부여를 거절했다면 권한을 주라는 메시지가 뜰것이다. 

3. 마지막으로 첫음 실행이라면 권한을 부여할 수 있도록 해주는 코드이다 .

 

오늘 배운 내용은 여기까지인데 이것또한 어플리케이션에서 엄청 중요한 내용이기에

내일 공부하면서 또 정리 하도록 하자~~ ! 오늘도 열공 하느라 고생했슈~!!!! 옳

반응형