1. app(오른쪽클릭) -> new -> other -> BroadCast Receiver 추가
2.manifest 폴더에 AndroidManifest.xml에서 다음과 같이 추가하기
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<receiver
android:name=".SmsReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="1">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
receiver는 이미 추가되며, intent-filter를 추가해야함
3. 권한 요청
private final int SMS_RECEIVE_PERMISSON = 1;
public void checkPermission() {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.SEND_SMS)) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SMS_RECEIVE_PERMISSON);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.SEND_SMS}, SMS_RECEIVE_PERMISSON);
}
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.RECEIVE_SMS)) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, SMS_RECEIVE_PERMISSON);
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECEIVE_SMS}, SMS_RECEIVE_PERMISSON);
}
}
안드로이드 권한요청하지 않으면 메시지를 주고 받을 수 없습니다!! 꼭 넣어주세요
4. Receiver
문자 메시지가 오면 리시버에서 호출을 받아서 처리해줍니다.
public class SmsReceiver extends BroadcastReceiver {
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(SMS_RECEIVED)) {
Bundle bundle = intent.getExtras();
SmsMessage[] messages = parseSmsMessage(bundle);
if (messages.length > 0) {
String content = messages[0].getMessageBody();
sendToActivity(context, content);
}
}
}
private void sendToActivity(Context context, String content) {
Intent intent = new Intent(context, SmsActivity.class); // Flag 설정
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); // 메세지의 내용을 Extra에 넣어줌
intent.putExtra("content", content);
context.startActivity(intent);
}
private SmsMessage[] parseSmsMessage(Bundle bundle) {
Object[] objs = (Object[]) bundle.get("pdus");
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;
}
}
5. 문자 보내기 부분
public class SmsActivity extends AppCompatActivity {
private EditText Phonenumber;
private String sms;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
init();
get_intent();
sendMsg();
}
public void sendMsg() {
try {
String phonenumber = Phonenumber.getText().toString();
if (sms.indexOf("인증번호") != -1) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("+82" + phonenumber, null, sms, null, null);
Toast.makeText(getApplicationContext(), "전송 완료", Toast.LENGTH_LONG).show();
}
} catch (Exception e) {
Toast.makeText(getApplicationContext(), "전송 실패", Toast.LENGTH_LONG).show();
e.printStackTrace();
}
finish();
}
public void init() {
setContentView(R.layout.activity_main);
Phonenumber = (EditText) findViewById(R.id.Phonenumber);
}
public void get_intent() {
Intent intent = getIntent();
sms = intent.getStringExtra("content");
}
}
저는 인증번호가 포함된 문자만 전달하게 만들었습니다.
Git Hub
Heydosomething/Android_SMS_Receive_Send (github.com)
'안드로이드 > 잡다한 지식' 카테고리의 다른 글
안드로이드 스튜디오 EditText 밑줄 제거 (0) | 2021.03.02 |
---|---|
안드로이드 스튜디오 Recycler View 사용 (0) | 2021.02.18 |
안드로이드 스튜디오 intent로 bitmap 넘기기 (0) | 2021.01.30 |
안드로이드 스튜디오 내부 데이터베이스 연결하기 (0) | 2021.01.25 |
안드로이드 앱에서 API 요청하기 (Flask 사용) (0) | 2021.01.19 |