안드로이드 프로그래밍[Kotiln Code]/SMS 메시지 보내기

SMS 메시지보내기 : registerReceiver

훈츠 2020. 1. 11. 23:45
반응형

안녕하세요. 훈츠입니다. 요즘 코틀린 언어 공부하면서 이전에 만들어 두었던 SmS 자동 전송 app을 개발하면서 어려웠던점에 대해 전달 드려보도록 하겠습니다. 기본적으로 이 앱은 아직 배포 하지 않은 초기버젼으로 아직 완성 되지는 않았지만 app에 대한 기능은 사용자가 등록시켜 놓은 연락처로 문자가 오면, 그 문자 메시지를 등록시켜 놓은 상대방에게 자동으로 전송해 주는 앱 입니다. Java 코드로 작성한 버젼도 동작은 했지만, 간혹 broadcast 리시버는 문자 메시지를 받아서 mainActivity로 받은 문자를 띄어 주었지만 실제 메시지는 전송이 안되는 문제가 발생 하였습니다. 그래서 문자 메시지의 전송유무를 확인하고 그에 따른 적절한 메시지를 띄어 주어야 겠다는 생각을 하였습니다. 구글링을 해보니 Java로 작성된 버전은 있지만 생각보다 코틀린으로 설명 되어있는것은 못찾아서, 외국 블로그를 참조 하여 성공 하였습니다. 모든 문제가 그러하듯 어떻게 풀어야 할지 모를때, 혹은 누구에게 물어봐야 좋을지 모를때 한마디로 전혀 감이 없을땐 그렇게 어렵던 문제들이 막상 풀고 나면 정말 간단한 문제라는걸 경험해보니 항상 어려워도 문제를 스스로 해결하는? 것이 아주 좋은것 같다는 생각도 들었습니다. ^^ 이제 본격적으로 설명을...

1. registerReceiver에 다가 broadcastReceiver와 filter를 붙여 인텐트를 확인 할수 있습니다. 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///
fun sendSMS(smsNumber:String, smsText:String) {
val intentSent : Intent = Intent("SMS_SENT_ACTION")
val intentDelivered : Intent = Intent("SMS_DELIVERED_ACTION")
val sentIntent = PendingIntent.getBroadcast(this,0,intentSent,0)
val deliveredIntent = PendingIntent.getBroadcast(this,0,intentDelivered,0)
 
registerReceiver(object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (resultCode) {
                    Activity.RESULT_OK ->  // 전송 성공
                    {
                        Toast.makeText(context, "전송 완료", Toast.LENGTH_SHORT).show()
                        println("전송 완료")
                    }
                    SmsManager.RESULT_ERROR_GENERIC_FAILURE ->  // 전송 실패
                    {
                        Toast.makeText(context, "전송 실패", Toast.LENGTH_SHORT).show()
                        println("전송 실패")
                    }
                    SmsManager.RESULT_ERROR_NO_SERVICE ->  // 서비스 지역 아님
                    {
                        Toast.makeText(context, "서비스 지역이 아닙니다", Toast.LENGTH_SHORT).show()
                        println("서비스 지역이 아닙니다")
                    }
                    SmsManager.RESULT_ERROR_RADIO_OFF ->  // 무선 꺼짐
                    {
                        Toast.makeText(context, "휴대폰이 꺼져있습니다", Toast.LENGTH_SHORT).show()
                        println("휴대폰이 꺼져있습니다")
                    }
                    SmsManager.RESULT_ERROR_NULL_PDU ->  // PDU 실패
                    {
                        Toast.makeText(context, "PDU Null", Toast.LENGTH_SHORT).show()
                        println("PDU Null")
                    }
                }
            }
        }, IntentFilter("SMS_SENT_ACTION"))
// SMS가 도착했을때 실행
        registerReceiver(object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (resultCode) {
                    Activity.RESULT_OK ->  // 도착 완료
                    {
                        Toast.makeText(context, "SMS 도착 완료", Toast.LENGTH_SHORT).show()
                        println("SMS 도착 완료")
                    }
                    Activity.RESULT_CANCELED ->  // 도착 안됨
                    {
                        Toast.makeText(context, "SMS 도착 실패", Toast.LENGTH_SHORT).show()
                        println("SMS 도착 실패")
                    }
                }
            }
        }, IntentFilter("SMS_DELIVERED_ACTION"))
 
        val SmsManager = SmsManager.getDefault()
        SmsManager.sendTextMessage(smsNumber, null, smsText, sentIntent, deliveredIntent)
 
    }        
        
cs
 

2) 전체 코드 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
//Hoons Blog---https://rain2002kr.tistory.com------------------------------------------------------------------코드///val MY_PERMISSIONS_REQUEST_RECEIVE_SMS :Int  = 1
val MY_PERMISSIONS_REQUEST_SEND_SMS :Int  = 2
private val multiplePermissionsCode = 100
private val requiredPermissions = arrayOf(
    Manifest.permission.SEND_SMS,
    Manifest.permission.RECEIVE_SMS
    //Manifest.permission.READ_PHONE_STATE,
    //Manifest.permission.ACCESS_COARSE_LOCATION,
)
private val currentVersion = arrayListOf<String>(
    "curVer: 1.0.0",
    "curDate: 2020.01.11"
)
 
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        checkPermissions()
        btSend.setOnClickListener {
            var phone = editphone.text.toString()
            var message = editsms.text.toString()
            val smsManager = SmsManager.getDefault()
            smsManager.sendTextMessage(phone, null, message, nullnull)
        }
 
        btVersion.setOnClickListener({
            for((index, currentVersion) in currentVersion.withIndex()){
                println("$currentVersion")
            }
        })
 
        btRegistScreen.setOnClickListener {
            val intent = Intent(this, RegistItemActivity::class.java)
            intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP
            startActivityForResult(intent, 100);
        }
 
    }
 
    private fun checkPermissions() {
        //거절되었거나 아직 수락하지 않은 권한(퍼미션)을 저장할 문자열 배열 리스트
        var rejectedPermissionList = ArrayList<String>()
 
        //필요한 퍼미션들을 하나씩 끄집어내서 현재 권한을 받았는지 체크
        for(permission in requiredPermissions){
            if(ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
                //만약 권한이 없다면 rejectedPermissionList에 추가
                rejectedPermissionList.add(permission)
            }
        }
        //거절된 퍼미션이 있다면...
        if(rejectedPermissionList.isNotEmpty()){
            //권한 요청!
            val array = arrayOfNulls<String>(rejectedPermissionList.size)
            ActivityCompat.requestPermissions(this, rejectedPermissionList.toArray(array), multiplePermissionsCode)
        }
    }
    //권한 요청 결과 함수
    override fun onRequestPermissionsResult(requestCode: Int,
                                            permissions: Array<String>, grantResults: IntArray) {
        when (requestCode) {
            multiplePermissionsCode -> {
                if(grantResults.isNotEmpty()) {
                    for((i, permission) in permissions.withIndex()) {
                        if(grantResults[i] != PackageManager.PERMISSION_GRANTED) {
                            //권한 획득 실패
                            Log.i("TAG""The user has denied to $permission")
                            Log.i("TAG""I can't work for you anymore then. ByeBye!")
                            }
                    }
                }
            }
        }
    }
 
    override fun onNewIntent(intent: Intent) {
        val sender = intent.getStringExtra("sender")
        val contents = intent.getStringExtra("contents")
        val receivedDate = intent.getStringExtra("receivedDate")
        val str = sender+contents+receivedDate
        println(sender+"\n" + contents+"\n" + receivedDate+"\n")
        var phone = editphone.text.toString().replace("[^0-9]""")
        sendSMS(phone,str)
 
        //var message = editsms.text.toString()
        //val smsManager = SmsManager.getDefault()
        //smsManager.sendTextMessage(phone, null, str, null, null)
 
        super.onNewIntent(intent)
    }
 
    fun println(dataString) {
        textView.append(data + "\n")
    }
 
    fun sendSMS(smsNumber:String, smsText:String) {
 
        val intentSent : Intent = Intent("SMS_SENT_ACTION")
        val intentDelivered : Intent = Intent("SMS_DELIVERED_ACTION")
        val sentIntent = PendingIntent.getBroadcast(this,0,intentSent,0)
        val deliveredIntent = PendingIntent.getBroadcast(this,0,intentDelivered,0)
 
        registerReceiver(object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (resultCode) {
                    Activity.RESULT_OK ->  // 전송 성공
                    {
                        Toast.makeText(context, "전송 완료", Toast.LENGTH_SHORT).show()
                        println("전송 완료")
                    }
                    SmsManager.RESULT_ERROR_GENERIC_FAILURE ->  // 전송 실패
                    {
                        Toast.makeText(context, "전송 실패", Toast.LENGTH_SHORT).show()
                        println("전송 실패")
                    }
                    SmsManager.RESULT_ERROR_NO_SERVICE ->  // 서비스 지역 아님
                    {
                        Toast.makeText(context, "서비스 지역이 아닙니다", Toast.LENGTH_SHORT).show()
                        println("서비스 지역이 아닙니다")
                    }
                    SmsManager.RESULT_ERROR_RADIO_OFF ->  // 무선 꺼짐
                    {
                        Toast.makeText(context, "휴대폰이 꺼져있습니다", Toast.LENGTH_SHORT).show()
                        println("휴대폰이 꺼져있습니다")
                    }
                    SmsManager.RESULT_ERROR_NULL_PDU ->  // PDU 실패
                    {
                        Toast.makeText(context, "PDU Null", Toast.LENGTH_SHORT).show()
                        println("PDU Null")
                    }
                }
            }
        }, IntentFilter("SMS_SENT_ACTION"))
 
        // SMS가 도착했을때 실행
        registerReceiver(object : BroadcastReceiver() {
            override fun onReceive(context: Context, intent: Intent) {
                when (resultCode) {
                    Activity.RESULT_OK ->  // 도착 완료
                    {
                        Toast.makeText(context, "SMS 도착 완료", Toast.LENGTH_SHORT).show()
                        println("SMS 도착 완료")
                    }
                    Activity.RESULT_CANCELED ->  // 도착 안됨
                    {
                        Toast.makeText(context, "SMS 도착 실패", Toast.LENGTH_SHORT).show()
                        println("SMS 도착 실패")
                    }
                }
            }
        }, IntentFilter("SMS_DELIVERED_ACTION"))
 
        val SmsManager = SmsManager.getDefault()
        SmsManager.sendTextMessage(smsNumber, null, smsText, sentIntent, deliveredIntent)
 
    }
 
 
}
  
        
cs

 

3) 코드

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

 

rain2002kr/SMS_Kotilin_ver2

Contribute to rain2002kr/SMS_Kotilin_ver2 development by creating an account on GitHub.

github.com

 

반응형