인텐트는 Intent
객체에서 수행하고자 하는 단순한 작업(예: "지도 보기", "사진 찍기") 묘사함으로써 다른 앱에서 액티비티를 시작할 수 있도록 해주는 객체입니다. 이런 유형의 인텐트를 암시적 인텐트라고 합니다. 시작할 앱 구성 요소를 지정하는 대신 작업을 지정하고 그 작업을 수행하기 위한 약간의 데이터를 제공하기 때문입니다.
startActivity()
나 startActivityForResult()
를 호출하여 암시적 인텐트를 전달하면 시스템은 그것을 처리할 수 있는 앱을 찾아 인텐트를 해석하고 해당하는 Activity
를 시작합니다. 인텐트를 처리할 수 있는 앱이 하나 이상 있는 경우, 시스템은 사용할 앱을 선택할 수 있는 대화상자를 사용자에게 표시합니다.
이 페이지에서는 일반적인 작업을 수행하는 데 사용하는 다양한 암시적 인텐트를 설명하며, 이 설명은 인텐트를 처리하는 앱의 유형별로 구성됩니다. 또한 각 섹션에서 앱의 동일한 작업 수행 기능을 알리기 위한 인텐트 필터를 생성하는 방법도 소개합니다.
주의: 암시적 인텐트를 받을 수 있는 앱이 기기에 없을 경우, 여러분의 앱이 startActivity()
를 호출하면 앱의 작동이 중단됩니다. 인텐트를 수신할 앱이 있는지 먼저 확인하려면, Intent
객체에서 resolveActivity()
를 호출합니다. 결과가 null이 아닌 경우, 인텐트를 처리할 수 있는 앱이 최소한 하나는 있다는 뜻이며 startActivity()
를 호출해도 안전합니다. 결과가 null이면 해당 인텐트를 사용해서는 안 되고, 가능하면 해당 인텐트를 호출하는 기능을 비활성화해야 합니다.
인텐트나 인텐트 필터 생성 방법을 잘 모를 경우, 먼저 인텐트 및 인텐트 필터를 읽어보는 것이 좋습니다.
개발 호스트로부터 이 페이지에 열거된 인텐트를 내보내는 방법은 Android 디버그 브리지로 인텐트 확인을 참조하세요.
Google Voice Actions
Google Voice Actions는 음성 명령에 응답하여 이 페이지에 열거된 일부 인텐트를 내보냅니다. 자세한 내용은 Google Voice Actions에서 발생하는 인텐트를 참조하세요.
알람 시계
알람 만들기
새 알람을 설정하려면 ACTION_SET_ALARM
작업을 사용하고 아래에 정의된 엑스트라를 사용해 시간과 메시지 등의 알람 세부정보를 지정합니다.
참고: Android 2.3 (API 레벨 9) 이하에서는 시간, 분 및 메시지 엑스트라만 이용할 수 있습니다. 그 밖의 엑스트라는 차후 버전의 플랫폼에 추가되었습니다.
- 작업
ACTION_SET_ALARM
- 데이터 URI
- 없음
- MIME 유형
- 없음
- 엑스트라
-
EXTRA_HOUR
- 알람에서의 시.
EXTRA_MINUTES
- 알람에서의 분.
EXTRA_MESSAGE
- 알람 식별을 위한 사용자 지정 메시지.
EXTRA_DAYS
- 이 알람이 반복되어야 하는 각 요일이 포함되어 있는
ArrayList
. 각각의 날을MONDAY
등의Calendar
클래스에 지정된 정수로 선언해야 합니다.한 번만 사용하는 알람에는 이 엑스트라를 지정하지 마세요.
EXTRA_RINGTONE
- 알람에 사용할 벨소리를 지정하는
content:
URI. 벨소리를 사용하지 않으려면VALUE_RINGTONE_SILENT
를 사용합니다.기본 벨소리를 사용하려면 이 엑스트라를 지정하지 마세요.
EXTRA_VIBRATE
- 알람에 진동을 사용할 것인지 여부를 지정하는 부울 값.
EXTRA_SKIP_UI
- 알람 설정 시 응답하는 앱이 그 UI를 건너뛸 것인지 여부를 지정하는 부울 값. 값이 true일 경우 그 앱은 확인 UI를 무시하고 지정된 알람을 설정해야 합니다.
예시 인텐트:
Kotlin
fun createAlarm(message: String, hour: Int, minutes: Int) { val intent = Intent(AlarmClock.ACTION_SET_ALARM).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_HOUR, hour) putExtra(AlarmClock.EXTRA_MINUTES, minutes) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createAlarm(String message, int hour, int minutes) { Intent intent = new Intent(AlarmClock.ACTION_SET_ALARM) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_HOUR, hour) .putExtra(AlarmClock.EXTRA_MINUTES, minutes); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ACTION_SET_ALARM
인텐트를 호출하기 위해서는 앱이 SET_ALARM
권한을 가지고 있어야 합니다.
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_ALARM" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
타이머 만들기
카운트다운 타이머를 만들려면 ACTION_SET_TIMER
작업을 사용하고, 아래에 정의된 엑스트라를 사용해 기간 등의 타이머 세부정보를 지정합니다.
참고: 이 인텐트는 Android 4.4(API 레벨 19)에서 추가되었습니다.
- 작업
ACTION_SET_TIMER
- 데이터 URI
- 없음
- MIME 유형
- 없음
- 엑스트라
-
EXTRA_LENGTH
- 초 단위의 타이머 길이.
EXTRA_MESSAGE
- 타이머 식별을 위한 사용자 지정 메시지.
EXTRA_SKIP_UI
- 타이머 설정 시 응답하는 앱이 그 UI를 건너뛸 것인지 여부를 지정하는 부울 값. 값이 true일 경우 그 앱은 확인 UI를 무시하고 지정된 타이머를 시작해야 합니다.
예시 인텐트:
Kotlin
fun startTimer(message: String, seconds: Int) { val intent = Intent(AlarmClock.ACTION_SET_TIMER).apply { putExtra(AlarmClock.EXTRA_MESSAGE, message) putExtra(AlarmClock.EXTRA_LENGTH, seconds) putExtra(AlarmClock.EXTRA_SKIP_UI, true) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void startTimer(String message, int seconds) { Intent intent = new Intent(AlarmClock.ACTION_SET_TIMER) .putExtra(AlarmClock.EXTRA_MESSAGE, message) .putExtra(AlarmClock.EXTRA_LENGTH, seconds) .putExtra(AlarmClock.EXTRA_SKIP_UI, true); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
ACTION_SET_TIMER
인텐트를 호출하기 위해서는 앱이 SET_ALARM
권한을 가지고 있어야 합니다.
<uses-permission android:name="com.android.alarm.permission.SET_ALARM" />
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.SET_TIMER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
알람 모두 보기
알람 목록을 보려면 ACTION_SHOW_ALARMS
작업을 사용합니다.
이 인텐트를 호출할 앱이 많지는 않지만(이 인텐트는 주로 시스템 앱에서 사용됩니다), 알람 시계 기능이 있는 앱은 모두 이 인텐트 필터를 구현하고 현재의 알람을 표시함으로써 응답해야 합니다.
참고: 이 인텐트는 Android 4.4(API 레벨 19)에서 추가되었습니다.
- 작업
ACTION_SHOW_ALARMS
- 데이터 URI
- 없음
- MIME 유형
- 없음
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.SHOW_ALARMS" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
캘린더
캘린더 이벤트 추가
사용자의 캘린더에 새 이벤트를 추가하려면 ACTION_INSERT
작업을 사용하고 Events.CONTENT_URI
로 데이터 URI를 지정합니다. 그러면 아래 정의한 엑스트라를 사용해서 다양한 이벤트 명세를 지정할 수 있습니다.
- 작업
ACTION_INSERT
- 데이터 URI
Events.CONTENT_URI
- MIME 유형
"vnd.android.cursor.dir/event"
- 엑스트라
-
EXTRA_EVENT_ALL_DAY
- 이것이 종일 이벤트인지 여부를 지정하는 부울 값.
EXTRA_EVENT_BEGIN_TIME
- 이벤트가 시작되는 시간(Epoch 이후부터의 밀리초).
EXTRA_EVENT_END_TIME
- 이벤트가 끝나는 시간 (Epoch 이후부터의 밀리초).
TITLE
- 이벤트 제목.
DESCRIPTION
- 이벤트에 대한 설명.
EVENT_LOCATION
- 이벤트 위치.
EXTRA_EMAIL
- 초대된 사람들을 명시하는, 콤마로 분리된 이메일 주소 목록.
CalendarContract.EventsColumns
클래스에 정의된 상수를 사용해서 그 밖에 많은 이벤트 정보를 지정할 수 있습니다.
예시 인텐트:
Kotlin
fun addEvent(title: String, location: String, begin: Long, end: Long) { val intent = Intent(Intent.ACTION_INSERT).apply { data = Events.CONTENT_URI putExtra(Events.TITLE, title) putExtra(Events.EVENT_LOCATION, location) putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void addEvent(String title, String location, long begin, long end) { Intent intent = new Intent(Intent.ACTION_INSERT) .setData(Events.CONTENT_URI) .putExtra(Events.TITLE, title) .putExtra(Events.EVENT_LOCATION, location) .putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, begin) .putExtra(CalendarContract.EXTRA_EVENT_END_TIME, end); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.INSERT" /> <data android:mimeType="vnd.android.cursor.dir/event" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
카메라
사진이나 동영상 찍어 반환하기
카메라 앱을 열고 결과물인 사진이나 동영상을 받으려면, ACTION_IMAGE_CAPTURE
또는 ACTION_VIDEO_CAPTURE
작업을 사용합니다. 또한 EXTRA_OUTPUT
엑스트라에서 카메라가 사진이나 동영상을 저장할 URI 위치도 지정합니다.
- 작업
ACTION_IMAGE_CAPTURE
또는
ACTION_VIDEO_CAPTURE
- 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 엑스트라
-
EXTRA_OUTPUT
- 카메라 앱이 사진이나 동영상 파일을 (
Uri
객체로서) 저장해야 하는 URI 위치.
카메라 앱이 액티비티에 성공적으로 포커스를 돌려주면(앱이 onActivityResult()
콜백을 받으면), EXTRA_OUTPUT
값으로 지정한 URI에서 사진이나 동영상에 액세스할 수 있습니다.
참고: 사진을 찍기 위해 ACTION_IMAGE_CAPTURE
를 사용할 때 카메라가 사진의 축소된 사본(썸네일)을 결과 Intent
에 반환할 수 있습니다. 이는 "data"
라는 이름의 엑스트라 필드에 Bitmap
으로 저장됩니다.
예시 인텐트:
Kotlin
const val REQUEST_IMAGE_CAPTURE = 1 val locationForPhotos: Uri = ... fun capturePhoto(targetFilename: String) { val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE).apply { putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)) } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") // Do other work with full size photo saved in locationForPhotos ... } }
Java
static final int REQUEST_IMAGE_CAPTURE = 1; static final Uri locationForPhotos; public void capturePhoto(String targetFilename) { Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.withAppendedPath(locationForPhotos, targetFilename)); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelableExtra("data"); // Do other work with full size photo saved in locationForPhotos ... } }
출력 위치에 대한 적절한 Uri
생성 방법을 포함한, 이 인텐트를 이용한 사진 촬영에 대한 자세한 내용은 간단하게 사진 촬영이나 간단하게 동영상 촬영을 참조하세요.
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.media.action.IMAGE_CAPTURE" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
이 인텐트를 취급할 때 호출한 액티비티는 들어오는 Intent
에서 EXTRA_OUTPUT
엑스트라를 확인한 다음, 이 엑스트라로 지정한 위치에 촬영한 사진이나 동영상을 저장하고, 압축된 썸네일을 "data"
라는 엑스트라에 포함하는 Intent
로 setResult()
를 호출해야 합니다.
정지 영상 모드에서 카메라 앱 시작하기
카메라를 정지 이미지 모드로 열려면 INTENT_ACTION_STILL_IMAGE_CAMERA
작업을 사용합니다.
- 작업
INTENT_ACTION_STILL_IMAGE_CAMERA
- 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 엑스트라
- 없음
예시 인텐트:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_STILL_IMAGE_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.media.action.STILL_IMAGE_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
동영상 모드에서 카메라 앱 시작하기
카메라 앱을 동영상 모드로 열려면 INTENT_ACTION_VIDEO_CAMERA
작업을 사용합니다.
- 작업
INTENT_ACTION_VIDEO_CAMERA
- 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 엑스트라
- 없음
예시 인텐트:
Kotlin
fun capturePhoto() { val intent = Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA) if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE) } }
Java
public void capturePhoto() { Intent intent = new Intent(MediaStore.INTENT_ACTION_VIDEO_CAMERA); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.media.action.VIDEO_CAMERA" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
연락처/피플 앱
연락처 선택
사용자가 연락처를 선택하게 하고 앱에 모든 연락처 정보에 액세스 권한을 주려면, ACTION_PICK
작업을 사용하고 MIME 유형을 Contacts.CONTENT_TYPE
으로 지정합니다.
onActivityResult()
콜백에 반환된 결과인 Intent
에는 선택한 연락처를 가리키는 content:
URI가 들어 있습니다. 이 응답은 앱에 READ_CONTACTS
권한이 포함되어 있지 않더라도, 연락처 제공자 API를 사용하여 임시로 해당 연락처를 읽도록 허가합니다.
팁: 연락처 정보에서 전화번호나 이메일 주소 등 특정 부분에만 액세스할 필요가 있다면, 특정 연락처 데이터 선택에 대해 설명한 다음 섹션을 참조하세요.
- 작업
ACTION_PICK
- 데이터 URI 구성표
- 없음
- MIME 유형
Contacts.CONTENT_TYPE
예시 인텐트:
Kotlin
const val REQUEST_SELECT_CONTACT = 1 fun selectContact() { val intent = Intent(Intent.ACTION_PICK).apply { type = ContactsContract.Contacts.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { val contactUri: Uri = data.data // Do something with the selected contact at contactUri //... } }
Java
static final int REQUEST_SELECT_CONTACT = 1; public void selectContact() { Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_CONTACT); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_CONTACT && resultCode == RESULT_OK) { Uri contactUri = data.getData(); // Do something with the selected contact at contactUri ... } }
연락처 URI를 생성한 후 연락처 세부정보를 검색하는 방법에 대한 내용은 연락처 세부정보 검색을 참조하세요. 위의 인텐트를 사용해서 연락처 URI를 검색할 때는 그 연락처의 세부 정보를 읽기 위한 READ_CONTACTS
권한이 필요하지 않다는 것을 기억하세요.
특정 연락처 데이터 선택
사용자가 연락처에서 전화번호나 이메일 주소 또는 다른 데이터 유형 등의 특정 정보만 선택할 수 있도록 하려면 ACTION_PICK
작업을 사용하고 MIME 유형으로 아래에 열거된 콘텐츠 유형들 중 하나를 지정합니다. 예를 들어 연락처의 전화번호를 얻으려면 CommonDataKinds.Phone.CONTENT_TYPE
을 지정합니다.
연락처에서 한 가지 유형의 데이터만 필요하다면 ContactsContract.CommonDataKinds
클래스의 CONTENT_TYPE
을 사용하는 것이 (앞 섹션에서 소개한) Contacts.CONTENT_TYPE
을 사용하는 것보다 효과적입니다. 연락처 제공자에게 복잡한 쿼리를 하지 않고도 그 결과를 통해 원하는 데이터에 액세스할 수 있기 때문입니다.
onActivityResult()
콜백에 반환된 결과 Intent
에는 선택한 연락처 데이터를 가리키는 content:
URI가 들어 있습니다. 이 응답은 앱에 READ_CONTACTS
권한이 포함되어 있지 않더라도, 임시로 해당 연락처 데이터를 읽도록 허가합니다.
- 작업
ACTION_PICK
- 데이터 URI 구성표
- 없음
- MIME 유형
-
CommonDataKinds.Phone.CONTENT_TYPE
- 연락처에서 전화번호를 골라냅니다.
CommonDataKinds.Email.CONTENT_TYPE
- 연락처에서 이메일 주소를 골라냅니다.
CommonDataKinds.StructuredPostal.CONTENT_TYPE
- 연락처에서 우편 주소를 골라냅니다.
아니면
ContactsContract
에서 많은CONTENT_TYPE
값 중 하나를 골라냅니다.
예시 인텐트:
Kotlin
const val REQUEST_SELECT_PHONE_NUMBER = 1 fun selectContact() { // Start an activity for the user to pick a phone number from contacts val intent = Intent(Intent.ACTION_PICK).apply { type = CommonDataKinds.Phone.CONTENT_TYPE } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == Activity.RESULT_OK) { // Get the URI and query the content provider for the phone number val contactUri: Uri = data.data val projection: Array<String> = arrayOf(CommonDataKinds.Phone.NUMBER) contentResolver.query(contactUri, projection, null, null, null).use { cursor -> // If the cursor returned is valid, get the phone number if (cursor.moveToFirst()) { val numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER) val number = cursor.getString(numberIndex) // Do something with the phone number ... } } } }
Java
static final int REQUEST_SELECT_PHONE_NUMBER = 1; public void selectContact() { // Start an activity for the user to pick a phone number from contacts Intent intent = new Intent(Intent.ACTION_PICK); intent.setType(CommonDataKinds.Phone.CONTENT_TYPE); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_SELECT_PHONE_NUMBER); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_SELECT_PHONE_NUMBER && resultCode == RESULT_OK) { // Get the URI and query the content provider for the phone number Uri contactUri = data.getData(); String[] projection = new String[]{CommonDataKinds.Phone.NUMBER}; Cursor cursor = getContentResolver().query(contactUri, projection, null, null, null); // If the cursor returned is valid, get the phone number if (cursor != null && cursor.moveToFirst()) { int numberIndex = cursor.getColumnIndex(CommonDataKinds.Phone.NUMBER); String number = cursor.getString(numberIndex); // Do something with the phone number //... } } }
연락처 보기
알고 있는 연락처의 세부정보를 표시하려면 ACTION_VIEW
작업을 사용하고, content:
URI를 가지고 연락처를 인텐트 데이터로 지정합니다.
연락처 URI를 검색하는 데는 주로 두 가지 방법이 사용됩니다.
- 앞 섹션에서 소개한
ACTION_PICK
이 반환해준 연락처 URI를 사용합니다(이 방법은 앱 권한이 필요하지 않습니다). - 연락처 목록 검색에서 설명한 모든 연락처 목록에 액세스합니다(이 방법에는
READ_CONTACTS
권한이 필요합니다).
- 작업
ACTION_VIEW
- 데이터 URI 구성표
content:<URI>
- MIME 유형
- 없음. 이 유형은 연락처 URI에서 추론됩니다.
예시 인텐트:
Kotlin
fun viewContact(contactUri: Uri) { val intent = Intent(Intent.ACTION_VIEW, contactUri) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void viewContact(Uri contactUri) { Intent intent = new Intent(Intent.ACTION_VIEW, contactUri); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
기존 연락처 편집
알고 있는 연락처를 편집하려면 ACTION_EDIT
작업을 사용하고, content:
URI가 있는 연락처를 인텐트 데이터로 지정합니다. 그리고 ContactsContract.Intents.Insert
의 상수에서 지정한 엑스트라에 알려진 연락처 정보를 포함합니다.
연락처의 URI를 검색하는 데는 주로 두 가지 방법이 사용됩니다.
- 앞 섹션에서 소개한
ACTION_PICK
이 반환해준 연락처 URI를 사용합니다(이 방법은 앱 권한이 필요하지 않습니다). - 연락처 목록 검색에서 설명한 모든 연락처 목록에 액세스합니다(이 방법에는
READ_CONTACTS
권한이 필요합니다).
- 작업
ACTION_EDIT
- 데이터 URI 구성표
content:<URI>
- MIME 유형
- 이 유형은 연락처 URI에서 추론됩니다.
- 엑스트라
ContactsContract.Intents.Insert
에서 정의한 하나 또는 다수의 엑스트라. 연락처 정보 필드를 채울 수 있습니다.
예시 인텐트:
Kotlin
fun editContact(contactUri: Uri, email: String) { val intent = Intent(Intent.ACTION_EDIT).apply { data = contactUri putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void editContact(Uri contactUri, String email) { Intent intent = new Intent(Intent.ACTION_EDIT); intent.setData(contactUri); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
연락처 편집에 대한 자세한 내용은 인텐트를 이용한 연락처 수정을 참조하세요.
연락처 삽입
새 연락처를 삽입하려면 ACTION_INSERT
작업을 사용하고 MIME 유형으로 Contacts.CONTENT_TYPE
을 지정합니다. 그리고 ContactsContract.Intents.Insert
의 상수에서 지정한 엑스트라에 알고 있는 연락처 정보를 포함합니다.
- 작업
ACTION_INSERT
- 데이터 URI 구성표
- 없음
- MIME 유형
Contacts.CONTENT_TYPE
- 엑스트라
ContactsContract.Intents.Insert
에 정의된 하나 이상의 엑스트라.
예시 인텐트:
Kotlin
fun insertContact(name: String, email: String) { val intent = Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE putExtra(ContactsContract.Intents.Insert.NAME, name) putExtra(ContactsContract.Intents.Insert.EMAIL, email) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void insertContact(String name, String email) { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(Contacts.CONTENT_TYPE); intent.putExtra(Intents.Insert.NAME, name); intent.putExtra(Intents.Insert.EMAIL, email); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
연락처 삽입에 대한 자세한 내용은 인텐트를 이용한 연락처 수정을 참조하세요.
이메일
선택적 첨부 파일이 있는 이메일 작성
이메일을 작성하려면 첨부 파일을 포함할 것인지에 따라 아래 작업 중 하나를 사용하고, 아래에 열거한 엑스트라 키를 사용하여 받는 사람이나 제목 등을 포함합니다.
- 작업
ACTION_SENDTO
(첨부 파일이 없을 경우) 또는
ACTION_SEND
(첨부 파일이 1개인 경우) 또는
ACTION_SEND_MULTIPLE
(첨부 파일이 여러 개인 경우)- 데이터 URI 구성표
- 없음
- MIME 유형
-
"text/plain"
"*/*"
- 엑스트라
-
Intent.EXTRA_EMAIL
- 모든 "받는 사람" 이메일 주소의 문자열 배열.
Intent.EXTRA_CC
- 모든 "CC" 수신자 이메일 주소의 문자열 배열.
Intent.EXTRA_BCC
- 모든 "BCC" 수신자 이메일 주소의 문자열 배열.
Intent.EXTRA_SUBJECT
- 이메일 제목 문자열.
Intent.EXTRA_TEXT
- 이메일 본문 문자열.
Intent.EXTRA_STREAM
- 첨부 파일을 가리키는
Uri
.ACTION_SEND_MULTIPLE
작업을 사용하는 경우에는, 이것 대신 다수의Uri
객체가 포함된ArrayList
를 사용해야 합니다.
예시 인텐트:
Kotlin
fun composeEmail(addresses: Array<String>, subject: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { type = "*/*" putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setType("*/*"); intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
이메일 앱에서만 이 인텐트가 처리되고 다른 문자 메시지나 소셜 앱에서는 처리되지 않도록 하려면 ACTION_SENDTO
작업을 사용하고 "mailto:"
데이터 구성표를 포함합니다. 예를 들면 다음과 같습니다.
Kotlin
fun composeEmail(addresses: Array<String>, subject: String) { val intent = Intent(Intent.ACTION_SENDTO).apply { data = Uri.parse("mailto:") // only email apps should handle this putExtra(Intent.EXTRA_EMAIL, addresses) putExtra(Intent.EXTRA_SUBJECT, subject) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeEmail(String[] addresses, String subject) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("mailto:")); // only email apps should handle this intent.putExtra(Intent.EXTRA_EMAIL, addresses); intent.putExtra(Intent.EXTRA_SUBJECT, subject); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="*/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.SENDTO" /> <data android:scheme="mailto" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
파일 저장소
특정 유형의 파일 검색
사용자에게 문서나 사진 등의 파일을 선택하고 앱에 그 참조를 반환하라고 요청하려면 ACTION_GET_CONTENT
작업을 사용하고 원하는 MIME 유형을 지정합니다. 앱에 반환된 파일 참조는 액티비티의 현재 수명 주기에만 일시적으로 존재하므로 나중에 여기에 액세스하려면 나중에 읽을 수 있는 사본을 가져와야 합니다. 이 인텐트를 사용하면 사용자가 프로세스에서 새 파일을 생성할 수 있습니다(예를 들어 사용자는 기존 사진을 선택하는 대신 카메라로 새 사진을 캡처할 수 있습니다).
onActivityResult()
메서드에 전달된 결과 인텐트에는 이 파일을 가리키는 URI가 있는 데이터가 포함됩니다. 이 URI는 http:
URI, file:
URI, content:
URI 등과 같이 무엇이든 가능합니다. 그러나 선택할 수 있는 파일을 콘텐츠 제공자 (content:
URI)에서 액세스할 수 있는 파일과 openFileDescriptor()
를 통해 파일 스트림으로서 이용할 수 있는 파일만으로 제한하고 싶다면, 인텐트에 CATEGORY_OPENABLE
카테고리를 추가해야 합니다.
Android 4.3(API 레벨 18) 이상에서 사용자가 인텐트에 EXTRA_ALLOW_MULTIPLE
을 추가하고 true
로 설정하면 여러 개의 파일을 선택하게 할 수도 있습니다. 그러면 getClipData()
에서 반환한 ClipData
객체에서 선택된 각 파일에 액세스할 수 있습니다.
- 작업
ACTION_GET_CONTENT
- 데이터 URI 구성표
- 없음
- MIME 유형
- 사용자가 선택해야 하는, 파일 유형에 해당하는 MIME 유형.
- 엑스트라
-
EXTRA_ALLOW_MULTIPLE
- 사용자가 한 번에 파일을 한 개 이상 선택할 수 있는지의 여부를 선언하는 부울 값.
EXTRA_LOCAL_ONLY
- 반환된 파일을 원격 서비스에서 다운로드하는 대신 기기에서 직접 열 수 있어야 하는지의 여부를 선언하는 부울 값.
- 카테고리(선택)
-
CATEGORY_OPENABLE
openFileDescriptor()
로 열어 파일 스트림으로 나타낼 수 있는, "열 수 있는" 파일만 반환합니다.
사진을 가져오는 예시 인텐트:
Kotlin
const val REQUEST_IMAGE_GET = 1 fun selectImage() { val intent = Intent(Intent.ACTION_GET_CONTENT).apply { type = "image/*" } if (intent.resolveActivity(packageManager) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET) } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_GET && resultCode == Activity.RESULT_OK) { val thumbnail: Bitmap = data.getParcelableExtra("data") val fullPhotoUri: Uri = data.data // Do work with photo saved at fullPhotoUri ... } }
Java
static final int REQUEST_IMAGE_GET = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); if (intent.resolveActivity(getPackageManager()) != null) { startActivityForResult(intent, REQUEST_IMAGE_GET); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_GET && resultCode == RESULT_OK) { Bitmap thumbnail = data.getParcelable("data"); Uri fullPhotoUri = data.getData(); // Do work with photo saved at fullPhotoUri ... } }
사진을 돌려주는 예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.GET_CONTENT" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The OPENABLE category declares that the returned file is accessible from a content provider that supportsOpenableColumns
andContentResolver.openFileDescriptor()
--> <category android:name="android.intent.category.OPENABLE" /> </intent-filter> </activity>
특정 유형의 파일 열기
ACTION_GET_CONTENT
작업을 통해 앱에 가져와야 하는 파일의 사본을 검색하는 대신, Android 4.4 이상에서는 ACTION_OPEN_DOCUMENT
작업을 사용하고 MIME 유형을 지정함으로써 다른 앱에서 관리하는 파일 열기를 요청할 수 있습니다. 또한 사용자가 앱에서 쓰기가 가능한 새 문서를 만드는 대신 ACTION_CREATE_DOCUMENT
작업을 사용하게 할 수 있습니다. 예를 들어 기존의 PDF 문서를 선택하는 대신 ACTION_CREATE_DOCUMENT
인텐트는 사용자가 (문서의 저장소를 관리하는 다른 앱 내에서) 어디에 새 문서를 만들 것인지 선택하게 합니다. 그러면 앱이 새 문서를 작성할 수 있는 URI 위치를 받게 됩니다.
ACTION_GET_CONTENT
작업에서 onActivityResult()
메서드에 돌려준 인텐트는 어떤 유형의 URI라도 반환할 수 있는 반면, ACTION_CREATE_DOCUMENT
및 ACTION_OPEN_DOCUMENT
의 결과 인텐트는 선택된 파일을 DocumentsProvider
가 지원하는 content:
URI로서 항상 지정합니다. 그러면 openFileDescriptor()
로 파일을 열어 DocumentsContract.Document
의 열을 사용해 그 세부정보를 쿼리할 수 있습니다.
반환된 URI는 앱에 장기적 파일 읽기 권한을 부여합니다(쓰기 권한도 가능할 수 있음). 따라서 ACTION_OPEN_DOCUMENT
작업은 특히 기존의 파일을 앱에 복사해오지 않고 읽고 싶을 때, 또는 파일을 그 자리에서 열어 편집하고 싶을 때 (ACTION_GET_CONTENT
를 사용하는 것보다) 유용합니다.
사용자가 인텐트에 EXTRA_ALLOW_MULTIPLE
을 추가하고 true
로 설정하면 여러 개의 파일을 선택하게 할 수도 있습니다. 사용자가 한 개의 항목만 선택하면 getData()
에서 그 항목을 검색할 수 있습니다. 사용자가 항목을 두 개 이상 선택하는 경우에는 getData()
가 null을 반환하므로, 대신 getClipData()
에서 반환한 ClipData
객체에서 각 항목을 검색해야 합니다.
참고: 인텐트는 반드시 MIME 유형을 지정해야 하며 반드시 CATEGORY_OPENABLE
카테고리를 선언해야 합니다. 해당할 경우, EXTRA_MIME_TYPES
엑스트라를 사용해서 MIME 유형의 배열을 추가하고 하나 이상의 MIME 유형을 지정할 수 있습니다 이 방법을 사용할 경우에는 setType()
에서 기본 MIME 유형을 "*/*"
로 설정해야 합니다.
- 작업
ACTION_OPEN_DOCUMENT
또는
ACTION_CREATE_DOCUMENT
- 데이터 URI 구성표
- 없음
- MIME 유형
- 사용자가 선택해야 하는, 파일 유형에 해당하는 MIME 유형.
- 엑스트라
-
EXTRA_MIME_TYPES
- 앱에서 요구되는 파일 유형에 해당하는 MIME 유형의 배열. 이 엑스트라를 사용할 때는
setType()
에서 기본 MIME 유형을"*/*"
로 설정해야 합니다. EXTRA_ALLOW_MULTIPLE
- 사용자가 한 번에 파일을 한 개 이상 선택할 수 있는지의 여부를 선언하는 부울 값.
EXTRA_TITLE
- 최초로 파일 이름을 지정하기 위해
ACTION_CREATE_DOCUMENT
와 함께 사용합니다. EXTRA_LOCAL_ONLY
- 반환된 파일을 원격 서비스에서 다운로드하는 대신 기기에서 직접 열 수 있어야 하는지의 여부를 선언하는 부울 값.
- 카테고리
-
CATEGORY_OPENABLE
openFileDescriptor()
로 열어 파일 스트림으로 나타낼 수 있는, "열 수 있는" 파일만 반환합니다.
사진을 가져오는 예시 인텐트:
Kotlin
const val REQUEST_IMAGE_OPEN = 1 fun selectImage2() { val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { type = "image/*" addCategory(Intent.CATEGORY_OPENABLE) } // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN) } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == Activity.RESULT_OK) { val fullPhotoUri: Uri = data.data // Do work with full size photo saved at fullPhotoUri ... } }
Java
static final int REQUEST_IMAGE_OPEN = 1; public void selectImage() { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.setType("image/*"); intent.addCategory(Intent.CATEGORY_OPENABLE); // Only the system receives the ACTION_OPEN_DOCUMENT, so no need to test. startActivityForResult(intent, REQUEST_IMAGE_OPEN); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_IMAGE_OPEN && resultCode == RESULT_OK) { Uri fullPhotoUri = data.getData(); // Do work with full size photo saved at fullPhotoUri ... } }
타사 앱은 사실상 ACTION_OPEN_DOCUMENT
작업이 있는 인텐트에 응답할 수 없습니다. 그 대신 시스템이 이 인텐트를 받아 다양한 앱에서 이용할 수 있는 파일들을 모두 통합 사용자 인터페이스에 표시합니다.
이 UI에 앱의 파일을 제공하고 다른 앱들이 열 수 있게 하려면 DocumentsProvider
를 구현하고 PROVIDER_INTERFACE
를 위한 인텐트 필터를 포함해야 합니다("android.content.action.DOCUMENTS_PROVIDER"
). 예를 들면 다음과 같습니다.
<provider ... android:grantUriPermissions="true" android:exported="true" android:permission="android.permission.MANAGE_DOCUMENTS"> <intent-filter> <action android:name="android.content.action.DOCUMENTS_PROVIDER" /> </intent-filter> </provider>
앱이 관리하는 파일을 다른 앱에서 열 수 있게 하는 방법에 대한 자세한 내용은 저장소 액세스 프레임워크 가이드를 참조하세요.
로컬 작업
자동차 부르기
택시를 부르려면 ACTION_RESERVE_TAXI_RESERVATION
작업을 사용합니다.
참고: 앱은 작업을 완료하기 전에 사용자에게 확인을 요청해야 합니다.
- 작업
ACTION_RESERVE_TAXI_RESERVATION
- 데이터 URI
- 없음
- MIME 유형
- 없음
- 엑스트라
- 없음
예시 인텐트:
Kotlin
fun callCar() { val intent = Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void callCar() { Intent intent = new Intent(ReserveIntents.ACTION_RESERVE_TAXI_RESERVATION); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.RESERVE_TAXI_RESERVATION" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
지도
지도상에 위치 표시하기
지도를 열려면 ACTION_VIEW
작업을 사용하고 아래에 정의한 구성표 중 하나로 인텐트 데이터에 위치 정보를 지정합니다.
- 작업
ACTION_VIEW
- 데이터 URI 구성표
-
geo:latitude,longitude
- 주어진 경도와 위도의 맵을 표시합니다.
예:
"geo:47.6,-122.3"
geo:latitude,longitude?z=zoom
- 주어진 경도와 위도의 맵을 특정 확대/축소 수준에서 표시합니다. 확대/축소 수준 1은 지구 전체를 주어진 lat,lng 중심으로 표시합니다. 가장 높은(가장 가까운) 확대/축소 수준은 23입니다.
예:
"geo:47.6,-122.3?z=11"
geo:0,0?q=lat,lng(label)
- 주어진 경도와 위도의 맵을 문자열 레이블과 함께 표시합니다.
예:
"geo:0,0?q=34.99,-106.61(Treasure)"
geo:0,0?q=my+street+address
- "우리 집 주소" 위치를 표시합니다 (특정 주소나 위치 쿼리일 수 있습니다).
예:
"geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA"
참고:
geo
URI에 전달된 문자열은 모두 인코딩해야 합니다. 예를 들면, 문자열1st & Pike, Seattle
은1st%20%26%20Pike%2C%20Seattle
이 되어야 합니다. 문자열 내의 여백은%20
로 인코딩되거나 더하기(+
) 부호로 대체될 수 있습니다.
- MIME 유형
- 없음
예시 인텐트:
Kotlin
fun showMap(geoLocation: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = geoLocation } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void showMap(Uri geoLocation) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(geoLocation); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:scheme="geo" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
음악 또는 동영상
미디어 파일 재생
음악 파일을 재생하려면 ACTION_VIEW
작업을 사용하고 파일의 URI 위치를 인텐트 데이터로 지정합니다.
- 작업
ACTION_VIEW
- 데이터 URI 구성표
-
file:<URI>
content:<URI>
http:<URL>
- MIME 유형
-
"audio/*"
"application/ogg"
"application/x-ogg"
"application/itunes"
- 또는 앱에서 요구하는 다른 유형.
예시 인텐트:
Kotlin
fun playMedia(file: Uri) { val intent = Intent(Intent.ACTION_VIEW).apply { data = file } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playMedia(Uri file) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(file); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <data android:type="audio/*" /> <data android:type="application/ogg" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
검색어 기반 음악 재생
검색어를 바탕으로 음악을 재생하려면, INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
인텐트를 사용합니다. 앱이 사용자의 음성 명령에 응답하여 이 인텐트를 실행하고 음악을 재생할 것입니다. 이 인텐트를 받은 앱은 인벤토리에서 주어진 쿼리와 일치하는 콘텐츠를 검색하여 그 콘텐츠를 재생하기 시작합니다.
이 인텐트에는 원하는 검색 모드를 지정하는 EXTRA_MEDIA_FOCUS
문자열 엑스트라가 포함되어야 합니다. 예를 들어, 검색 모드는 아티스트 이름으로 검색할 것인지 노래 제목으로 검색할 것인지 지정할 수 있습니다.
- 작업
INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH
- 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 엑스트라
-
MediaStore.EXTRA_MEDIA_FOCUS
(필수)-
검색 모드를 나타냅니다(사용자가 특정 아티스트, 앨범, 노래 또는 재생목록 중 무엇을 찾고 있는지 지정합니다). 대부분의 검색 모드는 추가 엑스트라를 취합니다. 예를 들어 사용자가 특정 노래를 듣는 데 관심이 있다면 인텐트에 노래 제목, 아티스트 및 앨범, 이 세 가지의 엑스트라가 더 있어야 합니다. 이 인텐트는 각
EXTRA_MEDIA_FOCUS
값에 대해 다음과 같은 검색 모드를 지원합니다.모두 -
"vnd.android.cursor.item/*"
-
아무 음악이나 재생합니다. 수신하는 앱은 임의의 선택으로 현명하게, 이를테면 사용자가 마지막으로 들은 재생목록 등의 음악을 재생해야 합니다.
추가적인 엑스트라:
QUERY
(필수) - 빈 문자열. 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
비구조화 -
"vnd.android.cursor.item/*"
-
비구조화된 검색어로부터 특정 노래, 앨범 또는 장르를 재생합니다. 앱이 사용자가 듣기 원하는 종류의 콘텐츠를 찾아낼 수 없을 때, 이 검색 모드로 인텐트를 생성할 수 있습니다. 가능하면 앱에서 좀 더 구체적인 검색 모드를 사용해야 합니다.
추가적인 엑스트라:
QUERY
(필수) - 아티스트, 앨범, 노래 제목 또는 장르 중 임의의 조합을 포함하는 문자열입니다.
-
특정 장르의 음악을 재생합니다.
추가적인 엑스트라:
"android.intent.extra.genre"
(필수) - 장르.QUERY
(필수) - 장르. 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
-
특정 아티스트의 음악을 재생합니다.
추가적인 엑스트라:
EXTRA_MEDIA_ARTIST
(필수) - 아티스트."android.intent.extra.genre"
- 장르.QUERY
(필수) - 아티스트나 장르로 이루어진 조합을 포함하는 문자열입니다. 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
-
특정 앨범의 음악을 재생합니다.
추가적인 엑스트라:
EXTRA_MEDIA_ALBUM
(필수) - 앨범.EXTRA_MEDIA_ARTIST
- 아티스트."android.intent.extra.genre"
- 장르.QUERY
(필수) - 앨범이나 아티스트로 이루어진 조합을 포함하는 문자열입니다 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
노래 -
"vnd.android.cursor.item/audio"
-
특정 노래를 재생합니다.
추가적인 엑스트라:
EXTRA_MEDIA_ALBUM
- 앨범.EXTRA_MEDIA_ARTIST
- 아티스트."android.intent.extra.genre"
- 장르.EXTRA_MEDIA_TITLE
(필수) - 노래 제목.QUERY
(필수) - 앨범, 아티스트, 장르 또는 제목 중 임의의 조합을 포함하는 문자열입니다. 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
-
특정 재생목록이나 추가 엑스트라에서 지정한 일부 기준에 부합하는 재생목록을 재생합니다.
추가적인 엑스트라:
EXTRA_MEDIA_ALBUM
- 앨범.EXTRA_MEDIA_ARTIST
- 아티스트."android.intent.extra.genre"
- 장르."android.intent.extra.playlist"
- 재생목록.EXTRA_MEDIA_TITLE
- 재생목록이 기초로 삼는 노래 제목.QUERY
(필수) - 앨범, 아티스트, 장르 또는 재생목록 중 임의의 조합을 포함하는 문자열입니다. 이전 버전과의 호환을 위해 항상 제공되는 엑스트라입니다. 검색 모드에 대해 알지 못하는 기존의 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.
예시 인텐트:
사용자가 특정 아티스트의 노래를 듣기 원할 경우, 검색 앱이 다음 인텐트를 생성할 수 있습니다.
Kotlin
fun playSearchArtist(artist: String) { val intent = Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH).apply { putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist) putExtra(SearchManager.QUERY, artist) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void playSearchArtist(String artist) { Intent intent = new Intent(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH); intent.putExtra(MediaStore.EXTRA_MEDIA_FOCUS, MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE); intent.putExtra(MediaStore.EXTRA_MEDIA_ARTIST, artist); intent.putExtra(SearchManager.QUERY, artist); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.media.action.MEDIA_PLAY_FROM_SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
이 인텐트를 처리할 때 호출한 액티비티는 들어오는 Intent
에서 EXTRA_MEDIA_FOCUS
엑스트라의 값을 확인하여 검색 모드를 결정해야 합니다. 액티비티에서 검색 모드가 확인되면 해당 검색 모드에 대해 추가적인 엑스트라의 값을 읽어야 합니다. 앱은 이 정보를 사용하여 인벤토리 내에서 검색을 수행한 다음, 검색어에 일치하는 콘텐츠를 재생할 수 있습니다. 예를 들면 다음과 같습니다.
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { ... if (intent.action.compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { val mediaFocus: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS) val query: String? = intent.getStringExtra(SearchManager.QUERY) // Some of these extras may not be available depending on the search mode val album: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM) val artist: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST) val genre: String? = intent.getStringExtra("android.intent.extra.genre") val playlist: String? = intent.getStringExtra("android.intent.extra.playlist") val title: String? = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE) // Determine the search mode and use the corresponding extras when { mediaFocus == null -> { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query) } mediaFocus.compareTo("vnd.android.cursor.item/*") == 0 -> { if (query?.isNotEmpty() == true) { // 'Unstructured' search mode playUnstructuredSearch(query) } else { // 'Any' search mode playResumeLastPlaylist() } } mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0 -> { // 'Genre' search mode playGenre(genre) } mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Artist' search mode playArtist(artist, genre) } mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0 -> { // 'Album' search mode playAlbum(album, artist) } mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0 -> { // 'Song' search mode playSong(album, artist, genre, title) } mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0 -> { // 'Playlist' search mode playPlaylist(album, artist, genre, playlist, title) } } } }
Java
protected void onCreate(Bundle savedInstanceState) { //... Intent intent = this.getIntent(); if (intent.getAction().compareTo(MediaStore.INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH) == 0) { String mediaFocus = intent.getStringExtra(MediaStore.EXTRA_MEDIA_FOCUS); String query = intent.getStringExtra(SearchManager.QUERY); // Some of these extras may not be available depending on the search mode String album = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ALBUM); String artist = intent.getStringExtra(MediaStore.EXTRA_MEDIA_ARTIST); String genre = intent.getStringExtra("android.intent.extra.genre"); String playlist = intent.getStringExtra("android.intent.extra.playlist"); String title = intent.getStringExtra(MediaStore.EXTRA_MEDIA_TITLE); // Determine the search mode and use the corresponding extras if (mediaFocus == null) { // 'Unstructured' search mode (backward compatible) playUnstructuredSearch(query); } else if (mediaFocus.compareTo("vnd.android.cursor.item/*") == 0) { if (query.isEmpty()) { // 'Any' search mode playResumeLastPlaylist(); } else { // 'Unstructured' search mode playUnstructuredSearch(query); } } else if (mediaFocus.compareTo(MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE) == 0) { // 'Genre' search mode playGenre(genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE) == 0) { // 'Artist' search mode playArtist(artist, genre); } else if (mediaFocus.compareTo(MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE) == 0) { // 'Album' search mode playAlbum(album, artist); } else if (mediaFocus.compareTo("vnd.android.cursor.item/audio") == 0) { // 'Song' search mode playSong(album, artist, genre, title); } else if (mediaFocus.compareTo(MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE) == 0) { // 'Playlist' search mode playPlaylist(album, artist, genre, playlist, title); } } }
새 노트
노트 만들기
새 노트를 만들려면 ACTION_CREATE_NOTE
작업을 사용하고, 아래 정의된 엑스트라를 사용하여 노트 세부정보(예: 제목, 텍스트 등)를 지정합니다.
참고: 앱은 작업을 완료하기 전에 사용자에게 확인을 요청해야 합니다.
- 작업
-
ACTION_CREATE_NOTE
- 데이터 URI 구성표
- 없음
- MIME 유형
-
PLAIN_TEXT_TYPE
- "*/*"
- 엑스트라
-
-
EXTRA_NAME
- 노트의 제목이나 주제를 나타내는 문자열.
-
EXTRA_TEXT
- 노트의 텍스트를 나타내는 문자열.
-
- 작업
-
ACTION_DIAL
- 다이얼러나 전화 앱을 엽니다.ACTION_CALL
- 전화 걸기(CALL_PHONE
권한 필요)
- 데이터 URI 구성표
-
tel:<phone-number>
voicemail:<phone-number>
- MIME 유형
- 없음
tel:2125551212
tel:(212) 555 1212
- 작업
-
"com.google.android.gms.actions.SEARCH_ACTION"
- Google Voice Actions에서의 검색어를 지원합니다.
- 엑스트라
-
QUERY
- 검색어를 포함하고 있는 문자열.
- 작업
ACTION_WEB_SEARCH
- 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 엑스트라
-
SearchManager.QUERY
- 검색 문자열.
- 작업
-
ACTION_SETTINGS
ACTION_WIRELESS_SETTINGS
ACTION_AIRPLANE_MODE_SETTINGS
ACTION_WIFI_SETTINGS
ACTION_APN_SETTINGS
ACTION_BLUETOOTH_SETTINGS
ACTION_DATE_SETTINGS
ACTION_LOCALE_SETTINGS
ACTION_INPUT_METHOD_SETTINGS
ACTION_DISPLAY_SETTINGS
ACTION_SECURITY_SETTINGS
ACTION_LOCATION_SOURCE_SETTINGS
ACTION_INTERNAL_STORAGE_SETTINGS
ACTION_MEMORY_CARD_SETTINGS
그밖에 이용할 수 있는 설정 화면은
Settings
문서를 참조하세요. - 데이터 URI 구성표
- 없음
- MIME 유형
- 없음
- 작업
ACTION_SENDTO
또는
ACTION_SEND
또는
ACTION_SEND_MULTIPLE
- 데이터 URI 구성표
-
sms:<phone_number>
smsto:<phone_number>
mms:<phone_number>
mmsto:<phone_number>
이러한 각 구성표는 동일하게 취급됩니다.
- MIME 유형
-
"text/plain"
"image/*"
"video/*"
- 엑스트라
-
"subject"
- 메시지 제목 문자열 (대개 MMS에 한함).
"sms_body"
- 문자 메시지 문자열.
EXTRA_STREAM
- 첨부할 이미지나 동영상을 가리키는
Uri
.ACTION_SEND_MULTIPLE
작업을 사용하는 경우, 이 엑스트라는 첨부할 이미지/동영상을 가리키는Uri
의ArrayList
여야 합니다.
- 작업
ACTION_VIEW
- 데이터 URI 구성표
http:<URL>
https:<URL>
- MIME 유형
-
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"
- Android 기기를 개발용으로 설정하거나, 가상 기기를 사용하세요.
- 지원하고자 하는 인텐트를 처리하는 앱 버전을 설치하세요.
adb
를 사용하여 인텐트를 내보냅니다.adb shell am start -a <ACTION> -t <MIME_TYPE> -d <DATA> \ -e <EXTRA_NAME> <EXTRA_VALUE> -n <ACTIVITY>
예:
adb shell am start -a android.intent.action.DIAL \ -d tel:555-5555 -n org.example.MyApp/.MyActivity
- 필요한 인텐트 필터를 정의했다면 앱이 인텐트를 처리해야 합니다.
예시 인텐트:
Kotlin
fun createNote(subject: String, text: String) { val intent = Intent(NoteIntents.ACTION_CREATE_NOTE).apply { putExtra(NoteIntents.EXTRA_NAME, subject) putExtra(NoteIntents.EXTRA_TEXT, text) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void createNote(String subject, String text) { Intent intent = new Intent(NoteIntents.ACTION_CREATE_NOTE) .putExtra(NoteIntents.EXTRA_NAME, subject) .putExtra(NoteIntents.EXTRA_TEXT, text); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="com.google.android.gms.actions.CREATE_NOTE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="*/*" /> </intent-filter> </activity>
전화
전화 걸기
전화 앱을 열어 번호를 누르려면, ACTION_DIAL
작업을 사용하고 아래에 정의한 URI 구성표를 사용해 전화번호를 지정합니다. 전화 앱을 열면 전화번호가 표시되지만 사용자가 Call 버튼을 눌러야 통화를 시작할 수 있습니다.
직접 전화를 걸려면 ACTION_CALL
작업을 사용하고 아래에 정의한 URI 구성표를 사용해 전화번호를 지정합니다. 전화 앱을 열면 앱이 전화를 걸기 시작합니다. 사용자는 Call 버튼을 누르지 않아도 됩니다.
ACTION_CALL
작업은 매니페스트 파일에 CALL_PHONE
권한을 추가해야 합니다.
<uses-permission android:name="android.permission.CALL_PHONE" />
유효한 전화번호는 IETF RFC 3966에 정의되어 있는 것들입니다. 유효 전화번호의 예시는 다음과 같습니다.
전화기의 다이얼러는 전화번호 등 구성표를 정규화하는 데 적합합니다. 따라서 설명한 구성표는 Uri.parse()
메서드에서 반드시 필요한 것은 아닙니다. 그러나 구성표를 시도해보지 않았거나 그것을 처리할 수 있을지 확신이 서지 않는다면 Uri.fromParts()
메서드를 대신 사용하세요.
예시 인텐트:
Kotlin
fun dialPhoneNumber(phoneNumber: String) { val intent = Intent(Intent.ACTION_DIAL).apply { data = Uri.parse("tel:$phoneNumber") } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void dialPhoneNumber(String phoneNumber) { Intent intent = new Intent(Intent.ACTION_DIAL); intent.setData(Uri.parse("tel:" + phoneNumber)); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
검색
특정 앱을 사용한 검색
앱 컨텍스트 내에 검색을 지원하려면 아래의 예시 인텐트 필터에 나오는 것처럼 SEARCH_ACTION
작업으로 앱에서 인텐트 필터를 선언합니다.
예시 인텐트 필터:
<activity android:name=".SearchActivity"> <intent-filter> <action android:name="com.google.android.gms.actions.SEARCH_ACTION"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>
웹 검색하기
웹 검색을 시작하려면 ACTION_WEB_SEARCH
작업을 사용하고 SearchManager.QUERY
엑스트라에서 검색 문자열을 지정합니다.
예시 인텐트:
Kotlin
fun searchWeb(query: String) { val intent = Intent(Intent.ACTION_WEB_SEARCH).apply { putExtra(SearchManager.QUERY, query) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void searchWeb(String query) { Intent intent = new Intent(Intent.ACTION_WEB_SEARCH); intent.putExtra(SearchManager.QUERY, query); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
설정
설정의 특정 부분 열기
앱이 사용자에게 무엇인가 변경할 것을 요구할 때 시스템 설정에서 화면을 열려면 다음 인텐트 작업들 중 한 가지를 사용해서 작업의 이름에 대한 설정 화면을 엽니다.
예시 인텐트:
Kotlin
fun openWifiSettings() { val intent = Intent(Settings.ACTION_WIFI_SETTINGS) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWifiSettings() { Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
문자 메시지
첨부 파일이 있는 SMS/MMS 메시지 작성
SMS나 MMS 문자 메시지를 시작하려면 아래의 인텐트 작업 중 하나를 사용하고 아래 나오는 엑스트라 키를 사용해 전화번호, 제목, 메시지 본문 등의 메시지 세부정보를 지정합니다.
예시 인텐트:
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SENDTO).apply { type = HTTP.PLAIN_TEXT_TYPE putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType(HTTP.PLAIN_TEXT_TYPE); intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
이 인텐트가 문자 메시지 앱에서만 취급되고 다른 이메일 앱나 소셜 앱에서는 처리되지 않도록 하려면 ACTION_SENDTO
작업을 사용하고 "smsto:"
데이터 구성표를 포함합니다. 예를 들면 다음과 같습니다.
Kotlin
fun composeMmsMessage(message: String, attachment: Uri) { val intent = Intent(Intent.ACTION_SEND).apply { data = Uri.parse("smsto:") // This ensures only SMS apps respond putExtra("sms_body", message) putExtra(Intent.EXTRA_STREAM, attachment) } if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void composeMmsMessage(String message, Uri attachment) { Intent intent = new Intent(Intent.ACTION_SEND); intent.setData(Uri.parse("smsto:")); // This ensures only SMS apps respond intent.putExtra("sms_body", message); intent.putExtra(Intent.EXTRA_STREAM, attachment); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.SEND" /> <data android:type="text/plain" /> <data android:type="image/*" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> </activity>
참고: SMS/MMS 메시지 앱을 개발하는 중이라면, Android 4.4 이상에서 기본 SMS 앱으로 이용하게 하기 위해서는 여러가지 추가 작업에 대해 인텐트 필터를 구현해야 합니다. 자세한 내용은 Telephony
의 문서를 참조하세요.
웹브라우저
웹 URL 로드
웹페이지를 열려면 ACTION_VIEW
작업을 사용하고 인텐트 데이터에서 웹 URL을 지정합니다.
예시 인텐트:
Kotlin
fun openWebPage(url: String) { val webpage: Uri = Uri.parse(url) val intent = Intent(Intent.ACTION_VIEW, webpage) if (intent.resolveActivity(packageManager) != null) { startActivity(intent) } }
Java
public void openWebPage(String url) { Uri webpage = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, webpage); if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); } }
예시 인텐트 필터:
<activity ...> <intent-filter> <action android:name="android.intent.action.VIEW" /> <!-- Include the host attribute if you want your app to respond only to URLs with your app's domain. --> <data android:scheme="http" android:host="www.example.com" /> <category android:name="android.intent.category.DEFAULT" /> <!-- The BROWSABLE category is required to get links from web pages. --> <category android:name="android.intent.category.BROWSABLE" /> </intent-filter> </activity>
팁: Android 앱이 여러분의 웹사이트와 비슷한 기능을 제공한다면, 해당 웹사이트를 가리키는 URL에 대한 인텐트 필터를 포함하세요. 그러면 사용자가 여러분의 앱을 설치한 경우, 이메일이나 여러분의 웹사이트를 가리키는 다른 웹페이지의 링크가 여러분의 웹 페이지가 아니라 Android 앱에서 열립니다.
Android 디버그 브리지로 인텐트 확인
앱이 지원하려는 인텐트에 응답하는지 확인하려면 adb
도구를 사용하여 특정 인텐트를 내보낼 수 있습니다.
자세한 내용은 ADB 셸 명령어를 참조하세요.