본문 바로가기
Android

전화 걸기 및 설정

by 루에 2015. 3. 1.
반응형

전화 걸기에 대해 이야기 하기 전에 인텐트에 대해 적어보자면, 인텐트(Intent)는 기본적으로 액티비티간의 소통이 가능한 도구라고 생각할 수 있다. 그렇다는 것은 당연히 소통과정에서 전달하기 위한 정보(data)를 가질 수 있다는 것이다.


앱에서 전화를 걸기 위해서는 이러한 인텐트를 사용하며, 그 중에서도 암시적 인텐트(호출 대상이 정해지지 않은)를 사용한다. 호출 대상이 정해지지 않았다는 것은 보통 우리가 이미지를 공유할 때 여러 SNS나 메일 등이 뜨는 것을 생각하면 쉽게 이해할 수 있다.


암시적 인텐트에서는 Action, Data, Type, Category, Component, Extras등을 사용하여 원하는 것을 선택할 수 있다. 그 중에서 전화 걸기를 위한 Action쪽의 옵션을 보자면,


ACTION_MAIN

메인 액티비티를 실행한다

ACTION_VIEW

데이터를 보여준다(eg: ACTION_VIEW, tel:123 - 123번호가 전달된 전화 걸기 다이얼을 보여준다)

ACTION_CHOOSER

ACTION_EDIT

데이터를 수정한다(eg: ACTION_EDIT, content://contacts/people/1 - 1의 연락처를 수정한다)

ACTION_PICK

ACTION_GET_CONTENT

둘은 데이터를 받아올 때 사용하는 옵션이지만, PICK은 URI를 필요로 하며, GET_CONTENT는 데이터 유형(mimeType)을 필요로 한다.

ACTION_DIAL

전화 데이터를 가져와 다이얼을 보여준다

ACTION_CALL

전화 데이터를 가져와 바로 전화를 건다


그 외 다른 데이터는 http://developer.android.com/reference/android/content/Intent.html 참조




전화를 걸기 위해서는 몇 가지 방법이 있겠지만 DIAL과 CALL을 기본적으로 사용할 수 있을 것이다.


그리고 가장 중요한 것은, 인텐트를 사용하기 위해 androidManifest.xml에 인텐트 옵션을 추가해주어야 한다.


<intent-filter>
                 
<action android:name="android.intent.action.VIEW" />
                 
<action android:name="android.intent.action.EDIT" />
                 
<action android:name="android.intent.action.PICK" />
                 
<category android:name="android.intent.category.DEFAULT" />
                 
<data android:mimeType="vnd.android.cursor.dir/vnd.google.note" />
             
</intent-filter>

위의 경우 VIEW, EDIT, PICK을 추가햇고, PICK의 데이터를 위해 mimeType을 추가한 것을 볼 수 있다.


전화를 걸기 위해서는 위와 같은 방식으로

<intent-filter>
                 
<action android:name="android.intent.action.DIAL" />
                 
<action android:name="android.intent.action.CALL" />
             
</intent-filter>

추가해주면 된다.


여기서 하나 주의해야할 것은 해당 옵션을 추가하면 플레이 스토어에서 전화 기능을 가지지 않은 기기(와이파이 전용 태블릿 등)에서 검색이 안된다는 것이다. 다이얼 앱이라면 모르겠으나, 부가적인 옵션으로 전화걸기가 필요한 경우는 곤란할 것이다. 

그래서 manifest.xml에 아래 구문을 추가한다.


<uses-feature android:name="android.hardware.telephony" android:required="false"/>


intent Action의 실제 활용 예제

Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:010101010"));

startActivity(intent);


Data는 동작에 필요한 상세 데이터를 의미한다. 위 예제의 tel:이나 홈페이지를 참조하기 위한 http: 등이 해당된다. getData, setData로 참조한다.


Type은 자동으로 판별이 가능하다. tel:로 시작한다면 전화번호를 의미하게 된다. 물론 getType, setType으로 명시적으로 지정할 수 있다. 활용 예제


Intent intent = new Intent(Intent.ACTION_SEND);    // 메일 보내기 위한 인텐트 설정

intent.setType(text/plain);    // 타입을 지정한다.

startActivity(Intent.createChooser(intent, "text"));    // 다이얼로그 제목 세팅


Category는 사용할 액션에 대한 상세정보를 제공한다. addCategory, removeCategory로 참조한다.


Component는 사용할 컴포넌트를 명시적으로 지정한다. 이를 사용하면 명시적 인텐트가 된다.


Extras는 추가 전달 정보로, 맵의 형태(key, value)를 띄고 있다. 값이 전달되지 않았을 경우 문자열은 null로 리턴된다. 활용 예제


String id = "id";
Intent intent = new Intent(MainActivity.this, targetActivity.class);
intent.putExtra("ID", id);

// 받는 액티비티에서 값 참조
getIntent().getStringExtra("ID");

boolean이라면 getBooleanExtra 등으로 받는다.

Frags는 액티비티를 실행하는 방법이나 관리에 관한 정보를 저장한다. setFrag, getFrag로 참조한다.


명시적 인텐트는 이전에는 많이 썼으나, Fragment가 활성화 된 현재 버전에서는 그다지 쓸 일이 없지 않을까 생각된다. 보통 splash에 관한 예제를 검색하면 많이 사용하는 방법이다.


반응형

댓글