V předchozích kapitolách jsme se seznámili s možnostmi práce s interním úložištěm v Androidu. Tento přístup je jednoduchý a bezpečný, ale má své limity, pokud jde o kapacitu a přístup k souborům z jiných aplikací. V tomto textu se zaměříme na práci s externím úložištěm, které nabízí větší flexibilitu, ale také vyžaduje pečlivější správu a kontrolu přístupových práv. Pro přístup k souborům na externím úložišti je nutné se ujistit, že zařízení má tento přístup povolený a že prostor na disku není vyčerpán.

Než začneme psát nebo číst soubory na externím úložišti, je nezbytné ověřit, zda je externí úložiště připojeno a zda je dostupné pro zápis nebo čtení. Android poskytuje několik metod pro tento účel, přičemž hlavní kontrolními metodami jsou isExternalStorageWritable() a isExternalStorageReadable(). Tyto metody využívají stav úložiště, který může mít hodnoty jako MEDIA_MOUNTED, což znamená, že úložiště je dostupné pro čtení a zápis, nebo MEDIA_MOUNTED_READ_ONLY, což znamená, že je možné pouze číst data, nikoliv je zapisovat.

Pro přístup k souborům na externím úložišti se nevyplatí používat pevně zakódované cesty, protože se mohou lišit v závislosti na verzi operačního systému a specifikacích zařízení. Je bezpečnější používat metody jako getExternalStorageDirectory(), které zajistí správnou cestu k úložišti bez ohledu na konkrétní zařízení.

Pokud jde o zápis souborů, použijeme podobný přístup jako u interního úložiště, ale s využitím externího adresáře. K tomu využijeme třídy jako File, FileOutputStream a BufferedReader pro zápis a čtení souborů. Příklad zápisu souboru by mohl vypadat následovně:

java
File textFile = new File(Environment.getExternalStorageDirectory(), FILENAME);
FileOutputStream fileOutputStream = new FileOutputStream(textFile); fileOutputStream.write(mEditText.getText().toString().getBytes()); fileOutputStream.close();

Pokud se pokusíme o zápis na externí úložiště, které není dostupné, aplikace by měla informovat uživatele pomocí Toast zprávy, aby věděl, že operace selhala.

Důležitým aspektem práce s externím úložištěm je kontrola volného místa. Při práci s většími soubory je užitečné ověřit, zda je dostatek prostoru na disku, než začneme zapisovat data. Pro tento účel můžeme použít metodu getFreeSpace() na objektu File, která vrátí volný prostor na daném úložišti.

Pokud jde o práci s adresáři, třída File umožňuje nejen manipulaci se soubory, ale také práci s adresáři. Můžeme například vytvářet nové adresáře pomocí metody mkdir() nebo je mazat metodou delete().

Jedním z dalších užitečných tipů je prevence zahrnutí souborů do systémových kolekcí, jako je galerie obrázků nebo seznam hudby. Pokud chceme, aby určité soubory nebyly automaticky přidány do těchto kolekcí, můžeme v jejich adresáři vytvořit soubor s názvem .nomedia. Tento soubor brání systému ve skenování a indexování souborů v daném adresáři.

Pokud jde o umístění souborů přímo v aplikaci, Android poskytuje dvě možnosti: adresář res/raw pro soubory, které chcete mít přístupné jako prostředky, a adresář assets, kam můžete umístit soubory, které budete používat přímo v aplikaci, například pro dynamicky generované názvy souborů.

Kromě základních operací s externím úložištěm by měli vývojáři vzít v úvahu i specifika jednotlivých verzí Androidu, protože novější verze mohou mít rozdílné požadavky na přístup k externímu úložišti, zejména v souvislosti s novými bezpečnostními politikami.

Pokud vaše aplikace pracuje s citlivými daty nebo vyžaduje vysokou úroveň ochrany soukromí, je důležité dbát na správné zabezpečení dat uložených na externím úložišti. Externí úložiště je z principu otevřenější a může být přístupné i jiným aplikacím, což může představovat potenciální bezpečnostní riziko.

Jak správně pracovat s databází v Android aplikaci: Případová studie na použití SQLite

Při vývoji aplikací pro Android se často setkáváme s potřebou uchovávat data, která mohou být často měněná. Jedním z nejběžnějších způsobů, jak tento úkol řešit, je použití SQLite databáze. V následujícím textu si ukážeme konkrétní implementaci databáze pro slovník, který umožňuje přidávat, upravovat, mazat a zobrazovat slova a jejich definice.

Začneme s vytvořením třídy DictionaryDatabase, která dědí od SQLiteOpenHelper a poskytuje základní metody pro správu databáze. Konstruktor této třídy je jednoduchý, pouze předává potřebné parametry do nadřazené třídy:

java
DictionaryDatabase(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); }

Při prvním vytvoření databáze se zavolá metoda onCreate(), která vytváří samotnou databázovou tabulku:

java
@Override
public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE " + TABLE_DICTIONARY + "(_id integer PRIMARY KEY," + FIELD_WORD + " TEXT, " + FIELD_DEFINITION + " TEXT);"); }

Metoda onUpgrade() je určena pro případné aktualizace databáze, ale pokud právě vytváříme novou databázi, není třeba se tímto bodem zatěžovat.

Pro základní manipulaci s daty jsou k dispozici následující metody:

  • saveRecord(String word, String definition) – Tato metoda slouží k uložení záznamu do databáze. Pokud slovo již existuje, zavolá se metoda pro jeho aktualizaci, jinak se přidá nový záznam.

  • addRecord(String word, String definition) – Vkládá nový záznam do databáze.

  • updateRecord(long id, String word, String definition) – Aktualizuje existující záznam na základě ID.

  • deleteRecord(long id) – Odstraní záznam podle ID.

Důležité je také číst data z databáze. Metody findWordID(String word) a getDefinition(long id) slouží k nalezení ID pro dané slovo a k získání definice pro konkrétní ID.

Zajímavým prvkem je metoda getWordList(), která vrací seznam všech slov z databáze v podobě kurzoru. Tento kurzor pak slouží k naplnění ListView v aplikaci.

java
public Cursor getWordList() { SQLiteDatabase db = getReadableDatabase();
String query = "SELECT _id, " + FIELD_WORD + " FROM " + TABLE_DICTIONARY +
" ORDER BY " + FIELD_WORD + " ASC"; return db.rawQuery(query, null); }

V MainActivity.java přichází na řadu interakce s uživatelem. Pomocí EditText polí se uživatel může zadat nové slovo a jeho definici. Po stisknutí tlačítka se zavolá metoda saveRecord(), která uloží data do databáze a vyprázdní pole pro zadávání.

Metoda updateWordList() zajišťuje zobrazení slov v ListView pomocí SimpleCursorAdapter, který propojuje data z databáze s pohledem na obrazovce.

java
private void updateWordList() {
SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter( this, android.R.layout.simple_list_item_1, mDB.getWordList(), new String[]{"word"}, new int[]{android.R.id.text1}, 0 ); mListView.setAdapter(simpleCursorAdapter); }

Uživatel může kliknout na položku seznamu a zobrazí se definice slova v Toast hlášce. Dlouhý klik na položku vyvolá smazání slova z databáze.

Po vytvoření tohoto základního funkčního kódu se aplikace stává plně funkční pro správu slovníku, přičemž interakce s databází probíhají efektivně díky využití SQLiteDatabase a Cursor.

Při práci s databází v Androidu je kladeno důraz na správné využívání metod pro čtení a zápis do databáze, přičemž je důležité mít na paměti, že operace zápisu by měly být prováděny na "writeable" databázi, zatímco pro čtení postačuje "readable" verze. Optimalizace práce s databází je klíčová pro výkon aplikace, obzvlášť když se jedná o větší objemy dat.

Také je důležité pamatovat, že při práci s databází v mobilních aplikacích se setkáváme s některými specifiky Android platformy, jako je nutnost používat _id pro identifikaci jednotlivých položek v některých případech, a proto je vhodné tento prvek zahrnout i do návrhu databázových tabulek. Kromě toho, i když v tomto příkladu byla použita jednoduchá struktura pro zobrazení dat, v reálných aplikacích může být výhodné přizpůsobit vzhled zobrazení, přidat možnosti filtrování a pokročilejší metody pro manipulaci s daty.

Pokud jde o design aplikace, doporučuje se seznámit se s různými formáty layoutů pro zobrazení seznamů a seznamy, které jsou plně dynamické. U aplikací, které mají větší množství dat, může být vhodné přidat metody pro stránkování nebo indexování položek v databázi pro lepší uživatelský zážitek.

Jak přepínat mezi aktivitami v Androidu a předávat data mezi nimi

Pro efektivní práci s více aktivitami v Androidu je nezbytné umět přepínat mezi nimi a předávat data. Tento proces je základem pro většinu aplikací, kde se uživatelská interakce vyžaduje přechod z jedné obrazovky na jinou. Následující postupy ukazují, jak vytvořit druhou aktivitu, přepnout mezi aktivitami a předat data mezi nimi. Tento proces zahrnuje několik jednoduchých kroků, které vysvětlí jak se dostat od první aktivity k druhé a jak vrátit data zpět do původní aktivity.

Začněme vytvořením druhé aktivity. Otevřete svůj projekt v Android Studiu a přejděte na možnost File | New | Activity | Blank Activity. V dialogovém okně pro přizpůsobení aktivity můžete ponechat výchozí název aktivity „Main2Activity“ nebo jej změnit na „SecondActivity“, jak je znázorněno v přiloženém obrázku. Jakmile máte druhou aktivitu připravenou, otevřete soubor MainActivity.java a přidejte následující funkci, která umožní přepnout mezi aktivitami:

java
public void onClickSwitchActivity(View view) {
Intent intent = new Intent(this, SecondActivity.class); startActivity(intent); }

Tato funkce využívá objekt Intent, který slouží k zahájení nové aktivity. Zde specifikujeme, že se má spustit aktivita SecondActivity.

Následně otevřete soubor activity_main.xml v adresáři \res\layout a přidejte následující XML kód pro vytvoření tlačítka, které bude spouštět druhou aktivitu:

xml
<Button
android:id="@+id/buttonSwitchActivity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Launch Second Activity" android:onClick="onClickSwitchActivity"/>

Tlačítko s atributem onClick volá naši funkci onClickSwitchActivity(), která zahájí druhou aktivitu. Po spuštění aplikace by mělo být možné vidět druhou aktivitu po kliknutí na tlačítko.

Nyní přejdeme k tomu, jak přidat funkci, která umožní uzavření druhé aktivity a návrat zpět na první obrazovku. Otevřete soubor SecondActivity.java a přidejte tuto funkci:

java
public void onClickClose(View view) { finish(); }

Tato metoda volá funkci finish(), která ukončí druhou aktivitu a vrátí uživatele zpět na předchozí obrazovku. Je důležité si uvědomit, že volání finish() nevrátí uživatele na konkrétní aktivitu, ale pouze zavře aktuální aktivitu a využívá zásobník aktivit pro návrat.

V souboru activity_second.xml přidejte tlačítko pro zavření druhé aktivity:

xml
<Button android:id="@+id/buttonClose" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Close" android:onClick="onClickClose"/>

Toto tlačítko zavolá metodu onClickClose(), která ukončí druhou aktivitu.

Pokud aplikaci spustíte na zařízení nebo emulátoru, měly by fungovat obě tlačítka – pro přepnutí mezi aktivitami a pro zavření druhé aktivity. Tento jednoduchý příklad ukazuje, jak přepínat mezi aktivitami, což je základní funkce pro jakoukoli složitější aplikaci.

Další krok zahrnuje předání dat mezi aktivitami. Pro tento účel se používá objekt Intent, který nejenže spouští nové aktivity, ale také umožňuje přenášet data mezi nimi. V tomto případě vytvoříme nový projekt s názvem SendData, který bude rozšiřovat předchozí příklad o předávání textu z jedné aktivity do druhé.

Otevřete soubor activity_main.xml, odstraňte existující prvky a přidejte následující kód pro vytvoření textového pole (EditText), kde uživatel může zadat text, který bude odeslán do druhé aktivity:

xml
<EditText android:id="@+id/editTextData" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Enter text here"/>

Dále otevřete soubor MainActivity.java a upravte metodu onClickSwitchActivity() tak, aby předávala zadaný text do druhé aktivity:

java
public void onClickSwitchActivity(View view) {
EditText editText = (EditText)findViewById(R.id.editTextData); String text = editText.getText().toString(); Intent intent = new Intent(this, SecondActivity.class); intent.putExtra(Intent.EXTRA_TEXT, text); startActivity(intent); }

V tomto kódu se text zadaný uživatelem v EditText odešle do druhé aktivity pomocí metody putExtra(), kde jako identifikátor používáme Intent.EXTRA_TEXT.

V souboru activity_second.xml upravte TextView tak, aby mohl zobrazit přijatý text:

xml
<TextView
android:id="@+id/textViewText" android:layout_width="wrap_content" android:layout_height="wrap_content"/>

Nakonec upravte SecondActivity.java, aby přijala data a zobrazila je v TextView:

java
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); TextView textView = (TextView)findViewById(R.id.textViewText); if (getIntent() != null && getIntent().hasExtra(Intent.EXTRA_TEXT)) { textView.setText(getIntent().getStringExtra(Intent.EXTRA_TEXT)); } }

Tato úprava umožní druhé aktivitě přijmout textovou hodnotu a zobrazit ji na obrazovce. Po spuštění aplikace uživatel zadá text, stiskne tlačítko pro přechod na druhou aktivitu, a text se zobrazí v nové aktivitě.

Předávání dat pomocí Intent je velmi flexibilní. Můžete předávat různé typy dat, nejen řetězce. Android Studio automaticky nabízí různé metody pro práci s datovými typy, jako jsou putExtra a getStringExtra, což usnadňuje práci s daty. Při práci s daty je důležité používat stejné klíče pro ukládání a načítání hodnot, jinak se data nenačtou správně.

Ve skutečnosti neexistují žádná omezení pro to, jaká data můžete předávat mezi aktivitami – kromě toho, že všechna data musí být serializovatelná nebo předávaná prostřednictvím specifických metod. Základní data jako řetězce, celá čísla a booleany lze snadno předávat, ale pro složitější objekty budete muset implementovat serializaci nebo použít jiné mechanismy jako Parcelable.

Tento proces přepínání mezi aktivitami a předávání dat je základem pro interaktivní aplikace, které vyžadují více obrazovek a sdílení informací mezi nimi.

Jak přidat App42 API do projektu a optimalizovat funkce aplikace

Pro vývojáře, kteří chtějí do svého projektu implementovat App42 API, je klíčové porozumět základní struktuře a způsobu použití této platformy. App42 API nabízí širokou škálu nástrojů pro mobilní a webové aplikace, od registrace uživatelů až po správu dat a notifikace. Tento nástroj umožňuje snadné připojení k cloudovým službám, jako jsou uživatelské účty, aplikace pro připojení k různým službám a ovládání médií.

Jedním z klíčových prvků implementace je správná registrace uživatelů. Uživatelé se mohou registrovat pomocí referenčního odkazu, což je důležité pro optimalizaci procesu připojení. Pro aplikace, které mají požadavek na zobrazení uživatelských informací ve full-screen režimu, je třeba zajistit, aby všechny atributy a metody fungovaly bez problémů. Pro dosažení optimálního výkonu je doporučeno optimalizovat zobrazení stránkek a správně implementovat metody pro sledování stavu uživatele a připojení.

Dalším důležitým aspektem je správné zacházení s grafickými prostředky, jako jsou asset soubory a animace. Při použití zobrazení v AppWidgetProvider třídě je nutné vzít v úvahu, jak budou reagovat na různé stavy, například na změny orientace nebo interakci uživatele s tlačítky. V případě práce s grafikou by se měly používat animace typu Card Flip nebo RotateAnimation, které vylepší uživatelský zážitek.

Pokud jde o práci s fotoaparátem, App42 API poskytuje nové a staré verze Camera API. Vývojář musí zvolit správnou metodu podle konkrétní verze zařízení a zajistit správné nastavení parametrů fotoaparátu, jako je rozlišení a expozice, pro optimální zachycení obrázků. Využití metody Camera2 API umožňuje širší možnosti přizpůsobení a kontrolu nad zachycováním obrázků, což může být klíčové pro aplikace, které se zaměřují na fotografii nebo videozáznam.

Při implementaci notifikací je důležité vybrat správnou metodu, jakým způsobem budou uživatelé informováni o novinkách. Využití Heads-Up notifikací pro upozornění na důležité události může být efektivní strategií pro zvýšení zapojení uživatelů. Kromě toho, pro dosažení co nejlepšího výkonu aplikace, by měl vývojář zvažovat optimalizaci úložiště aplikace, včetně správného ukládání souborů do interního a externího úložiště a používání cache souborů pro zrychlení načítání dat.

Při práci s API by měl vývojář dbát na efektivní řízení paměti. Například práce s velkými obrázky by měla zahrnovat jejich správné zmenšení, aby se předešlo výskytu chyb typu „Out of Memory“. Stejně tak je důležité monitorovat stav sítě a připojení k internetu, což je klíčové pro aplikace, které se spoléhají na online data.

V neposlední řadě je nutné věnovat pozornost správné implementaci ovládání gest. Používání gest jako pinch-to-zoom, které jsou běžně využívána v aplikacích, může výrazně zlepšit uživatelský zážitek. Je rovněž důležité optimalizovat výkon aplikace při práci s těžkými grafickými objekty, například při zobrazení komplexních 3D scén, které mohou být zpracovány pomocí OpenGL ES nebo jiných grafických knihoven.

Důležité je také správně nastavit uživatelské prostředí v souladu s orientací zařízení. K tomu je nutné věnovat pozornost orientaci obrazovky a senzory zařízení. Optimalizace pro různé typy zařízení a použití senzorů, jako je gyroskop nebo akcelerometr, může pomoci vytvořit adaptivní a interaktivní aplikace.

Kromě výše uvedených faktorů by měl vývojář zajistit, aby všechny funkce aplikace byly správně propojeny a vzájemně kompatibilní, což je základ pro bezchybné fungování aplikace v reálných podmínkách. Integrace s cloudovými službami, jako je Firebase, Google APIs a další, by měla být provedena s ohledem na ochranu soukromí a bezpečnost dat uživatelů.