[7] 다른 앱과 연동하기 [2] 액티비티로부터 결과 얻기

Getting a Result from an Activity

THIS LESSON TEACHES YOU TO

  1. Start the Activity
  2. Receive the Result

YOU SHOULD ALSO READ


Starting another activity doesn’t have to be one-way. You can also start another activity and receive a result back. To receive a result, call startActivityForResult() (instead of startActivity()).

다른 액티비티를 시작하는 방법이 하나만 있는게 아니죠. 다른 액티비티를 시작하고, 거기로부터 결과를 받을 수 있습니다. 결과를 받기 위해서 startActivityForResult() 를 사용합니다.

For example, your app can start a camera app and receive the captured photo as a result. Or, you might start the People app in order for the user to select a contact and you’ll receive the contact details as a result.

예를 들어, 우리 앱이 카메라 앱을 시작할 수 있고, 그 앱으로부터 캡쳐된 사진을 결과로써 받을 수 있습니다. 또, People 앱을 사용자가 연락처를 선택하기 위해 실행하고, 그로부터 연락처 정보를 받을 수 있습니다.

Of course, the activity that responds must be designed to return a result. When it does, it sends the result as another Intentobject. Your activity receives it in the onActivityResult() callback.

당연히도, 우리가 호출할 그 액티비티는 반드시 결과를 리턴하게 설계되어야 겠지요. 그래서 실행할 때, 다른 Intent 오브젝트를 보내게 됩니다. 우리의 액티비티는 onActivityResult() 콜백에서 이 오브젝트를 수신하게 됩니다.

Note: You can use explicit or implicit intents when you callstartActivityForResult(). When starting one of your own activities to receive a result, you should use an explicit intent to ensure that you receive the expected result.

노트: 우리가 startActivityForResult()를 사용할 때,  명시적이거나 암시적인 인텐트를 사용할 수 있습니다. 우리의 앱의 액티비티중 하나가 결과를 받기 위해 시작되면, 명시적인 인텐트를 사용해야 합니다. 예상된 결과를 수신하기 위해서지요.

Start the Activity


There’s nothing special about the Intent object you use when starting an activity for a result, but you do need to pass an additional integer argument to the startActivityForResult() method.

액티비티를 결과를 위해 시작할 때 사용하는 인텐트 오브젝트는 별다른 것은 없습니다. 하지만 여기에 추가적으로 숫자 값을 startActivityForResult() 메서드에 전달해 줘야 합니다.

The integer argument is a “request code” that identifies your request. When you receive the result Intent, the callback provides the same request code so that your app can properly identify the result and determine how to handle it.

정수 값 인자는 “request code” 입니다. 이 것은 우리의 요청을 확인하지요. 우리가 결과 인텐트를 수신할 때, 콜백은 그 숫자와 같은 요청 코드를 제공합니다. 그래서 우리의 앱이 알맞게 결과를 확인할 수 있게 합니다. 그리고 어떻게 다룰 지 정하지요.

For example, here’s how to start an activity that allows the user to pick a contact:

어떻게 액티비티를 시작하는지 알아봅니다. 이 액티비티는 사용자가 연락처를 고를 수 있게 합니다.

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

Receive the Result


When the user is done with the subsequent activity and returns, the system calls your activity’s onActivityResult()method. This method includes three arguments:

사용자가 다음의 액티비티를 끝내고 리턴할 때, 시스템은 우리의 액티비티의 onActivityResult() 메서드를 호출합니다. 이 메서드는 3개의 인자를 갖고 있습니다.

  • The request code you passed to startActivityForResult().
  • A result code specified by the second activity. This is either RESULT_OK if the operation was successful orRESULT_CANCELED if the user backed out or the operation failed for some reason.
  • An Intent that carries the result data.
  • 우리가 보냈던 요청 코드 – startActivityForResult() 에 넘겨준 그 코드
  • 결과 코드 – 두 번째 액티비티(위의 예에서는 전화번호부) 에서 규정하는 코드 – 이 값은 RESULT_OK 나 RESULT_CANCELED 값이 될 수 있습니다. RESULT_CANCELED 는 비 정상적으로 종료되었거나 하는 등, 잘못되었을 때 발생합니다.
  • 인텐트 – 결과 데이터를 전달하는 인텐트입니다.

For example, here’s how you can handle the result for the “pick a contact” intent:

어떻게 결과를 다루는지 알아봅니다. “pick a contact” 인텐트의 결과를 다룹니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to : 
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful : 
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

In this example, the result Intent returned by Android’s Contacts or People app provides a content Uri that identifies the contact the user selected.

이 예제에서, 안드로이드 전화번호부로부터 리턴된 결과 인텐트는 연락처를 Uri를 제공해 줍니다.  이 것은 사용자가 선택했던 그 연락처이죠.

In order to successfully handle the result, you must understand what the format of the result Intent will be. Doing so is easy when the activity returning a result is one of your own activities. Apps included with the Android platform offer their own APIs that you can count on for specific result data. For instance, the People app (Contacts app on some older versions) always returns a result with the content URI that identifies the selected contact, and the Camera app returns a Bitmap in the "data" extra (see the class about Capturing Photos).

결과를 성곡적으로 다루기 위해서, 반드시 이해해야 할 것이 있습니다. 결과 인텐트가 어떤 포맷이 될 지를 잘 알아야 합니다.  결과를 리턴하는 액티비티가 우리의 액티비티 중 하나일 때 하는 것은 쉽습니다. 안드로이드 플래폼에 포함된 앱은 자신의 API를 제공하는데요, 우리가 특정 결과 데이터와 맞추는 것입니다. 예를 들어, 연락처 앱은 언제나 결과로써 연락처 URI를 리턴합니다. 이 것은 선택한 연락처입니다. 그리고 카메라 앱은 Bitmap 을 “data” extra 에 담아서 보내지요.

Bonus: Read the contact data

The code above showing how to get a result from the People app doesn’t go into details about how to actually read the data from the result, because it requires more advanced discussion about content providers. However, if you’re curious, here’s some more code that shows how to query the result data to get the phone number from the selected contact:

위의 코드는 어떻게 결과를 피플 앱으로

위의 코드는 그렇게 자세히 실제로 어떻게 데이터를 읽는지는 나와있지 않습니다. content providers 에 대해 좀 더 많이 알아야 하기 때문이지요. 하지만 궁금하다면, 여기 코드가 좀 더 있습니다. 어떻게 결과 데이터를 쿼리해서 전화번호를 획득하는지 알 수 있습니다.

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request it is that we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // Get the URI that points to the selected contact
            Uri contactUri = data.getData();
            // We only need the NUMBER column, because there will be only one row in the result
            String[] projection = {Phone.NUMBER};

            // Perform the query on the contact to get the NUMBER column
            // We don't need a selection or sort order (there's only one result for the given URI)
            // CAUTION: The query() method should be called from a separate thread to avoid blocking
            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
            // Consider using CursorLoader to perform the query.
            Cursor cursor = getContentResolver()
                    .query(contactUri, projection, null, null, null);
            cursor.moveToFirst();

            // Retrieve the phone number from the NUMBER column
            int column = cursor.getColumnIndex(Phone.NUMBER);
            String number = cursor.getString(column);

            // Do something with the phone number...
        }
    }
}

Note: Before Android 2.3 (API level 9), performing a query on the Contacts Provider (like the one shown above) requires that your app declare the READ_CONTACTS permission (see Security and Permissions). However, beginning with Android 2.3, the Contacts/People app grants your app a temporary permission to read from the Contacts Provider when it returns you a result. The temporary permission applies only to the specific contact requested, so you cannot query a contact other than the one specified by the intent’s Uri, unless you do declare the READ_CONTACTS permission.

노트: 안드로이드 2.3 (API 9) 이전에는, Contacts Provider 에 쿼리를 수행하는 것은 READ_CONTACTS 권한을 등록해야만 했습니다. 하지만 2.3 버전부터 Contacts/People 앱은 우리의 앱이 임시적으로 권한을 갖도록 승인했습니다. 임시적으로 Contact Provider 가 결과를 리턴할 때만 권한을 갖도록 하는거죠. 임시 권한은 특정 연착처 요청에 대해서만 적용되었습니다. 그래서 우리는 연락처를 다른 곳에 날릴 수 없습니다. (이게 맞는 말인가요? )


답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중