브로드캐스트 .... 넘나 어렵게만 느껴 지는데 ..
글로만 봤을땐 외부에서 들어오는 신호를 수신하는것! 혹은 송신하는것
카톡에서 여러 사람들에게 메시지를 전달할 때 그룹 채팅으로 메시지 보내는것
안드로이드도 여러 앱 구성요소에 메시지를 전달할 때 브로드캐스팅을 사용함
브로드캐스트 수신자는 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); 위험 권한을 자동 부여하도록 하는 메서드 호출하기
그리고 나서 위험권한 요청하고나서 사용자가 확인했는지 거절했는지를 알수 있는 기본적인 함수들을 위와같이 메소드 오버라이딩 해주면 된다.
끝~!
내일은 메시지받을것을 직접 가지고 오는것까지 할거 같은데 오늘 강의 들은거 하나도 이해가 안되서 따로 책보고 나니까 조금 이해가 되는거 같다 ~! 오늘도역시 열공!!!!
'아옳옳의 코딩공부 > 아옳옳의 안드로이드스튜디오' 카테고리의 다른 글
2021-03-25안드로이드 스튜디오(브로드캐스트3 , 위험 권한) (0) | 2021.03.25 |
---|---|
2021-03-24안드로이드 스튜디오(브로드캐스트2, 위험권한) (0) | 2021.03.24 |
2021-03-22안드로이드 스튜디오(서비스 ) (0) | 2021.03.22 |
2021-03-19 안드로이드 스튜디오(레이아웃 인플레이션 , 어플리케이션 구성하기) (0) | 2021.03.19 |
2021-03-18 안드로이드 스튜디오( 사용자 이벤트 처리와 리소스2 ,애니메이션) (0) | 2021.03.18 |