-
[Android Studio] Intent - 전화걸기, 메시지, 웹사이트, 맵개발 끄적끄적/Android 2020. 6. 29. 21:18반응형
어플 내에서 모든 활동을 만족할 수 없을 때 다른 어플로 연결하기도 합니다.
어플 내에서 링크를 타고 웹사이트로 이동하는 것이 가장 대표적인 예겠죠.
이때 사용되는 intent 이동에 대해 알아보겠습니다.
intent란 무엇일까?
안드로이드 어플을 구성하는 네가지 기본 요소에는 Activity, Service, Broadcast Receiver, Content Provider가 있습니다.
이런 구성요소(컴포넌트) 간에 정보를 전달하는 역할을 하는 것이 Intent입니다. 무엇을 할건지를 담는 메시지 객체라고 할 수 있습니다.
화면은 하나의 액티비티라고 생각할 수 있습니다. 화면을 이동하는 작업은 각 액티비티를 실행하고, 종료하는 과정인 것입니다. 이때 액티비티 간 이동 시 정보를 공유해야하는 상황이 있는데 이를 수행하는 것이 인텐트입니다.
이 인텐트를 이용해 앱 내에서 특정 버튼을 눌러 휴대폰의 다른 앱을 사용하도록 하는 예제를 정리해보겠습니다.
msgBtn.setOnClickListener { val msg = Uri.parse("sms:010-1234-1234") val msgIntent = Intent(Intent.ACTION_SENDTO, msg) msgIntent.putExtra("sms_body","다음거 합시다") startActivity(msgIntent) } webBtn.setOnClickListener { val webpage= Uri.parse("http://www.naver.com") val webIntent = Intent(Intent.ACTION_VIEW, webpage) startActivity(webIntent) } mapBtn.setOnClickListener { val loc = Uri.parse("geo:37.543684,127.077130?z=16") val mapIntent = Intent(Intent.ACTION_VIEW, loc) startActivity(mapIntent) }
msgBtn, webBtn, mapBtn 3개의 버튼에 달린 setOnClickListener 내부 코드를 보겠습니다.
Uri 타입의 객체를 선언하고 Intent 선언 시 두번째 인자로 넣어줍니다.
어떤 값을 가진 객체를 인자로 넣느냐에 따라 실행하는 앱이 달라집니다.
이를 암시적 인텐트라고 합니다.
위와 같이 암시적 인텐트는 보통 액션과 데이터라는 속성으로 되어있습니다. 이 두가지 속성 외에 Category, Type, Component, Extras라는 속성이 있지만 이번 포스팅에서 다루진 않겠습니다.
액션(Action)값으로 Intent.ACTION_SENDTO, Intent.ACTION_VIEW 값이 있고 데이터(data) 값으로 Uri 타입의 객체를 넣어 Intent를 구성하는 것을 확인하실 수 있습니다.
//onCreate() callBtn.setOnClickListener { val num = Uri.parse("tel:010-1234-1234") val callIntent = Intent(Intent.ACTION_CALL, num) if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){ callAlertDlg() }else{ startActivity(callIntent) } } fun callAlertDlg(){ val builder = AlertDialog.Builder(this) builder.setMessage("CALL_PHONE 권한이 필요합니다.") .setTitle("권한허용") builder.setPositiveButton("OK"){ _,_ -> ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), CALL_REQUEST_CODE) } val dlg = builder.create() dlg.show() } override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) when(requestCode){ CALL_REQUEST_CODE -> { if(grantResults[0] == PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "권한 승인", Toast.LENGTH_SHORT).show() callAction() }else{ Toast.makeText(this, "권한 승인 거부", Toast.LENGTH_SHORT).show() } } } }
메시지, 웹, 맵과 달리 전화걸기 기능을 위해서는 사용자의 권한이 필요합니다. 위험한 권한으로 분류되는 기능이기에 권한체크 관련 코드가 있으며 이를 제외하고 인자값으로 Uri 객체를 넣어 사용하는 원리는 같습니다.
실행결과
P.S) 웹, 맵은 인터넷이 필요하기 때문에 AndroidManifest.xml에서 인터넷 권한을 줘야 합니다.
<uses-permission android:name="android.permission.INTERNET" />
전화걸기 기능에 사용된 권한 체크에 대한 내용은 이전 포스팅을 참고하시면 좋을 듯 합니다.
https://gdbagooni.tistory.com/8
반응형'개발 끄적끄적 > Android' 카테고리의 다른 글
[Android Studio] 안드로이드 개발 환경 구축하기 - Android Studio 설치 (0) 2020.09.18 [Android Studio] 간단한 정보 저장 - SharedPreferences 를 파헤쳐보자 (0) 2020.07.01 [Android Studio] MaterialCalendarView 커스텀해서 사용하기 (1) 2020.06.26 [Android Studio] Animation을 이용해 커스텀 로딩 창(Custom Dialog) 만들기 (0) 2020.06.25 [Android Studio] Animation - fade in & out(나타나기), move (움직이기) (0) 2020.06.18