안드로이드 프로그래밍[JAVA Code]/Sms message

SMS message : 보내기

훈츠 2019. 12. 27. 17:08
반응형

안녕하세요. 훈츠 입니다. 취미로 안드로이드 프로그래밍에 대해 하나씩 공부해가면서 재미있게 프로그래밍 하고 있습니다. 먼저 SMS Message는 SDK Version 22 이상 버젼에서는 권한을 얻어야 SMS 를 보내고 받고가 가능 합니다. 이부분 때문에 사실 조금 고생 했습니다. ㅜㅜ 왜냐하면 권한을 얻지 못하면 앱이 그냥 종료가 되어버려서 권한 문제 보다는 코드에 에러가 있는줄 알았습니다. 다른 글들을 많이 참고 했는데 이부분에 대한 설명은 못찾았습니다. 먼저 권한을 얻고 나면 생각보다는 쉽게 메시지를 보내고 받을수 있었습니다. 전 BroadcastReceiver를 통해 메시지를 받고, 받은 내용을 activity로 보내서 다시 메시지를 보냈습니다. 

1. Manifests 에  SMS 보내기와 받기 권한 사용 한다고 등록 : 전 보내고 받는 기능을 사용할거라  RECEIVE 권한, SEND 권한 두가지 권한을 등록 했습니다. 

?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sms_test_ver2">

    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.SEND_SMS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <receiver
            android:name=".SmSReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>

        </receiver>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

2) MainActivity에서 권한 얻기 : callPermissionCheck() ,onRequestPermissionsResult(~) 복사 해서 그대로 사용해도 좋습니다.  

 private static final int MY_PERMISSIONS_REQUEST_RECEIVE_SMS =1 ;
 private static final int MY_PERMISSIONS_REQUEST_SEND_SMS =2 ;
 Button btPerRecv,btPerSend;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 	btPerRecv =(Button) findViewById(R.id.btPerRecv);
    btPerSend =(Button) findViewById(R.id.btPerSend);
 	
    btPerRecv.setOnClickListener(new View.OnClickListener() {
 	@Override
 	public void onClick(View v) {
 	callPermissionCheck(MY_PERMISSIONS_REQUEST_RECEIVE_SMS);
 		}
 	});
 	btPerSend.setOnClickListener(new View.OnClickListener() {
 	@Override
 	public void onClick(View v) {
 	callPermissionCheck(MY_PERMISSIONS_REQUEST_SEND_SMS);
 		}
 	});
 }
  
 public void callPermissionCheck(int requestCode){
        switch (requestCode){
            case MY_PERMISSIONS_REQUEST_RECEIVE_SMS :
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.RECEIVE_SMS)
                        != PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                            Manifest.permission.RECEIVE_SMS)) {
                    } else {
                        ActivityCompat.requestPermissions(this,
                                new String[]{Manifest.permission.RECEIVE_SMS
                                },
                                MY_PERMISSIONS_REQUEST_RECEIVE_SMS);
                    }
                }
            case MY_PERMISSIONS_REQUEST_SEND_SMS :
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.SEND_SMS)
                        != PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                            Manifest.permission.SEND_SMS)) {
                    } else {
                        ActivityCompat.requestPermissions(this,
                                new String[]{Manifest.permission.SEND_SMS
                                },
                                MY_PERMISSIONS_REQUEST_SEND_SMS);
                    }
                }
            case MY_PERMISSIONS_REQUEST_READ_SMS :
                if (ContextCompat.checkSelfPermission(this,
                        Manifest.permission.READ_SMS)
                        != PackageManager.PERMISSION_GRANTED) {
                    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                            Manifest.permission.READ_SMS)) {
                    } else {
                        ActivityCompat.requestPermissions(this,
                                new String[]{Manifest.permission.READ_SMS
                                },
                                MY_PERMISSIONS_REQUEST_READ_SMS);
                    }
                }
        }

    }
    @Override
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_RECEIVE_SMS: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "SMS RECEIVE 권한 허용됨.",Toast.LENGTH_LONG).show();
                    println("SMS RECEIVE 권한 허용됨.");
                } else {
                    Toast.makeText(getApplicationContext(),"SMS RECEIVE 권한 없음.", Toast.LENGTH_LONG).show();
                    println("SMS RECEIVE 권한 없음.");
                    return;
                }
            }
            case MY_PERMISSIONS_REQUEST_SEND_SMS: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "SMS 전송 권한 허용됨.",Toast.LENGTH_LONG).show();
                    println("SMS 전송 권한 허용됨.");
                } else {
                    Toast.makeText(getApplicationContext(),"SMS 전송 권한 없음.", Toast.LENGTH_LONG).show();
                    println("SMS 전송 권한 없음.");
                    return;
                }
            }
            case MY_PERMISSIONS_REQUEST_READ_SMS: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(getApplicationContext(), "SMS 읽기 권한 허용됨.",Toast.LENGTH_LONG).show();
                    println("SMS 읽기 권한 허용됨.");
                } else {
                    Toast.makeText(getApplicationContext(),"SMS 읽기 권한 없음.", Toast.LENGTH_LONG).show();
                    println("SMS 읽기 권한 없음.");
                    return;
                }
            }
        }
    }
    
    

3) SmSReceiver 생성 : BroadCastReceiver 생성하고 comment와 그이하는 지워도 상관 없습니다.  

public class SmSReceiver extends BroadcastReceiver {
    
    @Override
    public void onReceive(Context context, Intent intent) {

    
}

4) SmSReceiver SMS 메시지 받아서 처리 하는 부분 : 코드 그대로 복사해서 사용해도 문제 없이 돌아갑니다. 저도 처음에는 연습겸 타이핑을 여러번 했는데 코드를 이해하고 나면 타이핑은 조금 무의미 한거 같습니다. 코드를 이해? 혹은 눈에 익었다면 그대로 복사해서 사용해도 좋습니다. 

public class SmSReceiver extends BroadcastReceiver {
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm");

	@Override
	public void onReceive(Context context, Intent intent) {

	Bundle bundle = intent.getExtras();
	SmsMessage[] messages = parseSmsMessage(bundle);

	if (messages.length > 0) {
		String sender = messages[0].getOriginatingAddress();
		String contents = messages[0].getMessageBody().toString();
		Date receivedDate = new Date( messages[0].getTimestampMillis() );

		Log.d( this.getClass().getName(), "sender: " + sender );
		Log.d( this.getClass().getName(), "contents: " + contents );
		Log.d( this.getClass().getName(), "received date: " + receivedDate );

		Toast.makeText( context, "broad send Sms " + sender + " : " + contents, Toast.LENGTH_LONG ).show();

		}

}

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) 저는 모든 메시지를 받아서 보내고 싶은게 아니어서, 다음과 같이 등록시킨 전화번호와 일치 할때만 SMS 를 Activity로 보냈습니다. for문을 이용 했습니다. ^^

private void sendToActivity(Context context, String sender, String contents, String receivedDate){
        Intent intent = new Intent(context, MainActivity.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("receivedDate", receivedDate );

        context.startActivity(intent);
 }
 @Override
    public void onReceive(Context context, Intent intent) {
    ~
 	String[] regitSender = {"15888700", "15881688", "6505551212"};

	for(int i = 0; i < regitSender.length ; i++) {
    	if (regitSender[i].equals( sender )) {
                    sendToActivity( context, sender, contents, format.format( receivedDate ) + " from broadCast" );
           }
     }

6) Activity 에 이미 해당 하는 intent 가 있는 경우에는, 다음 메소드가 호출 되므로 다음과 같이 코드를 작성해서 메시지를 받았습니다. 그리고 smsManger를 통해서 메시지를 보냈습니다. 

@Override
    protected void onNewIntent(Intent intent) {
        String telNo = "01056874135";
        sender = intent.getStringExtra("sender");
        contents = intent.getStringExtra("contents");
        receivedDate = intent.getStringExtra("receivedDate");
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(telNo, null, contents, null, null);

        println(sender );
        println(contents);
        println(receivedDate);
        super.onNewIntent(intent);

    }

7) 전체 코드 다운로드 : 미흡하지만 sms 보내고 받는 예제로 이용하셔도 좋습니다. 아직 부족하지만 질문 남겨주시면 코드 관련 답변 드리도록 하겠습니다. 

https://github.com/rain2002kr/SMS_test_ver2.git

불러오는 중입니다...

 

반응형