lightbulb_outline Help shape the future of the Google Play Console, Android Studio, and Firebase. 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 指定的連絡人。