코딩ㆍ개발 정보/안드로이드앱 (코틀린)

안드로이드 코틀린 전환 기능 - INTENT 종류별 적용 예시

RioRex 2022. 8. 16.

안드로이드 앱 개발을

 

하게 되면, 처음으로 접할 수 있는 부분이 인텐트입니다.

전화걸기 암시적 인텐트
Intent.ACTION_DIAL

 


val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:010-1234-5678")
if(intent.resolveActivity(packageManager) != null){
    startActivity(intent)
}
  
문자열 보내기 암시적 인텐트
Intent.ACTION_SEND

val intent = Intent(Intent.ACTION_SEND)
intent.apply {
    type = "text/plain"
    putExtra(Intent.EXTRA_TEXT, "보낼 문자열")
    var chooser = Intent.createChooser(intent, null)
    if (intent.resolveActivity(packageManager) != null){
        startActivity(chooser)
    }
}
  
웹 브라우저 열기 암시적 인텐트
Intent.ACTION_SEND

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.example.com")
if(intent.resolveActivity(packageManager) != null){
    startActivity(intent)
}
  
확장 함수로 만들 암시적 인텐트, [ ]는 옵션
종류 코드
문자 보내기 sendSms(전화번호, [문자열])
웹 브라우저에서 열기 browse(url)
문자열 공유 share(문자열, [제목])
이메일 보내기 email(받는사람 메일주소, [제목], [내용])
확장함수 만들기 (예: Extentions.kt)

import android.content.ActivityNotFoundException
import android.content.Context
import android.content.Intent
import android.net.Uri

fun Context.sendSMS(number:String, text:String = ""): Boolean{
    return try {
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("sms:$number"))
        intent.putExtra("sms_body", text)
        startActivity(intent)
        true
    } catch (e: Exception) {
        e.printStackTrace()
        false
    }
}

fun Context.email(email:String, subject:String = "", text:String = ""):Boolean{
    val intent = Intent(Intent.ACTION_SENDTO)
    intent.data = Uri.parse("mailto:")
    intent.putExtra(Intent.EXTRA_EMAIL, arrayOf(email))
    if(subject.isNotEmpty())
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
    if(text.isNotEmpty())
        intent.putExtra(Intent.EXTRA_TEXT, text)
    if(intent.resolveActivity(packageManager) != null){
        startActivity(intent)
        return true
    }
    return false
}

fun Context.share(text: String, subject: String = ""): Boolean{
    return try{
        val intent = Intent(Intent.ACTION_SEND)
        intent.type = "text/plain"
        intent.putExtra(Intent.EXTRA_SUBJECT, subject)
        intent.putExtra(Intent.EXTRA_TEXT, text)
        startActivity(Intent.createChooser(intent, null))
        true
    } catch (e: ActivityNotFoundException){
        e.printStackTrace()
        false
    }
}

fun Context.browse(url: String, newTask:Boolean = false):Boolean {
    return try{
        val intent = Intent(Intent.ACTION_VIEW)
        intent.data = Uri.parse(url)
        if(newTask){
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        }
        startActivity(intent)
        true
    } catch (e: ActivityNotFoundException){
        e.printStackTrace()
        false
    }
}
메뉴와 암시적 인텐트 연동
메뉴에 암시적 인텐트 연동(MainActivity.kt)


    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.action_google, R.id.action_home -> {
                binding.webView.loadUrl("https://www.google.com")
                return true
            }
            R.id.action_send_text -> {
                binding.webView.url?.let { url ->
                    //문자 보내기
                    sendSMS("010-1234-5678",url)
                }
                return true
            }
            R.id.action_email -> {
                binding.webView.url?.let { url ->
                    //이메일 보내기
                    email("test@exmaple.com", "조흥 사이트", url)
                }
                return true
            }
        }
        return super.onOptionsItemSelected(item)
    }

    override fun onContextItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.action_share -> {
                binding.webView.url?.let{ url ->
                    //페이지 공유
                    share(url)
                }
                return true
            }
            R.id.action_browser -> {
                binding.webView.url?.let { url ->
                    //기본 웹 브라우저에서 열기
                    browse(url)
                }
                return true
            }
        }
        return super.onContextItemSelected(item)
    }

패키지 가시성 설정
AndroidManifest.xml

 

암시적 인텐트 _ 출처: https://developer.android.com/guide/components/intents-common#DialPhone

 

예제 발췌: 오준석의 생존코딩 Chapter.07

반응형

댓글