使用 Headless Oracle Content Management 在 Java for Android 中建置影像庫
簡介
使用 Java 或 Kotlin 的 Android 開發環境是一項功能強大的工具,可用來建置使用 Oracle Content Management 內容的應用程式。使用正確的內容模型,您可以快速建立構成典型影像庫的 Android UI。
在本教學課程中,我們將運用 Oracle Content Management 作為無頭 (headless) CMS,使用 Java 建立適用於 Android 的簡單映像庫應用程式。此 Android 範例位於 GitHub 。教學課程包含三個步驟:
必要條件
繼續本教學課程之前,建議您先閱讀下列資訊:
若要依循此教學課程,您需要:
- Oracle Content Management 訂閱
- 具有「內容管理員」角色的 Oracle Content Management 帳戶
- 設定 Android 工具的 Windows 或 Mac 電腦
- 本教學課程假設您已經充分瞭解使用 Java 的通用 Android 開發概念,
我們正在打造什麼
我們的圖像庫將包括咖啡店提供多頁的食物和飲料。

類別是分類標準的子節點,可以組織成階層。對於影像庫,無論組織為何,我們都要顯示所有可用的分類。為了達成此目的,我們首先需要找出可用的分類標準,而這些分類標準是使用 Oracle Content Management 程式庫的 GetTaxonomiesRequest 類別來設定並提出要求。
注意:GetTaxonomiesRequest 的實作使用 REST API 資源 GET /published/api/v1.1/taxonomies 。
找到每個分類的分類標準集。這是使用 Oracle Content Management 程式庫的 GetTaxonomyCategoriesRequest 類別來完成。
注意:GetTaxonomyCategoriesRequest 的實作使用 REST API GET /published/api/v1.1/taxonomies/{id}/categories 。
對於每一個傳回的分類標準類別,我們會顯示一個包含類別名稱、類別中的影像數目,以及前四個影像的縮圖轉譯。

注意:除了公布要檢視的數位資產之外,您也必須將分類公布至管道。
若要繼續,您必須擁有 Oracle Content Management 的有效訂閱,並且以「內容管理員」角色登入。
步驟 1:準備 Oracle Content Management
本教學課程以您已建立資產儲存區域且目前有空白內容模型 (亦即,未建立任何內容類型) 的假設為基礎。
如果您尚未擁有 Oracle Content Management 執行處理,請參閱快速入門,瞭解如何註冊 Oracle Cloud、佈建 Oracle Content Management 執行處理,以及將 Oracle Content Management 設定為無頭 CMS。
對於此教學課程,您需要以兩種方式建立內容模型。有可下載的資產套件可供使用,將內容類型與相關內容填入您的空白儲存庫,或者您可以建立自己的內容模型與內容。
若要準備 Oracle Content Management:
建立通道和資產儲存區域
您必須先在 Oracle Content Management 中建立通道和資產儲存區域,才能發布內容。
在 Oracle Content Management 中建立通道和資產儲存區域:
以管理員身分登入 Oracle Content Management Web 介面。
從左側導覽功能表中選擇內容,然後從頁面標頭的選取清單中選擇發布管道。

在右上角,按一下建立 (Create) 以建立新通道。請為此教學課程命名通道 'OCEImageGalleryChannel',並讓存取保持公用。按一下儲存以建立管道。

在左側導覽功能表中選擇內容,然後從頁面表頭的選取清單中選擇儲存庫。

在右上角,按一下建立以建立新的資產儲存庫。請為此教學課程命名資產儲存區域 'OCEImageGalleryRepository'。

在發布通道欄位中,選取 OCEImageGalleryChannel 以向 Oracle Content Management 表示 OCEImageGalleryRepository 儲存區域中的內容可發布至 OCEImageGalleryChannel 通道。完成後按一下儲存。

匯入 Oracle Content Management 範例資產套件
您可以下載預先設定的 Oracle Content Management 範例資產套件,其中包含此教學課程的所有必要內容類型和資產。
您可以從 Oracle Content Management 範例資產套件上傳本教學課程中使用的內容複本。這可讓您對內容類型進行實驗並修改內容。下載資產套件封存 OCESamplesAssetPack.zip,並將其擷取至您選擇的目錄:
從 Oracle Content Management 下載頁面下載 Oracle Content Management 範例資產套件 (OCESamplesAssetPack.zip)。將下載的壓縮檔解壓縮至電腦上的位置。擷取之後,此位置將會包含一個名為 OCEImageGallery_data.zip 的檔案。
以管理員身分登入 Oracle Content Management Web 介面。
在左側導覽功能表中選擇內容,然後從頁面表頭的選取清單中選擇儲存庫。現在選取 OCEImageGalleryRepository ,然後按一下動作列上方的匯入內容按鈕。

將本機電腦中的 OCEImageGallery_data.zip 上傳至文件資料夾。

上傳後,請選取 OCEImageGallery_data.zip ,然後按一下確定,將內容匯入資產儲存庫。

順利匯入內容之後,請瀏覽至資產頁面,然後開啟 OCEImageGalleryRepository 儲存庫。您會看到所有相關的影像和內容項目現在都已新增至資產儲存庫。

按一下左上方的全選,然後按一下發布,將所有匯入的資產新增至稍早建立的發布通道 OCEImageGalleryChannel。

發布之前,您需要驗證所有資產。首先,將 OCEImageGalleryChannel 新增為選取的通道,然後按一下 [ 驗證 ] 按鈕。

資產經過驗證之後,按一下右上角的發布按鈕,將所有資產發布至選取的管道。

完成之後,您可以在資產頁面上查看所有已發布的資產。(您可以透過資產名稱上方的圖示來說明。)

匯入 Oracle Content Management 範例資產套件之後,您可以開始在 Android Studio 中建立影像庫。
上傳您自己的映像檔資產
本教學課程使用名為 'OCEImageGalleryRepository' 的資產儲存庫建立我們的網站首頁。此首頁包含標題「影像集」以及內含影像資產的影像集合相簿。

新增影像資產至詳細目錄展示資產儲存庫:
登入 Oracle Content Management Web 介面。
按一下左側導覽功能表中的資產。
開啟 OCEImageGalleryRepository 儲存庫。
按一下頁面右上角的新增,將影像資產新增至圖庫資產儲存區域。

從本機電腦上傳自己的新資產,或選擇 Oracle Content Management 中已有的資產。
建立分類標準並將其連結至影像資產
您必須在 Oracle Content Management 中建立分類,然後將分類指派給儲存庫中的資產。
在 Oracle Content Management 中建立分類:
以管理員身分登入 Oracle Content Management Web 介面。
在左側導覽功能表中選擇內容,然後從頁面標頭的選取清單中選擇分類。

在右上角,按一下建立以建立新的分類。為此教學課程命名通道 'OCEImageGalleryTaxonomy'。

按一下建立。
現在請新增類別以建立分類。按一下新增類別。

將上階分類項目命名為「食品」,並新增下列下階分類:
- 早餐
- 甜點
- 飲料
- 三明治
按一下畫面右上方的完成。

在「分類」頁面上,選取 OCEImageGalleryTaxonomy 分類標準,然後按一下動作列中的升級,使其可用於您的資產儲存庫。

接下來,編輯 OCEImageGalleryRepository 儲存區域,以啟用該儲存庫的 OCEImageGalleryTaxonomy 分類:
以管理員身分登入 Oracle Content Management Web 介面。
在左側導覽功能表中選擇內容,然後從頁面表頭的選取清單中選擇儲存庫。
選取和編輯 OCEImageGalleryRepository 儲存區域。
在分類欄位中,選取 OCEImageGalleryTaxonomy,以便將該分類的分類指派給 OCEImageGalleryRepository 儲存庫中的資產。

按一下儲存。
然後,將分類標準分類指派給 OCEImageGalleryRepository 儲存庫中的每個影像資產:
登入 Oracle Content Management Web 介面。
按一下左側導覽功能表中的資產。
開啟 OCEImageGalleryRepository 儲存庫。
選取一或多個影像資產,按一下動作列中的其他,然後從功能表中選擇類別。

在「類別」面板中,按一下新增類別。搜尋搜尋列中的類別名稱,或從分類階層結構中選取類別,然後按一下新增以指派選取的類別。您可以將多個分類指定給資產。

完成指派分類標準給所有影像資產之後,請選取儲存區域中的所有資產,然後將它們發布到 OCEImageGalleryChannel 通道。
步驟 2:在 Android Studio 中建置影像庫
若要在 Android 應用程式中使用 Oracle Content Management 內容,您可以使用 Android 影像庫範例,在 GitHub 上以開放原始碼儲存區域的形式提供此範例。
注意:請記住,使用 Android 範例是選擇性的,在此教學課程中使用它可讓您快速上手。您也可以建置自己的應用程式。
若要在 Android Studio 中建置影像庫,請執行下列動作:
- 複製範例儲存區域 Android SDK,然後在本機發布 SDK
- 在 Android Studio 中開啟 Android 範例
- 使用 Oracle Content Management REST API 擷取內容
複製範例儲存區域、Android SDK,然後在本機發布 SDK
Android 藝廊範例可作為 GitHub 上的開放原始碼儲存庫。
您首先需要將範例從 GitHub 複製到本機電腦,如果還沒有從 GitHub 複製 Android SDK。
當您擁有範例程式碼和 SDK 之後,為了在範例專案中使用 Android SDK,您應該在您的本機 Maven 儲存區域中建立並發布此 SDK,以便範例專案能夠使用該 SDK。在 Android Studio 中開啟 Android SDK 專案並執行 publishToMavenLocal 作業,以建立 SDK 並將其發布至您的本機 Maven 儲存區域。
在 Android Studio 中開啟 Android 範例
與任何 Android 應用程式一樣,您需要將它匯入 Android Studio,以便在 Android 模擬器或裝置中從該處建立並執行。範例程式碼已經與伺服器預先設定,以及用於取得詳細目錄展示應用程式資料的發布通道。
使用 Oracle Content Management REST API 擷取內容
REST API for Content Delivery 可存取 Oracle Content Management 中發布的資產。已發布的資產包括內容項目和數位資產,以及它們的轉譯。我們現在可以運用 REST API for Content Management 擷取內容,讓我們能夠在藝廊應用程式中呈現此內容。
src/.../samples/gallery/MainActivity.java 檔案具有建立 ContentDeliveryClient 物件的功能,供要求物件呼叫 REST API 時使用。下方函數是範例應用程式中,顯示目前使用之值的簡化的函數版本。
void createDeliveryClient() {
// inti and customize the SDK settings
ContentSettings contentSettings = new ContentSettings();
// initialize the cache settings (optional configured via settings in sample)
contentSettings.setCacheSettings(new CacheSettings(context.getCacheDir()));
// set the host and channel token
String channelToken = "e0b7b1e6421e78189345448deaddb091";
String host = "https://headless.mycontentdemo.com";
// create client API we'll use in request objects to make SDK calls
deliveryClient = ContentSDK.createDeliveryClient(
host, channelToken, contentSettings);
}使用 Oracle Content SDK 要求首頁資料
注意:初始首頁的 SDK 呼叫順序在 GalleryHomePageRepository.java 中。
起始頁面需要幾次資料呼叫,頁面才能正確顯示:
- 首先,我們會載入先前提供之通道記號的分類。
- 針對傳回的每個分類,我們都會取得該分類中的所有分類。
- 針對每個傳回的類別,我們會取得該類別中的資產清單。
- 會下載每個類別前四個項目的中和縮圖轉譯影像 URL。

初始資料擷取的進入點是 GalleryHomePageRepository.java 中的 fetchHomePageData() 方法。這個方法會在個別的執行緒上執行一系列的同步 SDK 呼叫,然後透過回呼以非同步方式傳回結果。
使用 GetTaxonomiesRequest 類別與 fetch() 方法擷取初始分類資料,如下所示。
// create request to get list of taxonomies, limiting the number of results to 10 max
GetTaxonomiesRequest request = new GetTaxonomiesRequest(deliveryClient).limit(10);
// get the list of taxonomies synchronously
ContentResponse<TaxonomyList> response = request.fetch();請注意,所有 API 都使用以 ContentDeliveryClient 物件作為參數建立要求物件的樣式。
limit(<value>) 產生器方法可供使用,因為 GetTaxonomiesRequest 會擴充用於任何取得資料清單之要求的一般 PaginatedListRequest 類別。
我們在此使用 request.fetch(),因為已經建立個別的執行緒來依序進行多個 SDK 呼叫。在另一個區段中,有一個使用非同步 SDK 呼叫的範例。
我們的要求順利完成之後,我們就會取得類型為 ContentResponse<TaxonomyList> 的物件。如果 response.isSuccess() 為 true,則分類 TaxonomyList 的清單來自 getResult() 方法。
接下來,我們需要取得可用的分類類別清單。我們仍在為 SDK 呼叫建立的個別執行緒中,所以下次呼叫也是根據分類標準 ID 取得分類標準類別清單的同步呼叫。
// get list of taxonomy categories based on the taxonomy id
GetTaxonomyCategoriesRequest categoriesRequest =
new GetTaxonomyCategoriesRequest(deliveryClient, taxonomy.getId());
// get list synchronously
ContentResponse<TaxonomyCategoryList> response = categoriesRequest.fetch();
// get the list from the response (assuming successful)
TaxonomyCategoryList categoryList.getItems = response.getResult();針對每個分類,我們需要遵循相同的一般處理來取得與分類相關聯的資產清單,方法是進行搜尋要求以搜尋分類節點識別碼的相符資產。
// go through each category to get list of assets for that category
for(TaxonomyCategory category : categoryList.getItems()) {
// setup search request to match "Image" type and the category node id
SearchAssetsRequest assetsRequest = new SearchAssetsRequest(deliveryClient)
.type(AssetType.TYPE_ASSET_IMAGE)
.taxonomyCategoryNodeId(category.getId());
// synchronous request to get matching assets
ContentResponse<AssetSearchResult> searchResponse = assetsRequest.fetch();
// search result from the response
AssetSearchResult searchResult = searchResponse.getResult();
// get the list of digital assets
List<DigitalAsset> digitalAssetList = searchResult.getDigitalAssets();
}最後,對於類別中的前四個資產,我們會產生 URL 來下載大型影像的媒體轉譯與三個小型影像的縮圖轉譯。
URL 可以用來使用您偏好的 Android 影像程式庫來轉譯影像,但範例使用常見的開源程式庫 Glide。
// (the sample code verifies that there are at least 4 images in the list)
// get the medimum rendition image url for the first main image from the list.
String mainImageUrl = digitialAssetList.get(0).getRenditionUrl(RenditionType.Medium);
// example code using Glide to render the main image into an ImageView
Glide.with(context).load(mainImageUrl).into(mainImageView);
// get the thumbnail rendition for the other 3 images
String smallImageUrl1 = digitialAssetList.get(1).getRenditionUrl(RenditionType.Thumbnail);
String smallImageUrl2 = digitialAssetList.get(2).getRenditionUrl(RenditionType.Thumbnail);
String smallImageUrl3 = digitialAssetList.get(3).getRenditionUrl(RenditionType.Thumbnail);
// load small images using Glide, etc...取得詳細目錄展示頁面與影像預覽
包含類別中所有影像預覽的頁面,會使用非同步要求來要求所有符合類別節點 ID 的影像。

非同步呼叫使用為回應指定的回呼方法完成,如下所示。此程式碼的完整版本位於 GalleryPhotosFragment.java 檔案中。
public void fetchDigitalAssets() {
// search for all matching image assets for the specific category node id
SearchAssetsRequest assetsRequest = new SearchAssetsRequest(getDeliveryClient())
.type(AssetType.TYPE_ASSET_IMAGE)
.taxonomyCategoryNodeId(categoryNodeId);
// fetch the results asynchronously and call the specified method when done
assetsRequest.fetchAsync(this::showDigitalAssets);
}
public void showDigitalAssets(ContentResponse<AssetSearchResult> response) {
// handle errors if response.isSuccess is false otherwise process results...
}當您按一下特定影像時,完整大小的預覽會使用檔案的原生轉譯。

若為 digitalAsset 物件,您會取得原生轉譯 URL 並轉譯成 Glide,如下所示:
String fullSizeImageUrl = digitalAsset.getRenditionUrl(RenditionType.Native);
// example using Glide to render the main image into an ImageView
Glide.with(context).load(fullSizeImageUrl).into(fullSizeImageView);步驟 3:執行應用程式
現在我們建置了 Android 版圖庫應用程式,因此需要在 Android Studio 的行動模擬器或裝置中進行測試,如此我們才能對任何問題進行除錯,並在上線前預覽應用程式。
結論
在本教學課程中,我們建立了一個 Android 圖像庫應用程式,可在 Github 上找到。此應用程式使用 Oracle Content Management 作為無頭 CMS。在設定並設定 Oracle Content Management 與圖庫網站教學課程的發布內容通道之後,我們會執行應用程式以擷取必要的內容。
瞭解文件中重要的 Oracle Content Management 概念。
您可以在 Oracle Help Center 的 Oracle Content Management 範例頁面上找到更多範例。