백그라운드에서 대기하여 문자롤 수신 하였을 때 엑티비티 실행
1.BroadCastReceiver.java 생성
File -> New -> other -> broadcast receiver
더보기
-MainActivity.java-
package com.example.my14_smsservice;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkDangerousPermissions();
}
private void checkDangerousPermissions() {
String[] permissions = {
Manifest.permission.RECEIVE_SMS
};
int permissionCheck = PackageManager.PERMISSION_GRANTED;
for (int i = 0; i < permissions.length; i++) {
permissionCheck = ContextCompat.checkSelfPermission(this, permissions[i]);
if (permissionCheck == PackageManager.PERMISSION_DENIED) {
break;
}
}
if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "권한 있음", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, "권한 없음", Toast.LENGTH_LONG).show();
if (ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0])) {
Toast.makeText(this, "권한 설명 필요함.", Toast.LENGTH_LONG).show();
} else {
ActivityCompat.requestPermissions(this, permissions, 1);
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == 1) {
for (int i = 0; i < permissions.length; i++) {
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, permissions[i] + " 권한이 승인됨.", Toast.LENGTH_LONG).show();
} else {
Toast.makeText(this, permissions[i] + " 권한이 승인되지 않음.", Toast.LENGTH_LONG).show();
}
}
}
}
}
-snsDisplay.java-
package com.example.my14_smsservice;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class SmsDisplayActivity extends AppCompatActivity {
Button btnTitle,btnClose;
TextView tvMsg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms_display);
tvMsg = findViewById(R.id.tvMsg);
btnTitle = findViewById(R.id.btnTitle);
btnClose = findViewById(R.id.btnClose);
btnClose.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
finish();
}
});
Intent display = getIntent();
processIntent(display);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
processIntent(intent);
}
private void processIntent(Intent display) {
String sender = display.getStringExtra("sender");
String receivedDate = display.getStringExtra("receivedDate");
String contents = display.getStringExtra("contents");
if(sender!=null){
btnTitle.setText(sender +" 에서 문자 수신");
tvMsg.setText("["+receivedDate+"]\n"+contents);
}
}
}
-MyReveiver.java-
package com.example.my14_smsservice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyReceiver extends BroadcastReceiver {
private static final String TAG = "MyReceiver";
public SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void onReceive(Context context, Intent intent) {
Log.d(TAG, "onReceive: 호출됨");
Bundle bundle = intent.getExtras();
SmsMessage[] messages = parseSmsMessage(bundle);
if(messages != null && messages.length>0){
Log.d(TAG, "SMS를 수신하였습니다");
String sender = messages[0].getOriginatingAddress(); //보낸사람
Log.d(TAG, "sender : "+sender);
Date receivedDate = new Date(messages[0].getTimestampMillis()); //받은 날짜
Log.d(TAG, "receivedDate : "+receivedDate);
String contents = messages[0].getMessageBody(); //내용
Log.d(TAG, "contents : "+contents);
Intent display = new Intent(context,SmsDisplayActivity.class);
display.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP |
Intent.FLAG_ACTIVITY_SINGLE_TOP);
/*
* NWE TASK : 새창 띄움
* CLEAR TOP :
* SINGLE TOP : 똑같은 창을 띄우지 말고 기존 창을 써라
* */
display.putExtra("sender",sender);
display.putExtra("receivedDate",dateFormat.format(receivedDate));
display.putExtra("contents",contents);
context.startActivity(display);
}
}
private SmsMessage[] parseSmsMessage(Bundle bundle) {
Object[] objs = (Object[]) bundle.get("pdus"); //pdu:메세지 1,2,etc.. 가르킴 최신메세지는 0번임.
SmsMessage[] messages = new SmsMessage[objs.length];
for(int i=0;i<objs.length;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;
}
}
'For developer > Android' 카테고리의 다른 글
(Android)my16_progress (0) | 2020.05.27 |
---|---|
(Android)my15_touchevent (0) | 2020.05.27 |
(Android)my13_service (0) | 2020.05.21 |
(Android)my11_dialog_대화상자 (0) | 2020.05.21 |
(Android)my10_intentresult (0) | 2020.05.21 |