Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Podobne dokumenty
Systemy operacyjne na platformach mobilnych

Programowanie urządzeń mobilnych. dr inż. Juliusz Mikoda

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Android - Kontakty. Łukasz Dudzioski

Fragmenty są wspierane od Androida 1.6

Obsługa SMS i telefonii

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 7 Wykorzystanie układu LinearLayout

AndroidManifest.xml. Plik manifestu opisuje podstawowe charakterystyki aplikacji i definiuje jej komponenty.

[Android] Podstawy programowania

Laboratorium Systemów Mobilnych. Wykład 1

Laboratorium Systemów Mobilnych. Wykład 2

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Podstawowe elementy GUI - zadania

akademia androida Service, BroadcastReceiver, ContentProvider część IV

Wyświetlanie danych na listach

Wykorzystanie plików

Programowanie urządzeń mobilnych w systemie Android. Ćwiczenie 8 Wykorzystanie układu RelativeLayout

SQLite w systemie Android. Własny dostawca treści. Materiał teoretyczny

Programowanie urządzeń mobilnych. dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Mechanizm zapisu preferencji

Tworzenie dialogów i wykorzystanie klasy Toast

Tworzenie wydajnych interfejsów. Autorzy: Piotr Michałkiewicz, 2 rok AiR Daniel Maksymow, 2 rok Informatyki

Szybciej (pisać) Łatwiej (czytać) Prościej (utrzymywać) Marcin Wąsowski Amsterdam Standard Sp. z o.o.

Programowanie Urządzeń Mobilnych. Laboratorium nr 9,10

Android pierwsza aplikacja

Powiadomienia w systemie Android

Systemy operacyjne na platformach mobilnych

Wyświetlanie danych na listach

Warsztaty v2 Layout y i widget y. Tomasz Wachowski Kamil Snopek Jan Romaniak

Systemy operacyjne na platformach mobilnych

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

akademia androida Składowanie danych część VI

JAVA : TELEFONY KOMÓRKOWE I ANDROID 1. WSTĘP

Mechanizm powiadomień

Mariusz Fraś. Instytut Informatyki. olitechnika Wrocławska. Systemy Wbudowane. Android. Dr inż. Mariusz Fraś. maf 1

Programowanie obiektowe

Wykorzystanie fragmentów i tabhost

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Mobilne aplikacje multimedialne

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie urządzeń mobilnych w systemie Android

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

akademia androida Intencje oraz URI część III

Wykorzystanie map i geolokalizacji

Android, wprowadzenie do SDK

Życie aktywności Nawigując przez aplikacje poszczególne Aktywności przechodzą pomiędzy stanami. Dla przykładu gdy aktywność uruchamia się po raz

Systemy operacyjne na platformach mobilnych

Systemy operacyjne na platformach mobilnych

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

PHP 5 język obiektowy

Szkolenie Android dla początkujących

Instrukcja implementacji sterownika wirtualnego portu szeregowego dla systemu Android. Opracowanie: Elzab Soft sp. z o.o.

Dokumentacja do API Javy.

Programowanie Urządzeń Mobilnych. Część II: Android. Wykład 2

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Tworzenie i wykorzystanie usług

Wykład 7: Pakiety i Interfejsy

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

Podstawowe elementy GUI - zadania

Programowanie obiektowe

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Przykłady zastosowań oraz optymalizacja działania komponentu ListView w aplikacjach dla urządzeń mobilnych z systemem Android

Programowanie obiektowe

Dynamiczne i wydajne tworzenie interfejsu. Piotr Michałkiewicz

Java: interfejsy i klasy wewnętrzne

akademia androida Http i AsyncTask część VII

Warsztaty Android, studenckie koło naukowe ISA 2

Polimorfizm. dr Jarosław Skaruz

dr Artur Bartoszewski dr Artur Bartoszewski - Aplikacje mobilne - Wykład

Programowanie Urządzeń Mobilnych. Laboratorium nr 7, 8

Metody dostępu do danych

Systemy Rozproszone. Spis treści. Temat projektu: Regułowy system analizujacy logi. autorzy: Rafał Sadłowski, Sebastian Falkus, Michał Różycki

Metody Metody, parametry, zwracanie wartości

Współbieżność w środowisku Java

Wzorce logiki dziedziny

UML a kod. C++, Java i C#

Klasy abstrakcyjne i interfejsy

Decorator (dekorator)

Aplikacje w środowisku Java

Metody dostępu do danych

grafika 2D i animacja obsługa rotacji i elementy 3D-OpenGL w Androidzie

Android poradnik programisty

Original edition copyright 2011 by Satya Komatineni, Dave MacLean, and Sayed Y. Hashimi All rights reserved

Programowanie obiektowe i zdarzeniowe

Android. Podstawy tworzenia aplikacji. Piotr Fulma«ski. March 4, 2015

Zaawansowane aplikacje WWW - laboratorium

WSTĘP DO ANDROIDA. Laboratorium

Przechowywanie danych

protected void onsaveinstancestate(bundle outstate); protected void onrestoreinstancestate(bundle savedinstancestate);

Wzorce Strukturalne. Adapter: opis. Tomasz Borzyszkowski

Builder (budowniczy) Cel: Przykład:

Enkapsulacja, dziedziczenie, polimorfizm

Tłumaczenie i adaptacja materiałów: dr Tomasz Xięski. Na podstawie prezentacji udostępnionych przez Victor Matos, Cleveland State University.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Programowanie obiektowe

Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

Aplikacja webowa w Javie szybkie programowanie biznesowych aplikacji Spring Boot + Vaadin

Metody dostępu do danych

Transkrypt:

Programowanie urządzeń mobilnych dr inż. Andrzej Grosser na podstawie wykładu dr inż. Juliusza Mikody

Kontrolka lista <!-- row_txt.xml --> <?xml version="1.0" encoding="utf-8"?> <TextView xmlns:android="http://schemas.android.com /apk/res/android" android:layout_height="wrap_content" android:layout_width="fill_parent" android:textsize="30dp"> </TextView> public class ListaShow extends ListActivity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); ArrayAdapter<String> aa = new ArrayAdapter<String>(this, R.layout.row_txt, new String[]{"Słońce", "Merkury", "Wenus", "Ziemia", "Mars", "Jowisz", "Saturn", "Uran", "Neptun", "Pluton" ); setlistadapter(aa);

Kontrolka lista <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ /pk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <ListView android:id="@+id/lista" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> public class ListaShow extends ListActivity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); ArrayAdapter<String> aa = new ArrayAdapter<String>(this, R.layout.row_txt, new String[]{"Słońce",..., "Pluton" ); ListView l = (ListView)findViewById(R.id.lista); l.setadapter(aa);

ListView podział wierszy android:divider element drawable służący do rozdzielenia wierszy listy, setdivider(drawable divider), getdivider(), android:dividerheight - wysokość elementu rozdzielającego, setdividerheight(int height), getdividerheight(), android:footerdividersenabled widoczny dolny element rozdzielajacy, android:headerdividersenabled widoczny górny element rozdzielający.

ListView nagłówek i stopka public void addheaderview (View v, Object data, boolean isselectable) ustawienie nagłówka listy, removeheaderview(view v) usunięcie nagłówka z listy public void addfooterview (View v, Object data, boolean isselectable) ustawienie stopki dla listy removefooterview(view v) usunięcie stopki z listy

Interface Cursor Interfejs pozwala na losowy dostęp do wyniku zapytania do bazy danych. Implementacja interface pozwala na odczyt: odczyt pozycji: getcount(), getposition() poruszanie się po odczytanych rekordach : move(int offset), movetofirst(), movetolast(), movetonext(), movetoposition(int position), movetoprevious(), określenia pozycji: isafterlast(), isbeforefirst(), isclosed(), isfirst(), islast()

Interface Cursor Implementacja interface pozwala na odczyt: informacji o kolumnach krotki (rekordu): getdouble(int columnindex), getfloat(int columnindex), getint(int columnindex), getlong(int columnindex), getshort(int columnindex), getstring(int columnindex) isnull(int column) Podklasy: AbstractCursor, AbstractWindowedCursor, CrossProcessCursor, CursorWrapper, MatrixCursor, MergeCursor, MockCursor, SQLiteCursor

Interface Cursor - podklasy MatrixCursor klasa pozwalająca zapisać dane w postaci tabeli. addrow(object[] columnvalues). MergeCursor Pozwala na powiązanie kilku kursorów w jeden ciągły. Konstrukcja: MergeCursor(Cursor[] cursors). SQLiteCursor kursor przeznaczony do operacji na bazie danych.

Adapter kursorów BaseAdapter klasa bazowa abstrakcyjna adapterów (dla komponentów ListView, GridView ), ArrayAdapter adapter prostych list danych, CursorAdapter klasa bazowa abstrakcyjna operująca na źródle danych typu cursor, ResourceCursorAdapter j.w. SimpleCursorAdapter adapter źródła danych typu cursor, SimpleAdapter adapter prostych list - map danych : List<? extends Map<String,?>>

Kontrola - siatka <!-- grid.xml --> <?xml version="1.0" encoding="utf-8"?> <GridView xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_height="fill_parent" android:layout_width="fill_parent" android:padding="10px" android:verticalspacing="10px" android:horizontalspacing="10px" android:numcolumns="2" android:stretchmode="columnwidth" android:gravity="center" android:id="@+id/datagrid"> </GridView> public class Grid extends Activity { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.grid); ArrayAdapter<String> aa = new ArrayAdapter<String>(this, R.layout.row_txt, new String[]{"Słońce", "Merkury", "Wenus", "Ziemia", "Mars", "Jowisz", "Saturn", "Uran", "Neptun", "Pluton" ); GridView gv = (GridView) this.findviewbyid(r.id.datagrid); gv.setadapter(aa);

Kontrolka lista rozszerzenia <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com /apk/res/android"> <ImageView android:id="@+id/icon" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/item" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/price" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>

Kontrolka lista rozszerzenia public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); String[] menucols = new String[] {"_id", "icon", "item", "price" ; int[] to = new int[] { -1, R.id.icon, R.id.item, R.id.price ; MatrixCursor menucursor = new MatrixCursor(menuCols); startmanagingcursor(menucursor); menucursor.addrow(new Object[] {1, R.drawable.icon_b, "Blue android", "$2.99" ); menucursor.addrow(new Object[] {2, R.drawable.icon_g, "Green android", "$3.99" ); menucursor.addrow(new Object[] {3, R.drawable.icon_r, "Red android", "$1.99" ); menucursor.addrow(new Object[] {4, R.drawable.icon_y, "Yellow android", "$4.99" ); menucursor.addrow(new Object[] {5, R.drawable.icon, "Normal android", "$3.19" ); SimpleCursorAdapter menuitems = new SimpleCursorAdapter( this, R.layout.menu_row, menucursor, menucols, to); setlistadapter(menuitems);

Kontrolka lista rozszerzenia protected void onlistitemclick( ListView parent, View view, int position, long id) { super.onlistitemclick( parent, view, position, id); if (view.isenabled()) { TextView text = (TextView) view.findviewbyid(r.id.price); text.settext(" SOLD " + text.gettext()); view.setenabled(false);

Kontrolka lista niestandardowa <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" > <Button android:layout_height="wrap_content" android:layout_width="fill_parent" android:onclick="zamknijokno" android:text="zamknij listę zakupów" /> <ListView android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/lista" /> </LinearLayout>

Kontrolka lista niestandardowa public class ListaShow extends Activity implements OnItemClickListener { public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.list); //... tworzenie kursora... MatrixCursor menucursor = new... ListView lv = (ListView) findviewbyid(r.id.lista); lv.setadapter(menuitems); lv.setonitemclicklistener(this); public void zamknijokno(view view) { finish(); public void onitemclick(adapterview<?> parent, View view, int position, long id) { if (view.isenabled()) { TextView text = (TextView) view.findviewbyid(r.id.price); text.settext(" SOLD " + text.gettext()); view.setenabled(false);

BaseAdapter własny adapter Własny adapter można uzyskać po zdefiniowaniu metod abstrakcyjnych klasy BaseAdapter. Klasa BaseAdapter implementuje wybrane metody interfejsów: ListAdapter klasa przeznaczona dla komponentów tworzonych na podstawie zestawu danych (ListView, GridView) SpinnerAdapter zestaw metod przeznaczonych dla komponentu Spinner

BaseAdapter własny adapter Metody które trzeba zaimplementować: public int getcount() - liczba elementów wyświetlanych na liście, public Object getitem(int position) dane powiązane z danym wierszem listy, public long getitemid(int position) id danego elementu listy public View getview(int position, View convertview, ViewGroup parent) tworzenie widoku elementów na liście: position pozycja na liście convertview element zachowany parent rodzic - lista

Kontrolka lista niestandardowa <!-- strings.xml --> <?xml version="1.0" encoding="utf-8"?> <resources> <!--... --> <drawable name="darkred"> #200000</drawable> <drawable name="darkblue"> #000020</drawable> </resources> public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); requestwindowfeature(window.feature_no_title); setcontentview(r.layout.list); ListView lv = (ListView) findviewbyid(r.id.lista); lv.setadapter(new ListMenuAdapter(this)); lv.setonitemclicklistener(this);

Kontrolka lista niestandardowa public class ListMenuAdapter extends BaseAdapter { protected LayoutInflater minflater; protected int[] images; protected String[] texts; protected String[] prices; public ListMenuAdapter(Context context) { minflater = LayoutInflater.from(context); images = new int[]{r.drawable.icon_b, R.drawable.icon_g, R.drawable.icon_r, R.drawable.icon_y, R.drawable.icon; texts = new String[]{"Blue android", "Green android", "Red android", "Yellow android", "Normal android"; prices = new String[]{ "$2.99", "$3.99", "$1.99", "$4.99", "$3.19"; public int getcount() { return 5; public Object getitem(int arg0) { return null; public long getitemid(int arg0) { return arg0;

Kontrolka lista niestandardowa public class ListMenuAdapter extends BaseAdapter { protected LayoutInflater minflater; protected int[] images; protected String[] texts; protected String[] prices; //... public View getview(int pos, View view, ViewGroup parent) { if (view == null) view = minflater.inflate(r.layout.menu_row, null); if (pos < getcount()) { TextView text = (TextView) view.findviewbyid(r.id.item); TextView price = (TextView) view.findviewbyid(r.id.price); ImageView img = (ImageView) view.findviewbyid(r.id.icon); text.settext(texts[pos]); price.settext(prices[pos]); img.setimageresource(images[pos]); if (pos % 2 == 0) else view.setbackgroundresource(r.drawable.darkred); view.setbackgroundresource(r.drawable.darkblue); return view;

Fragmenty Fragment przedstawia część interfejsu użytkownika w aktywności. Można połączyć kilka fragmentów w pojedynczej aktywności. Fragment posiada własny cykl życia. Wprowadzone w Android 3.0 (z myślą o tabletach).

Tworzenie fragmentów Klasa fragmentu musi dziedziczyć bezpośrednio lub pośrednio po klasie biblioteczne Fragment. Zawiera metody zwrotne: oncreate() - wywoływane, gdy system tworzy fragment oncreateview() - wywoływane, gdy istniej potrzeba odrysowania interfejsu użytkownika onpause() - wywoływane, jako pierwsza oznaka, tego że użytkownik zakończył pracę z fragmentem.

Klasy fragmentów DialogFragment wyświetla pływający dialog. ListFragment wyświetla listę elementów. PreferenceFragment wyświetla hierarchię obiektów Preference w postaci listy

Dodawanie fragmentów <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.articlelistfragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.articlereaderfragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>

Dodawanie programowe Można dodawać fragmenty, w każdej chwili, w której jest uruchomiona aktywność, wystarczy jedynie określić ViewGroup, w którym ma być umieszczony fragment. Operacje na fragmentach (takie jak ich dodawanie, usuwanie, zastępowanie) są wykonywane za pośrednictwem FragmentTransaction. Obiekt transakcji uzyskuje się za pośrednictwem FragmentManagera.

Dodawanie programowe FragmentManager fragmentmanager = getfragmentmanager(); FragmentTransaction fragmenttransaction = fragmentmanager.begintransaction(); Dodawanie fragmentu można zrealizować za pomocą metody add() ExampleFragment fragment = new ExampleFragment(); fragmenttransaction.add(r.id.fragment_container, fragment); fragmenttransaction.commit(); Metoda commit() zatwierdza zmiany.

Dostawcy treści Zarządzanie przepływem informacji w systemie android. Pełna lista dostawców dostępna jest pod http://developer.android.com/reference/a ndroid/provider/package-summary.html Contacts:.People, Phones, Photos, Groups MediaStore: Audio (Albums, Artists, Media, Playlists), Images (Media, Thumbnails), Video (Media, Thumbnails) Settings

Dostawcy treści kontakty 1 Odczytanie listy kontaktów // Zezwolenie odczytu listy kontaktów w AndroidManifest.xml <uses-permission android:name="android.permission.read_contacts"/> public class Dostawcy extends ListActivity { public void oncreate(bundle icicle) { super.oncreate(icicle); Cursor cursor = getcontentresolver().query(contactscontract.contacts.content_uri, null, null, null, null); String[] menucols = new String[]{ ContactsContract.Contacts.DISPLAY_NAME ; int[] to = new int[] { R.id.text ; SimpleCursorAdapter menuitems = new SimpleCursorAdapter(this, R.layout.text, cursor, menucols, to); setlistadapter(menuitems);

Dostawcy treści kontakty 2 ContentResolver getcontentresolver(); - Klasa ta zapewnia dostęp do dostawców treści. Cursor query(uri uri, String[] projection, String selection, String[] selectionargs, String sortorder): uri adres dostawcy treści, projection lista kolumn zawracanych, selection warunek WHERE (bez słowa kluczowego WHERE), selectionargs argumenty podmienia wartości '?', sortorder sortowanie wyniku (wartości za klauzulą ORDER BY).

Dostawcy treści kontakty 3 Cursor cursor = getcontentresolver().query(contactscontract.contacts.content_uri, null, null, null, null); while (cursor.movetonext()) { String contactid = cursor.getstring( cursor.getcolumnindex(contactscontract.contacts._id)); String name = cursor.getstring( cursor.getcolumnindex( ContactsContract.Contacts.DISPLAY_NAME)); Log.v("ContactsContract", contactid + " " + name); int hasphone = cursor.getint( cursor.getcolumnindex( ContactsContract.Contacts.HAS_PHONE_NUMBER)); //... cursor.close();

Dostawcy treści kontakty 4 if (hasphone > 0) { Cursor phones = getcontentresolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactid, null, null); while (phones.movetonext()) { String phonenumber = phones.getstring( phones.getcolumnindex( ContactsContract.CommonDataKinds.Phone.DATA)); Log.v("ContactsContract tel", phonenumber); phones.close(); LOG: VERBOSE/ContactsContract: 1 Robert Iksinski VERBOSE/ContactsContract: 2 Tomasz Igrekowski VERBOSE/ContactsContract tel: 23654789 VERBOSE/ContactsContract: 3 Piotr Zetowski VERBOSE/ContactsContract tel: 123

Dostawcy treści kontakty 5 Odczytanie kontaktu, konkretnej pozycji z pomocą standardowej listy kontaktów. public class Dostawcy extends Activity { protected static int PICK_CONTACT = 1; public void oncreate(bundle icicle) { super.oncreate(icicle); setcontentview(r.layout.main); Intent intentcontact = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startactivityforresult(intentcontact, PICK_CONTACT); //...

Dostawcy treści kontakty 6 public void onactivityresult(int requestcode, int resultcode, Intent intent) { if (requestcode == PICK_CONTACT) { getcontactinfo(intent); protected void getcontactinfo(intent intent) { Cursor cursor = managedquery(intent.getdata(), null, null, null, null); while (cursor.movetonext()) { String contactid = cursor.getstring( cursor.getcolumnindex(contactscontract.contacts._id)); String name = cursor.getstring( cursor.getcolumnindexorthrow( ContactsContract.Contacts.DISPLAY_NAME)); Log.v("ContactsContract", contactid + " " + name); cursor.close();

Dostawcy treści identyfikator URI Identyfikator URI jednoznacznie określa dostawcę treści, Jego struktura przypomina identyfikatory URI protokołu HTTP, ContactsContract.Contacts.CONTENT_URI content://com.android.contacts/contacts ContactsContract.CommonDataKinds.Phone.CONTENT_URI content://com.android.contacts/data/phones ContactsContract.CommonDataKinds.Email.CONTENT_URI content://com.android.contacts/data/emails

Identyfikator URI - budowa content://authoriy-name/path-segment/... content człon określający dostawcę treści, authoriy-name niepowtarzalny identyfikator upoważnienia używany do zlokalizowania dostawcy w rejestrze dostawców, path-segment człon ten określa ścieżkę dostępu do danych (inną dla każdego dostawcy) Człon path-segment może być powtarzany wielokrotnie

Identyfikator URI - budowa Wywołanie listy kontaktów identyfikator jednego kontraktu: content://com.android.contacts/contact s/ lookup/0n293f33292b314f292929292 9/2

Identyfikator URI -budowa Własny wybór elementu listy kontaktów: content://com.android.contacts/contact s/1 Dla dostawców wbudowanych (com.android) nie trzeba używać całego identyfikator, wystarczy wskazać odpowiednie słowo: content://contacts/contacts/1