lightbulb_outline Please take our October 2018 developer survey. Start survey

從應用行為顯示取得結果

啟動其他應用行為顯示不必是單向作業。您也可以啟動其他應用行為顯示,然後接收傳回的結果。 若要接收結果,請呼叫 startActivityForResult() (而非 startActivity())。

例如,您的應用程式可以啟動相機應用程式,然後接收所拍攝的相片作為結果。或者,您可以啟動人員應用程式 (以便讓使用者選取連絡人),然後接收作為結果的連絡人詳細資料。

當然,必須將提供回應的應用行為顯示設計為傳回結果。執行時,該應用行為顯示會以其他 Intent 物件的形式傳送結果。 您的應用行為顯示會在 onActivityResult() 回呼中接收該結果。

注意:呼叫 startActivityForResult() 時,您可以使用明確或隱含的意圖。 啟動您的其中一個應用行為顯示以接收結果時,您應使用明確的意圖,以確保收到預期結果。

啟動應用行為顯示

啟動應用行為顯示以接收結果時,您使用的 Intent 物件沒有任何特殊之處,但是您需要將附加整數引數傳遞至 startActivityForResult() 方法。

該整數引數是識別您要求的「要求代碼」。在您接收結果 Intent 時,回呼會提供同一要求代碼,以便您的應用程式可以正確識別結果並判斷如何處理結果。

例如,以下展示了如何啟動應用行為顯示 (使用者可藉此挑選連絡人):

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

接收結果

使用者處理隨後的應用行為顯示並返回時,系統會呼叫應用行為顯示的 onActivityResult() 方法。 此方法包括三個引數:

例如,以下為您展示了如何處理「挑選連絡人」意圖的結果:

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

在此範例中,由 Android 的連絡人或人員應用程式傳回的結果 Intent 可提供內容 Uri (能識別使用者所選取的連絡人)。

若要成功處理結果,您必須了解結果 Intent 將採用的格式。 若傳回結果的應用行為顯示是您的其中一個應用行為顯示,上述作業會非常簡單。 Android 平台隨附的應用程式會針對特定結果資料提供您可以依賴的 API。 例如,人員應用程式 (某些舊版上的連絡人應用程式) 會始終傳回含內容 URI (可識別選取的連絡人) 的結果,相機應用程式會在 "data" 額外項目中傳回 Bitmap (請參閱有關拍攝相片的課程)。

額外說明:讀取連絡人資料

上述程式碼展示如何從人員應用程式取得結果,並未詳述如何實際讀取結果的資料,因為這需要進行更高級的 內容提供者相關討論。 但是,若您對此感到好奇,以下提供了另外一些程式碼,這些程式碼會展示如何查詢結果資料,以便取得所選連絡人的電話號碼:

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

注意:在 Android 2.3 (API 級別為 9) 版之前,若在 Contacts Provider (例如以上所示) 上執行查詢,需要您的應用程式宣告 READ_CONTACTS 權限 (請參閱安全性與權限)。 但是,從 Android 2.3 版開始,在連絡人提供者傳回結果時,連絡人/人員應用程式會為您的應用程式授予讀取連絡人提供者的臨時權限。 該臨時權限僅適用於要求的特定連絡人,因此除非您已宣告 READ_CONTACTS 權限,否則無法查詢並非由意圖的 Uri 指定的連絡人。