Il capitolo 7 dell'esercitazione utilizza un'app mobile Android nativa per utilizzare contenuti da AEM Content Services.
Questa esercitazione utilizza un app mobile nativa semplice per utilizzare e visualizzare il contenuto Evento esposto da AEM Content Services.
L'uso di Android è in gran parte poco importante e l'app mobile consueta può essere scritta in qualsiasi framework per qualsiasi piattaforma mobile, ad esempio iOS.
Android è utilizzato per tutorial a causa della capacità di eseguire un emulatore Android su Windows, macOs e Linux, la sua popolarità, e che può essere scritto come Java, un linguaggio ben capito dagli sviluppatori AEM.
L’app mobile Android del tutorial ènotinteso per istruire su come creare app Android Mobile o trasmettere le best practice di sviluppo Android, ma piuttosto per illustrare come AEM Content Services può essere utilizzato da un’applicazione mobile.
Se AEM Publish non viene eseguito su http://localhost:4503 l’host e la porta possono essere aggiornati nell’app mobile Settings per puntare alla proprietà host/porta di AEM Publish.
Questa sezione evidenzia il codice dell’app mobile Android che più interagisce e dipende da AEM Content Services e dall’output JSON di .
Al caricamento, l'app mobile esegue HTTP GET
a /content/wknd-mobile/en/api/events.model.json
che è il punto finale di AEM Content Services configurato per fornire il contenuto per l'app mobile.
Perché il modello modificabile dell'API degli eventi (/content/wknd-mobile/en/api/events.model.json
) è bloccata, l’app mobile può essere codificata per cercare informazioni specifiche in posizioni specifiche nella risposta JSON.
HTTP GET
richiedi ad AEM Publish all'indirizzo /content/wknd-mobile/en/api/events.model.json
per raccogliere il contenuto e compilare l’interfaccia utente dell’app mobile.Di seguito è riportata una distillazione del codice nell’app mobile MainActivity
responsabile della chiamata a AEM Content Services per raccogliere il contenuto che guida l’esperienza di app mobile.
protected void onCreate(Bundle savedInstanceState) {
...
// Create the custom objects that will map the JSON -> POJO -> View elements
final List<ViewBinder> viewBinders = new ArrayList<>();
viewBinders.add(new LogoViewBinder(this, getAemHost(), (ImageView) findViewById(R.id.logo)));
viewBinders.add(new TagLineViewBinder(this, (TextView) findViewById(R.id.tagLine)));
viewBinders.add(new EventsViewBinder(this, getAemHost(), (RecyclerView) findViewById(R.id.eventsList)));
...
initApp(viewBinders);
}
private void initApp(final List<ViewBinder> viewBinders) {
final String aemUrl = getAemUrl(); // -> http://localhost:4503/content/wknd-mobile/en/api/events.mobile.json
JsonObjectRequest request = new JsonObjectRequest(aemUrl, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
for (final ViewBinder viewBinder : viewBinders) {
viewBinder.bind(response);
}
}
},
...
);
}
onCreate(..)
è l'hook di inizializzazione per l'app mobile e registra i 3 dati personalizzati ViewBinders
responsabile dell’analisi del JSON e dell’associazione dei valori al View
elementi.
initApp(...)
viene quindi chiamato , che invia la richiesta HTTP GET al punto finale di AEM Content Services su AEM Publish per raccogliere il contenuto. Dopo aver ricevuto una risposta JSON valida, la risposta JSON viene passata a ogni ViewBinder
che è responsabile dell’analisi del JSON e del suo binding al cellulare View
elementi.
Ora esamineremo il LogoViewBinder
, che è semplice, ma evidenzia diverse considerazioni importanti.
public class LogoViewBinder implements ViewBinder {
...
public void bind(JSONObject jsonResponse) throws JSONException, IOException {
final JSONObject components = jsonResponse.getJSONObject(":items").getJSONObject("root").getJSONObject(":items");
if (components.has("image")) {
final Image image = objectMapper.readValue(components.getJSONObject("image").toString(), Image.class);
final String imageUrl = aemHost + image.getSrc();
Glide.with(context).load(imageUrl).into(logo);
} else {
Log.d("WKND", "Missing Logo");
}
}
}
La prima riga di bind(...)
naviga verso il basso nella risposta JSON tramite le chiavi :items → root → :items che rappresenta il Contenitore di layout AEM a cui sono stati aggiunti i componenti.
Da qui viene effettuato un controllo per una chiave denominata immagine, che rappresenta il componente Immagine (ancora una volta, è importante che il nome del nodo → Chiave JSON sia stabile). Se questo oggetto esiste, viene letto e mappato al POJO immagine personalizzata via il Jackson ObjectMapper
libreria. L'immagine POJO è illustrata di seguito.
Infine, il logo src
viene caricato in Android ImageView utilizzando Glide biblioteca di aiuto.
Tieni presente che è necessario fornire lo schema, l’host e la porta AEM (tramite aemHost
) all’istanza AEM Publish come AEM Content Services fornirà solo il percorso JCR (ad es. /content/dam/wknd-mobile/images/wknd-logo.png
) al contenuto a cui si fa riferimento.
Anche se facoltativo, l'uso del Mapper oggetto Jackson Oppure funzionalità simili fornite da altre librerie come Gson, aiutano a mappare strutture JSON complesse a Java POJOs senza il tedio di trattare direttamente con gli oggetti JSON nativi stessi. In questo semplice caso mappiamo la src
della image
oggetto JSON, al src
nell’immagine POJO direttamente tramite il @JSONProperty
annotazione.
package com.adobe.aem.guides.wknd.mobile.android.models;
import com.fasterxml.jackson.annotation.JsonProperty;
public class Image {
@JsonProperty(value = "src")
private String src;
public String getSrc() {
return src;
}
}
Il POJO evento, che richiede la selezione di molti più punti dati dall'oggetto JSON, beneficia di questa tecnica più della semplice immagine, che tutto ciò che vogliamo è la src
.
Ora che hai capito come AEM Content Services è in grado di promuovere l’esperienza mobile nativa, utilizza ciò che hai imparato a eseguire i seguenti passaggi e osserva le modifiche che si riflettono nell’app mobile.
Dopo ogni passaggio, effettua il pull-to-refresh the Mobile App e verifica l’aggiornamento dell’esperienza mobile.
Hai completato l'esercitazione AEM Headless!
Per ulteriori informazioni su AEM Content Services e AEM come CMS headless, visita la documentazione e il materiale di abilitazione di Adobe: