EMDI는 지금도 개발중

Android with Kotlin : 안드로이드 기초편 - Intent 활용 전화걸기, 문자발송, 인터넷연결 등 본문

네이티브/Android

Android with Kotlin : 안드로이드 기초편 - Intent 활용 전화걸기, 문자발송, 인터넷연결 등

EMDI 2020. 9. 21. 11:13

이번 글에서는 옛날 Android + JAVA 했을 때 배웠었던 전화걸기, 주소링크가기 등을 Kotlin으로 해보도록 하겠습니다.

 

<!-- activity_main.xml -->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="15dp"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/phoneNumEdt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="전화/문자를 연결할 번호 입력"
        android:inputType="phone"/>

    <Button
        android:id="@+id/dialBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화걸기 Dial"/>

    <Button
        android:id="@+id/callBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="전화걸기 Call"/>

    <Button
        android:id="@+id/naverLinkBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="네이버로가기"/>

    <EditText
        android:id="@+id/linkEdt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="주소창 입력"
        android:inputType="textWebEditText"
        android:singleLine="true"/>

    <Button
        android:id="@+id/linkBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="입력한 주소로 이동"/>

    <Button
        android:id="@+id/kakaoPlayStoreBtn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="카카오톡 앱 다운로드 링크" />
    
</LinearLayout>
package com.mwsniper.review_intent_call

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 전화 다이얼걸기 - 통화연결까지는 X
        dialBtn.setOnClickListener { 
            
            // 어디에 전화를 걸건지 text 정보 받기
            val input = phoneNumEdt.text.toString()
            // Uri를 이용해서 정보 저장
            val myUri = Uri.parse("tel:${input}")
            // 전환할 정보 설정 - ACTION_DIAL
            val myIntent = Intent(Intent.ACTION_DIAL, myUri)
            // 이동
            startActivity(myIntent)
        }
    }
}

 

1. 전화 다이얼걸기

첫 번째로 할 내용은 전화번호 입력 후 [전화걸기 DIAL] 버튼을 클릭하면 전화가 걸려지기 전 단계까지 가는 다이얼걸기

 

package com.mwsniper.review_intent_call

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    val mContext = this
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 전화걸기 - 통화연결까지는 O
        callBtn.setOnClickListener {

            // 어디에 전화를 걸건지 text 정보 받기
            val input = phoneNumEdt.text.toString()
            val permissionListener = object : PermissionListener {
                override fun onPermissionGranted() {

                    val myUri = Uri.parse("tel:${input}")
                    val myIntent = Intent(Intent.ACTION_CALL, myUri)
                    startActivity(myIntent)

                }

                override fun onPermissionDenied(deniedPermissions: MutableList<String>?) {
                    Toast.makeText(mContext,"전화 연결 권한이 거부되었습니다.", Toast.LENGTH_SHORT).show()

                }

            }

            TedPermission.with(mContext)
                .setPermissionListener(permissionListener)
                .setDeniedMessage("[설정] 에서 권한을 열어줘야 전화 연결이 가능합니다.")
                .setPermissions(Manifest.permission.CALL_PHONE)
                .check()
        }
    }
}

​​2. 전화 바로 걸기(집중 ★★★)

그 다음은 전화를 바로 걸도록 해주는 이벤트로 [전화걸기 CALL]버튼을 클릭하면 바로 DAIL처럼 진행될 줄 알았지만!! CALL에서는 추가적으로 처리해야할 내용이 있습니다.

 

// AndroidManifest.xml에 추가
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mwsniper.review_intent_call">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <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">
        <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>

1) manifests에 permission 추가해주기

전화연결은 다이얼과는 다르게 사용자의 요금과 관련된 일을 우리가 맘대로 진행하는 부분이라 그에 맞는 권한을 획득해야합니다. 그렇기에 우선 Main > AndroidManifest.xml 들어가셔서 permission을 추가해주기 만약 추가 안하고 앱 돌리면 앱이 죽을거에요.

 

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    implementation 'androidx.core:core-ktx:1.3.1'
    implementation 'androidx.appcompat:appcompat:1.2.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
    implementation 'gun0912.ted:tedpermission:2.2.3' //추가한 부분
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.2'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}

2) tedpermission 추가해주기

AVD가 아닌 안드로이드 폰에서 테스트를 하시는 분들은 구글에 tedpermission을 검색하신다음 버전에 맞게 gradle에 추가해주세요.

* build.gradle은 Project와 Moudle 두 가지가 있는데 build.gradle(Module: app)에 들어가시면 됩니다.

 

package com.mwsniper.review_intent_call

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 문자발송 - 아직 내용은 없음
        smsBtn.setOnClickListener {
            val inputPhoneNum = phoneNumEdt.text.toString()
            val myUri = Uri.parse("smsto:${inputPhoneNum}")
            val myIntent = Intent(Intent.ACTION_SENDTO, myUri)

            // 문자 전송 화면 이동 시 미리 문구를 적어서 보내기
            // myIntent를 가지고 갈 때 -> putExtra로 데이터를 담아서 보내자
            myIntent.putExtra("sms_body", "이 앱을 다운로드 받아주세요.")

            startActivity(myIntent)
        }

    }
}

3. 문자 보내기

그 다음은 버튼은 안만들었지만 알아두면 좋은 SMS 문자보내기 소스. 전화랑은 살짝 다른 부분이 우선 tel: 이 아닌  smsto: 로 사용한다는 것과 문자는 당연 보내는 문구가 있으니 그것을 putExtra로 담고 보낸다는 차이점이 있답니다

package com.mwsniper.review_intent_call

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 인터넷 웹 연결하기 네이버
        naverLinkBtn.setOnClickListener {

            val myUri = Uri.parse("https://www.naver.com")
            val myIntent = Intent(Intent.ACTION_VIEW, myUri)
            startActivity(myIntent)
        }

        linkBtn.setOnClickListener {

            // 어디로 연결할건지 입력
            val input = linkEdt.text.toString()
            // Uri를 이용해서 정보 저장
            val myUri = Uri.parse(input)
            val myIntent = Intent(Intent.ACTION_VIEW, myUri)
            startActivity(myIntent)
        }

    }
}

4. 네이버로 연결하기

인터넷 연결은 앞서 배웠던 tel: / smsto: 와 같이 uriString에 안붙여도 되고 바로 주소창을 입력하면 됩니다. 입력한 주소를 연결하는 방법은 앞서 배웠던 입력한 전화번호로 연결하기랑 비슷한 구조이기 소스만 올리고 패스하겠습니다.

 

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

참고로 인터넷도 CALL때와 비슷하게 permission을 부여해줘야합니다.

 

package com.mwsniper.review_intent_call

import android.content.Intent
import android.net.Uri
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 플레이 스토어 연결spdlqj
        kakaoPlayStoreBtn.setOnClickListener {

            val myUri = Uri.parse("market://details?id=com.kakao.talk&hl=ko")
            val myIntent = Intent(Intent.ACTION_VIEW, myUri)
            startActivity(myIntent)
        }
    }
}

5. 카카오스토어 연결하기

구글 스토어도 네이버주소와 비슷하게 해당 스토어의 주소가 있습니다. 그 주소를 입력한 다음 넘기면 끝!

Comments