SZOFTVERFEJLESZTÉS ANDROID PLATFORMRA Dr. Iszály György Barna
TÁROLÁSI LEHETŐSÉGEK •
Shared preferences: egyszerű kulcs-érték párral leírható adatok tárolására
•
Internal Storage: az alkalmazásunk privát adatainak tárolására szolgáló megoldás
•
External Storage: másokkal megosztható információk rögzítését oldhatjuk meg a segítségével
•
SQLite adatbázis: strukturált adatok tárolása egy privát adatbázis által
•
Hálózati kapcsolat: az adatok weben keresztüli rögzítése
KULCS-ÉRTÉK PÁROK TÁROLÁSA •
SharedPreferences osztály segítségével
•
Primitív adattípusok (int, float, boolean, String, stb.) adatait tárolhatjunk szöveges típusú kulcsok segítségével
•
Az Activityhez tartozó privát területen tárolódnak az értékek
•
Metódusai: •
getSharedPreferences(): nevesített állomány létrehozására, illetve megnyitására szolgáló függvény
• getPreferences(): ha az Activity csupán egyetlen preferencia fájlt kíván tárolni, név megadására nincs is szükség •
Ha a sharedPref.getString() metódus nem találja a fájlban a kulcsot, alapértelmezett értékkel tér vissza.
•
Ha a preference fájl létezik, de rossz típusú metódussal próbálunk olvsani belőle, ClassCastException típusú kivételt dob.
INPUT OUTPUT MEGVALÓSÍTÁSA •
•
•
•
Írás •
Az Editor osztály egy objektumát kell használni az íráshoz
•
put
(String kulcs, érték)
Olvasás •
A SharedPreferences osztály metódusaival
•
get()
Törlés •
egyetlen kulcs-értékpárt: remove(String kulcs)
•
valamennyi kulcs-értékpárt törlése: clear()
Jóváhagyás •
commit()
•
apply() aszinkron függvénnyel
PÉLDA •
Adatok tárolása SharedPreferences sharedPref = getSharedPreferences(„FileNeve”, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPref.edit(); editor.putString(„Kulcs”,”Érték”); editor.commit();
•
Adatok visszaolvasása SharedPreferences sharedPref = getSharedPreferences(„FileNeve”,Context.MODE_PRIVATE); textview1.setText(sharedPref.getString(„Kulcs”, "A preference nem található"));
INTERNAL STORAGE HASZNÁLATA •
Csak az alkalmazásunk számára elérhető adatok tárolására szolgál
•
Az alkalmazás eltávolításakor a rögzített adatok is eltávolításra kerülhetnek
•
Létrehozás • Az openFileOutput() függvény hívása a létrehozandó fájl nevével és a hozzáférés módjával. Visszatérési értéke egy FileOutputStream. • Írás a write() függvény segítségével. • Lezárás a close() metódussal lehetséges.
•
A létrehozandó fájl hozzáférésének módjai: • MODE_PRIVATE: mindenki elől rejtett • MODE_WORLD_READABLE: publikus olvasási lehetőség • MODE_WORLD_WRITABLE: publikus írási opció • MODE_APPEND: meglévő állomány bővítése hozzáfűzéssel
INTERNAL STORAGE HASZNÁLATA •
Olvasás: • openFileInput() hívása, a visszaadott eredmény FileInputStream. • Olvasás a read() metódussal. • A stream lezárása a close() hívásával. • Ha a file nem létezik, nyitáskor FileNotFoundExceptiont kapunk.
•
További metódusok: • getFilesDir(): visszaadja az adatokat tartalmazó könyvtár elérési útját egy File objektumba. • getDir(): létrehozza, vagy megnyitja a már létező könyvtárat a könyvtárunkon belül. • deleteFile(): törli a kijelölt fájlt a tárolóból.
TELEPÍTÉSKOR MÁR ELÉRHETŐ ADATFÁJLOK LÉTREHOZÁSA •
Telepítéskor már rendelkezésre álló adathalmazt szeretnénk készíteni, akkor ezeket a fejlesztés ideje alatt kell létrehozni: • A fájl(ok) mentése történjen a res/raw könyvtárba. • A megnyitás az openRawResource() segítségével lehetséges, a megfelelő erőforrása azonosítójának megadásával. Ennek képzése: R.raw. • A fenti metódus InputStreammel tér vissza, ami képes olvasni a fájlt. Az eredeti állomány nem írható.
PÉLDA SZÖVEGES ÁLLOMÁNY LÉTREHOZÁSA String file_neve = "hello_vilag"; String szoveg = "Helló Világ!"; FileOutputStream fki; try { fki = openFileOutput(file_neve, Context.MODE_PRIVATE); fki.write(string.getBytes()); } finally { fki.close(); }
EXTERNAL STORAGE HASZNÁLATA •
External Storage – külső adattárolóknak a használata, amelyekre adatokat menthetünk
•
Beépített, fix eszköz is lehet
•
FAT fájlrendszerek használja
•
Több partíció is kialakítható rajtuk, támogatottak az ext típusú fájlrendszerek is
•
Az adatok bárki számára elérhetőek, módosíthatóak, ha a felhasználó az USB mass storage funkcióját aktiválja
•
Az eszköz akár fizikailag is eltávolítható - az itt található adatok az alkalmazásunk számára ideiglenesen, vagy tartósan is elérhetetlenné válhatnak. Fontos vizsgálni!!!
EXTERNAL STORAGE HASZNÁLATA •
getExternalStorageState() – az External Storage állapotának lekérdezése
•
Az állapot String típusú konstans: • MEDIA_MOUNTED: a lemezterület felcsatolt • MEDIA_MOUNTED_READ_ONLY: csak olvasható módon hozzáférhető a tároló. • MEDIA_BAD_REMOVAL: szabálytalanul lett a tároló eltávolítva (lecsatolás nélkül) • MEDIA_CHECKING: a tárolót érzékeltük, lemezellenőrzés zajlik • MEDIA_NOFS: a tároló üres, vagy nem támogatott fájlrendszert tartalmaz. • MEDIA_REMOVED: a tároló le van csatolva (eltávolított). • MEDIA_SHARED: a tároló USB mass storage alatt megosztott. • MEDIA_UNMOUNTABLE: a tároló érzékelve, de nem felcsatolható. • MEDIA_UNMOUNTED: a tároló érzékelve, de nincs felcsatolva.
EXTERNAL STORAGE HASZNÁLATA •
Tároló menet közbeni eltávolítása • Intent Filterrel kell figyelni (Intent.ACTION_MEDIA_REMOVED) • Eltávolításkor értesítést kaphatunk egy saját broadcast receiver segítségével.
•
Android 2.2 (API Level 8) vagy újabb Android esetén • bizonyos fájltípusokat szervezetten, egy-egy dedikált mappában tárolhatunk • getExternalFilesDir() - paraméteréül megadott String típus segítségével visszaad egy javasolt teljes elérési útvonalat az adott fájltípus számára • Pár fájltípusokhoz tartozó String: • DIRECTORY_PICTURES: képek tárolására szolgáló mappa • DIRECTORY_MUSIC: zenék tárolásához. • DIRECTORY_RINGTONES: csengőhangok számára kijelölt könyvtár. • Ha a típus hiányzik, a tároló gyökérkönyvtárát adja vissza.
EXTERNAL STORAGE HASZNÁLATA •
A 2.2-nél korábbi Android esetében • getExternalStorageDirectory() – ezzel elérhetjük a gyökérkönyvárat.
•
A javasolt könyvtárszerkezet a tároláshoz: • /Android/data//files/
•
Az újabb Androidok az alkalmazás eltávolításakor ezeket a mappákat törlik!
•
Jelenleg valamennyi alkalmazás olvashatja a külső tárolókat külön engedély nélkül is.
•
A külső tároló olvasásához jogosultság szükséges <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
•
A meglévő írási jog egyúttal olvasási jogot is jelent.
PÉLDA AZ EXTERNAL STORAGE HASZNÁLATÁRA Jogosultságot először meg kell adni <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> if(Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorage State())){ File root =android.os.Environment.getExternalStorageDirectory(); File dir = new File (root.getAbsolutePath()+"/sajat_konyvtar");
A külső tároló elérhetőségéne k vizsgálata.
dir.mkdirs(); File file = new File(dir, "hello.txt"); FileOutputStream f;
Saját könyvtár létrehozása
PrintWriter pw; Állomány létrehozása
Gyökérkönyvtár meghatározása
PÉLDA AZ EXTERNAL STORAGE HASZNÁLATÁRA try { f = new FileOutputStream(file);
Írás az állományba
pw = new PrintWriter(f); pw.println("Helló Világ!"); pw.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); Log.e(getString(R.string.app_name), "A fájl nem található. Írási jogosultság?"); } finally { pw.close(); f.close(); } }