공통 인텐트

인텐트를 사용하면 Intent 객체에서 실행할 작업(예: '지도 보기' 또는 '사진 찍기')을 설명하여 다른 앱에서 활동을 시작할 수 있습니다. 이러한 유형의 인텐트 앱을 지정하지 않으므로 암시적 인텐트라고 합니다. 구성요소를 시작하고 대신 작업을 지정하고 작업을 실행하는 데 사용할 일부 데이터.

startActivity()를 호출하는 경우 또는 startActivityForResult()이고 암시적 인텐트, 즉 시스템 해결 앱에 대한 인텐트에 대한 요청을 상응하는 Activity입니다. 앱이 2개 이상인 경우 요청을 처리할 수 있는 경우 시스템은 사용자에게 사용할 앱을 선택합니다.

이 페이지에서는 작업을 수행하는 데 사용할 수 있는 몇 가지 암시적 인텐트를 설명합니다. 인텐트를 처리하는 앱 유형별로 정리되어 있습니다. 각 섹션에서 인텐트를 생성하는 방법, 필터를 사용하여 앱의 작업 수행 기능을 광고할 수 있습니다.

주의: 암시적 인텐트를 받을 수 있는 앱이 기기에 없으면 앱이 startActivity()를 호출할 때 비정상 종료됩니다. 먼저 인텐트를 수신할 앱이 존재하는 경우 Intent 객체에서 resolveActivity()를 호출합니다. 결과가 null이 아닌 경우 최소 인텐트를 처리할 수 있는 앱이 하나 있고 startActivity()를 호출해도 안전합니다. 결과가 null이면 인텐트를 사용하지 말고 가능한 경우 기능을 정의합니다.

인텐트나 인텐트 필터를 만드는 방법을 잘 모르는 경우 먼저 인텐트 및 인텐트 필터.

개발 환경에서 이 페이지에 나열된 인텐트를 실행하는 방법 알아보기 Android 디버그로 인텐트 확인 브리지 섹션을 참조하세요.

Google Voice Actions

Google 보이스 작업은 다음에 대한 응답으로 이 페이지에 나열된 일부 인텐트를 실행합니다. 음성 명령입니다. 자세한 내용은 을(를) 참조하세요. 시스템 음성 액션 시작하기

알람 시계

다음은 필요한 정보를 포함하여 알람 시계 앱과 관련된 일반적인 작업입니다. 인텐트 필터를 만들어 각 작업을 실행하는 앱의 기능을 광고하세요.

알람 만들기

Google Voice Actions

  • "오전 7시에 알람 설정해 줘"

새 알람을 만들려면 ACTION_SET_ALARM을(를) 사용하세요. 작업을 실행하고 다음과 같은 추가 항목을 사용하여 시간 및 메시지와 같은 알람 세부정보를 지정합니다.

참고: 시간, 분, 추가 메시지만 사용할 수 있습니다. (Android 2.3(API 수준 9) 이하)에서 지원됩니다. 다른 추가 기능은 있습니다.

조치
ACTION_SET_ALARM
데이터 URI
없음
MIME 유형
없음
추가 항목
EXTRA_HOUR
알람을 실행할 시간입니다.
EXTRA_MINUTES
알람의 분입니다.
EXTRA_MESSAGE
알람 식별을 위한 맞춤 메시지입니다.
EXTRA_DAYS
이 알람이 반복되는 각 요일이 포함된 ArrayList입니다. 각 날짜는 Calendar의 정수로 선언해야 합니다. 클래스(예: MONDAY)

일회성 알람의 경우 이 추가 항목을 지정하지 마세요.

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>

타이머 만들기

Google Voice Actions

  • "5분 타이머 설정해 줘"

카운트다운 타이머를 만들려면 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 사용하여 데이터 URI를 지정합니다. Events.CONTENT_URI입니다. 그러면 다음과 같은 추가 항목을 사용하여 다양한 이벤트 세부정보를 지정할 수 있습니다.

조치
ACTION_INSERT
데이터 URI
Events.CONTENT_URI
MIME 유형
"vnd.android.cursor.dir/event"
추가 항목
EXTRA_EVENT_ALL_DAY
종일 일정인지 여부를 지정하는 불리언입니다.
EXTRA_EVENT_BEGIN_TIME
이벤트 시작 시간 (에포크 이후의 밀리초)입니다.
EXTRA_EVENT_END_TIME
이벤트의 종료 시간 (에포크 이후 밀리초)입니다.
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)
    }
}

자바

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() 콜백을 수신합니다. 사용자가 지정한 URI에서 사진이나 동영상에 액세스할 수 있는지 EXTRA_OUTPUT 값으로 대체합니다.

참고: ACTION_IMAGE_CAPTURE를 사용하는 경우 카메라는 사진을 캡처하기 위해 결과 Intent에 있는 사진의 축소된 사본 또는 썸네일 이미지로, 라는 추가 필드에 Bitmap로 저장됨 "data"

인텐트 예:

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.
        ...
    }
}

자바

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.
        ...
    }
}

Android 12 (API 수준 31) 이상에서 작업할 때 이 작업을 실행하려면 다음 인텐트 예를 참고하세요.

예시 인텐트:

Kotlin

val REQUEST_IMAGE_CAPTURE = 1

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

자바

static final int REQUEST_IMAGE_CAPTURE = 1;

private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
    } catch (ActivityNotFoundException e) {
        // Display error state to the user.
    }
}
</section></div>

이 인텐트를 사용하여 사진을 캡처하는 방법에 관한 자세한 내용은 다음을 참고하세요. 출력 위치에 적합한 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 추가 항목을 확인하도록 한 다음 캡처된 이미지나 동영상을 해당 엑스트라에 의해 지정된 위치를 가져오고 엑스트라에 압축된 썸네일이 포함된 IntentsetResult()를 호출합니다. 이름이 "data"입니다.

정지 영상 모드에서 카메라 앱 시작하기

Google Voice Actions

  • "사진 찍어 줘"

정지 이미지 모드로 카메라 앱을 열려면 INTENT_ACTION_STILL_IMAGE_CAMERA 작업을 사용합니다.

조치
INTENT_ACTION_STILL_IMAGE_CAMERA
데이터 URI 스키마
없음
MIME 유형
없음
추가 항목
없음

예시 인텐트:

Kotlin

private fun dispatchTakePictureIntent() {
    val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
    try {
        startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
    } catch (e: ActivityNotFoundException) {
        // Display error state to the user.
    }
}

자바

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);
    }
}

인텐트 필터 예시:

<activity ...>
    <intent-filter>
        <action android:name="android.media.action.STILL_IMAGE_CAMERA" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>

동영상 모드에서 카메라 앱 시작하기

Google Voice Actions

  • "동영상 녹화"

카메라 앱을 동영상 모드로 열려면 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)
    }
}

자바

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입니다. 승인 응답은 Contacts Provider API를 사용하여 연락처를 읽을 수 있는 임시 권한을 앱에 부여합니다. 앱에 READ_CONTACTS 권한이 포함되어 있지 않습니다.

도움말: 연락처 정보에서 전화번호나 이메일 주소 등 특정 부분에만 액세스할 필요가 있다면, 특정 연락처 데이터를 선택하는 방법에 관한 다음 섹션을 참고하세요.

조치
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.
        //...
    }
}

자바

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 권한이 필요하지 않습니다. 하지만 특정 연락처에 관한 더 구체적인 데이터(예: 전화번호 또는 이메일 주소)를 읽으려면 READ_CONTACTS 권한이 필요합니다.

특정 연락처 데이터 선택

사용자가 연락처에서 전화번호, 이메일 주소 또는 기타 데이터 유형에 대해 알아보려면 ACTION_PICK 작업을 실행하고 MIME 유형을 1로 지정 다음 콘텐츠 유형 중 하나: CommonDataKinds.Phone.CONTENT_TYPE하여 연락처의 전화번호를 확인합니다.

참고: 대부분의 경우 앱은 <ph type="x-smartling-placeholder">READ_CONTACTS</ph> 특정 연락처에 대한 특정 정보를 볼 수 있는 권한이 있습니다.

연락처에서 한 가지 유형의 데이터만 검색해야 하는 경우 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.
                ...
            }
        }
    }
}

자바

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)
    }
}

자바

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)
    }
}

자바

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)
    }
}

자바

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
모든 'To'의 문자열 배열 이메일 주소를 사용합니다.
Intent.EXTRA_CC
모든 'CC'의 문자열 배열 이메일 주소를 사용합니다.
Intent.EXTRA_BCC
모든 'BCC'의 문자열 배열 이메일 주소를 사용합니다.
Intent.EXTRA_SUBJECT
이메일 제목이 포함된 문자열입니다.
Intent.EXTRA_TEXT
이메일 본문이 포함된 문자열입니다.
Intent.EXTRA_STREAM
첨부파일을 가리키는 Uri입니다. ACTION_SEND_MULTIPLE 이것은 대신 ArrayList 다음을 포함 여러 Uri 객체

예시 인텐트:

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)
    }
}

자바

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 handle this.
        putExtra(Intent.EXTRA_EMAIL, addresses)
        putExtra(Intent.EXTRA_SUBJECT, subject)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

자바

public void composeEmail(String[] addresses, String subject) {
    Intent intent = new Intent(Intent.ACTION_SENDTO);
    intent.setData(Uri.parse("mailto:")); // Only email apps 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.
        ...
    }
}

자바

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 supports OpenableColumns
             and ContentResolver.openFileDescriptor(). -->
        <category android:name="android.intent.category.OPENABLE" />
    </intent-filter>
</activity>

특정 유형의 파일 열기

Android에서 실행할 때 ACTION_GET_CONTENT 작업을 사용하여 앱으로 가져와야 하는 파일의 사본을 가져오는 대신 4.4 이상에서는 대신 다음과 같은 방법으로 다른 앱에서 관리하는 파일을 열도록 요청할 수 있습니다. ACTION_OPEN_DOCUMENT 작업을 사용하고 MIME 유형을 지정합니다. 또한 사용자가 앱에서 쓸 수 있는 새 문서를 만들 수 있게 하려면 ACTION_CREATE_DOCUMENT 작업을 대신 사용합니다.

예를 들어 기존 PDF 문서를 선택하는 대신 ACTION_CREATE_DOCUMENT 인텐트를 사용하면 사용자가 문서의 저장소를 관리하는 다른 앱 내에서 새 문서를 만들 위치를 선택할 수 있습니다. 그러면 앱이 새 문서를 작성할 수 있는 URI 위치를 받게 됩니다.

반면에 인텐트가 onActivityResult()에 전달된 경우 ACTION_GET_CONTENT 작업의 메서드가 모든 유형의 URI 반환, ACTION_OPEN_DOCUMENT의 결과 인텐트 ACTION_CREATE_DOCUMENT은 선택된 파일을 항상 DocumentsProvider에서 지원하는 content: URI로 지정합니다. 여기에서 파일(openFileDescriptor() 포함) 및 DocumentsContract.Document의 열을 사용하여 세부정보를 쿼리합니다.

반환된 URI는 앱에 장기적 파일 읽기 액세스 권한을 부여하며, 볼 수 있습니다 ACTION_OPEN_DOCUMENT 작업은 특히 기존 파일을 앱에 복사해오지 않고 읽고 싶을 때 또는 파일을 그 자리에서 열어 편집하고 싶을 때 유용합니다.

또한 EXTRA_ALLOW_MULTIPLE를 인텐트에 추가하고 true로 설정합니다. 사용자가 항목을 하나만 선택하면 getData()에서 항목을 가져올 수 있습니다. 사용자가 항목을 두 개 이상 선택하면 getData()가 null을 반환하므로 개발자가 대신 ClipData에서 각 항목 가져오기 getClipData()에서 반환한 객체입니다.

참고: 인텐트는 MIME 유형을 지정해야 합니다. 반드시 CATEGORY_OPENABLE 카테고리를 선언해야 합니다. 만약 MIME 유형 배열을 추가하여 하나 이상의 MIME 유형을 지정할 수 있습니다. EXTRA_MIME_TYPES extra: 이 경우 setType()의 기본 MIME 유형을 "*/*"로 설정합니다.

조치
ACTION_OPEN_DOCUMENT 또는
ACTION_CREATE_DOCUMENT
데이터 URI 스키마
없음
MIME 유형
사용자가 선택해야 하는 파일 형식에 해당하는 MIME 유형입니다.
추가 항목
EXTRA_MIME_TYPES
앱의 파일 유형에 해당하는 MIME 유형의 배열 있습니다. 이 엑스트라를 사용할 때는 setType()에서 "*/*"(으)로
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.
        ...
    }
}

자바

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에 앱의 파일을 제공하고 다른 앱에서 열 수 있도록 하려면 다음을 구현해야 합니다. DocumentsProviderPROVIDER_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>

앱이 관리하는 파일을 다른 앱에서 열 수 있게 하는 방법에 대한 자세한 내용은 저장소 액세스 프레임워크를 사용하여 파일 열기를 참고하세요.

로컬 액션

자동차를 부르는 것은 일반적인 현지 행동입니다. 앱의 다음 섹션의 정보를 사용하여 이 작업을 수행할 수 있어야 합니다.

택시 호출

Google Voice Actions

  • "택시 이용"
  • "차 전화해 줘"

(Wear OS 전용)

택시를 부르려면 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)
    }
}

자바

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)
    }
}

자바

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)
    }
}

자바

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>

검색어 기반 음악 재생

Google Voice Actions

  • "마이클 잭슨의 빌리진 재생해 줘"

검색어를 기반으로 음악을 재생하려면 INTENT_ACTION_MEDIA_PLAY_FROM_SEARCH 인텐트를 처리하세요. 앱이 실행될 수 있음 이 인텐트를 사용하여 음악을 재생할 수 있습니다. 이 작업을 수신하는 앱 인텐트는 기존 콘텐츠를 지정된 검색어와 일치시키기 위해 인벤토리 내에서 검색을 수행하고 콘텐츠를 재생할 수 있습니다.

이 인텐트에 EXTRA_MEDIA_FOCUS 문자열을 포함합니다. extra는 원하는 검색 모드를 지정합니다. 예를 들어, 검색 모드는 아티스트 이름 또는 노래 제목으로 검색할 수 있습니다

조치
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 (필수): 모든 조합을 포함하는 문자열입니다. 노래 제목, 장르 중 하나를 선택할 수 있습니다.

장르 - <ph type="x-smartling-placeholder">Audio.Genres.ENTRY_CONTENT_TYPE</ph>

특정 장르의 음악을 재생합니다.

추가적인 엑스트라:

  • "android.intent.extra.genre" (필수) - 장르입니다.
  • QUERY (필수): 장르입니다. 이 엑스트라는 항상 이전 버전과의 호환성을 위해 제공됩니다. 검색 모드에 대해 알지 못하는 기존 앱은 이 인텐트를 비정형 검색으로 만듭니다.

아티스트 - <ph type="x-smartling-placeholder">Audio.Artists.ENTRY_CONTENT_TYPE</ph>

특정 아티스트의 음악을 재생합니다.

추가적인 엑스트라:

  • EXTRA_MEDIA_ARTIST (필수): 아티스트.
  • "android.intent.extra.genre": 장르입니다.
  • QUERY (필수): 확인할 수 있습니다. 이 추가 항목은 이전 버전과의 호환성을 위해 항상 제공됩니다. 검색 모드에 대해 알지 못하는 기존 앱은 이 인텐트를 비구조화된 검색으로 처리할 수 있습니다.

앨범 - <ph type="x-smartling-placeholder">Audio.Albums.ENTRY_CONTENT_TYPE</ph>

특정 앨범의 음악을 재생합니다.

추가적인 엑스트라:

  • 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 (필수): 선택할 수 있습니다. 이 추가 항목은 이전 버전과의 호환성입니다. 검색 모드에 관해 모르는 기존 앱에서 이 작업을 처리할 수 있습니다. 인텐트를 비정형 검색으로 사용합니다.

재생목록 - Audio.Playlists.ENTRY_CONTENT_TYPE

특정 재생목록 또는 지정된 일부 기준에 부합하는 재생목록을 재생 추가할 수 있습니다.

추가적인 엑스트라:

  • 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)
    }
}

자바

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>

활동에서 이 인텐트를 처리할 때 새로 추가 EXTRA_MEDIA_FOCUS개 추가 가능 Intent: 검색 모드를 결정합니다. 액티비티에서 검색 모드가 확인되면 해당 검색 모드에 대해 추가적인 엑스트라의 값을 읽습니다. 앱은 이 정보를 사용하여 인벤토리 내에서 검색을 수행한 다음, 검색어에 일치하는 콘텐츠를 재생할 수 있습니다. 예를 들면 다음과 같습니다.

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 might 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)
            }
        }
    }
}

자바

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 might 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
노트의 텍스트를 나타내는 문자열입니다.

예시 인텐트:

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)
    }
}

자바

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 스킴을 사용합니다. 전화 앱이 열리면 전화번호가 표시되고 사용자가 통화 버튼을 탭하여 전화 통화를 시작해야 합니다.

Google Voice Actions

  • "555-5555번으로 전화해 줘"
  • "call bob"
  • "음성사서함에 전화해 줘"

직접 전화를 걸려면 ACTION_CALL 작업을 사용합니다. 다음 URI 스키마를 사용하여 전화번호를 지정합니다. 전화 앱이 열리면 에서 전화 통화를 시작합니다. 사용자는 전화 버튼을 탭하지 않아도 됩니다.

ACTION_CALL 작업을 사용하려면 CALL_PHONE 권한을 매니페스트 파일에 추가해야 합니다.

<uses-permission android:name="android.permission.CALL_PHONE" />
조치
데이터 URI 스키마
  • tel:<phone-number>
  • voicemail:<phone-number>
MIME 유형
없음

유효한 전화번호는 IETF RFC 3966에 정의되어 있는 것들입니다. 올바른 예는 다음과 같습니다.

  • tel:2125551212
  • tel:(212) 555 1212

전화 앱의 다이얼러는 전화번호와 같은 구성표를 정규화하는 데 적합합니다. 따라서 설명된 스키마는 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)
    }
}

자바

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);
    }
}

다음은 검색 앱의 일반적인 작업과 각 작업을 실행하는 앱의 기능을 광고하는 인텐트 필터를 만드는 데 필요한 정보를 보여줍니다.

특정 앱을 사용한 검색

Google Voice Actions

  • "myvideoapp에서 고양이 동영상 검색해 줘"

앱 컨텍스트 내에서 검색을 지원하려면 앱에서 인텐트 필터를 선언합니다. SEARCH_ACTION 작업을 호출합니다.

참고: 앱 검색에는 SEARCH_ACTION를 사용하지 않는 것이 좋습니다. 대신 GET_THING Google 어시스턴트에 내장된 인앱 검색 지원을 활용하는 것이 좋습니다. 자세한 내용은 Google 어시스턴트 앱 액션 문서를 참고하세요.

조치
"com.google.android.gms.actions.SEARCH_ACTION"
Google Voice Actions에서의 검색어를 지원합니다.
추가 항목
QUERY
검색어가 포함된 문자열입니다.

인텐트 필터 예시:

<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개.

조치
ACTION_WEB_SEARCH
데이터 URI 스키마
없음
MIME 유형
없음
추가 항목
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)
    }
}

자바

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);
    }
}

설정

앱이 사용자에게 무엇인가 변경할 것을 요구할 때 시스템 설정 앱에서 화면을 열려면 다음 인텐트 작업 중 하나를 사용하세요.

조치
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 유형
없음

예시 인텐트:

Kotlin

fun openWifiSettings() {
    val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

자바

public void openWifiSettings() {
    Intent intent = new Intent(Settings.ACTION_WIFI_SETTINGS);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }
}

문자 메시지

첨부파일이 있는 SMS/MMS 메시지를 작성하는 것은 문자 메시지 앱에서 일반적인 작업입니다. 다음 섹션의 정보를 사용하여 이 작업을 실행하는 앱의 기능을 광고하는 인텐트 필터를 만듭니다.

첨부 파일이 있는 SMS/MMS 메시지 작성

SMS 또는 MMS 문자 메시지를 시작하려면 다음 인텐트 작업 중 하나를 사용하고 다음 엑스트라 키를 사용하여 전화번호, 제목, 메시지 본문 등의 메시지 세부정보를 지정합니다.

조치
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 작업을 사용하는 경우 이 추가 항목은 ArrayList의 첨부할 이미지 또는 동영상을 가리키는 Uri 객체

인텐트 예:

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)
    }
}

자바

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:")  // Only SMS apps respond to this.
        putExtra("sms_body", message)
        putExtra(Intent.EXTRA_STREAM, attachment)
    }
    if (intent.resolveActivity(packageManager) != null) {
        startActivity(intent)
    }
}

자바

public void composeMmsMessage(String message, Uri attachment) {
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setData(Uri.parse("smsto:"));  // Only SMS apps respond to this.
    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을 로드하는 것은 웹브라우저 앱에서 일반적인 작업입니다. 인텐트 필터를 만들어 다음 섹션에 나와 있습니다.

웹 URL 로드

Google Voice Actions

  • "example.com 열어 줘"

웹페이지를 열려면 ACTION_VIEW 작업을 사용합니다. 인텐트 데이터에서 웹 URL을 지정합니다.

조치
ACTION_VIEW
데이터 URI 스키마
http:<URL>
https:<URL>
MIME 유형
"text/plain"
"text/html"
"application/xhtml+xml"
"application/vnd.wap.xhtml+xml"

예시 인텐트:

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)
    }
}

자바

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 App Links 처리

Android 12(API 수준 31)부터 일반 웹 인텐트는 앱이 웹 인텐트에 포함된 특정 도메인에 관해 승인된 경우에만 앱의 활동으로 확인됩니다. 앱이 도메인에서 승인되지 않은 경우 웹 인텐트가 사용자의 기본 브라우저 앱으로 확인됩니다.

Android 디버그 브리지로 인텐트 확인

지원하려는 인텐트에 앱이 응답하는지 확인하려면 다음을 실행하여 특정 인텐트를 실행하는 adb 도구 다음과 같습니다.

  1. 개발용 Android 기기 설정 또는 가상 기기를 사용하세요.
  2. 지원하고자 하는 인텐트를 처리하는 앱 버전을 설치하세요.
  3. 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
    
  4. 필요한 인텐트 필터를 정의한 경우 인텐트를 처리합니다.

자세한 내용은 셸 명령어 실행