Skladištenje je ono čega smo svi svjesni, ali uvijek ga uzimamo zdravo za gotovo. Nedavno je svaki skok u kapacitetu za pohranu bio postepeni i činilo se nemogućim. U današnje vrijeme ne razmišljamo o tome koliko toga imaju naši uređaji (i ne bi se mogli brinuti o razlikama).
Veća bi točka bila sagledati evoluciju onoga što je pohranjeno u memoriji. Prije pametnih telefona spremili smo pokoju fotografiju ili dvije, neke igre i hrpu tekstualnih poruka. Ali sada će svaki standardni telefon imati skup aplikacija, dokumenata, fotografija, videozapisa, glazbenih datoteka i još mnogo toga. Otkrijmo kako možemo iskoristiti prostor za pohranu uređaja za svoje aplikacije.
Ono što ćemo pokriti u ovom članku je:
- Različite vrste pohrane na Android telefonima
- Razlike između vrsta pohrane
- Kako koristiti pohranu u svojoj aplikaciji
Svaka aplikacija ima pristup dvije različite vrste pohrane: unutarnju i vanjsku . Postoje velike razlike između ove dvije vrste pohrane, a njihovo poznavanje pomoći će vam pri dizajniranju vaše sljedeće aplikacije.
Prije nego što započnemo, moramo reći jedno o pohrani i predmemoriji. Pohrana je namijenjena stvarima koje želite ustrajno spremati, dok je predmemorija tu da ih privremeno sprema.

Interna pohrana
Kada se svaka aplikacija pokrene u operacijskom sustavu, ona ima vlastitu internu pohranu. Ova pohrana je privatna i samo za upotrebu aplikacije. Znači, druge aplikacije ne mogu mu pristupiti, kao ni korisnik. Još jedna stvar koju morate imati na umu pri korištenju interne pohrane je dostupnost. Za razliku od vanjske pohrane, interna pohrana uvijek je dostupna za vašu aplikaciju.
Korištenje ove pohrane ima svojih nedostataka. Ako korisnik ukloni aplikaciju, uklanjaju se i svi podaci pohranjeni u internoj pohrani vaše aplikacije. Zamislite što bi se dogodilo da instalirate igru na telefon i negdje niz cestu odlučite je ukloniti. Željeli biste sačuvati napredak igre ako biste kojim slučajem ponovo instalirali igru.
Pa, kako možemo spremiti datoteku u internu pohranu?
public void saveFileInternalStorage() { String FILENAME = "hello_world_file"; String inputToFile = "Hello From Internal Storage!"; try { FileOutputStream fileOutputStream = openFileOutput(FILENAME, Context.MODE_PRIVATE); fileOutputStream.write(inputToFile.getBytes()); fileOutputStream.close(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has been saved successfully", Toast.LENGTH_SHORT).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(getApplicationContext(), "File " + FILENAME + " has not been saved successfully due to an exception " + e.getLocalizedMessage(), Toast.LENGTH_SHORT).show(); } }
Kao što možete vidjeti u primjeru koda, spremamo datoteku koja se naziva hello_world_file koja sadrži tekst "Pozdrav iz interne pohrane!" . Stvorio sam dvije klauzule catch samo da bih demonstrirao iznimke koje se mogu dogoditi kada to pokušavam učiniti, ali možete ih svesti na jednu klauzulu catch s općim objektom Exception.
Obratite pažnju da će metoda openFileOutput otvoriti datoteku ako već postoji, ali ako ne, stvorit će je. Drugi parametar ove metode je način rada datoteke. Ovaj parametar određuje opseg datoteke i pristup njoj. Zadana vrijednost je MODE_PRIVATE, što datoteku čini dostupnom samo vašoj aplikaciji.
Druge dvije vrijednosti za ovaj parametar su MODE_WORLD_READABLE i MODE_WORLD_WRITEABLE, ali zastarjele su od API-ja 17. Dijeljenje privatnih datoteka s drugim aplikacijama koristi drugačiji skup logike o kojem više možete pročitati ovdje. Konačno, prilikom pisanja u datoteku pretvaramo naš niz u bajtove i obavezno zatvorimo datoteku na kraju.

Vanjska pohrana
Suprotno onome što naziv implicira, ovo je pohrana koja se definira činjenicom da nije uvijek dostupna. To može značiti da to može biti vanjska SD kartica (sekundarna vanjska pohrana), ali može biti i pohrana koja se nalazi na uređaju (primarna vanjska pohrana).
Da biste činjenicu vratili kući, vanjska pohrana je pohrana kojoj se može pristupiti kada uređaj povežete s računalom putem USB kabela. Kao što ste već pretpostavili, sve što je pohranjeno u ovoj vrsti pohrane dostupno je drugim programima na vašem uređaju, ali bit će sačuvano ako deinstalirate aplikaciju.
Prije nego što pokažemo kako spremati datoteke u vanjsku pohranu, moramo učiniti dvije stvari:
- Provjerite ima li tamo dovoljno mjesta za spremanje datoteke
- Zatražite dopuštenje tijekom izvođenja
Provjera ima li dovoljno prostora za pohranu zahtijeva sljedeće retke koda:
//Check if you can read/write to external storage public boolean isExternalStorageWritable() { String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { return true; } return false; }
Da bismo dobili pristup vanjskoj pohrani, trebamo dodati sljedeće dopuštenje u naš AndroidManifest.xml:
Nadalje, od API-ja 23, opasna dopuštenja nisu odobrena za vrijeme instaliranja, već za vrijeme izvođenja. Zapisivanje u vanjsku pohranu kategorizirano je kao jedno, pa moramo dodati logiku koja će korisniku omogućiti da odluči hoće li aplikaciji odobriti odobrenje ili ne.
public void saveFileExternalStorage(View view) { if (isExternalStorageWritable()) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { writeFileToExternalStorage(); } else{ ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0); } } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { switch (requestCode) { case 0: { writeFileToExternalStorage(); break; } } }
Naš writeFileToExternalStorage izgleda ovako:
public void writeFileToExternalStorage() { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/saved_files"); if (!myDir.exists()) { myDir.mkdirs(); } try { File file = new File(myDir, "myfile.txt"); FileOutputStream out = new FileOutputStream(file); out.write(inputToFile.getBytes()); out.close(); Toast.makeText(getApplicationContext(), "File myfile.txt" + " has been saved successfully to external storage", Toast.LENGTH_SHORT).show(); } catch (Exception e) { e.printStackTrace(); } }
Ako želite vidjeti primjer svih ovdje predstavljenih kodova, možete prijeći na ovo GitHub spremište.

Dobro je znati
Iznad su navedena samo dva jednostavna primjera kako raditi s različitim vrstama pohrane za vašu aplikaciju. Budući da imamo posla s resursom kojim sustav upravlja, trebali bismo biti svjesni i ponašanja povezanih s njim.
Prema zadanim postavkama vaša će aplikacija biti instalirana u internu pohranu ( pogledajte objašnjenje internalOnly ), ali s API razine 8 u svoj manifest možete dodati atribut installLocation koji omogućuje da se vaša aplikacija instalira na vanjsku pohranu. Jedan od razloga za to je ako je vaša aplikacija vrlo velika i radije biste da je korisnik instalira na vanjsku pohranu uređaja jer tamo ima više prostora.
Postoje tri vrijednosti za ovaj atribut:
- auto - znači da nemate određenu postavku gdje će se aplikacija instalirati. Aplikacija će se pokušati instalirati u internu pohranu, ali ako je puna, instalirat će je u vanjsku pohranu
- InternalOnly - aplikacija će se instalirati samo u internu pohranu, a ako tamo nema dovoljno prostora, neće se instalirati
- preferExternal - znači da želite da se vaša aplikacija instalira na vanjsku pohranu, ali ako tamo nema dovoljno mjesta, instalirat će se interno
I za auto i za preferExternal opcije, korisnik ima mogućnost premještanja aplikacije iz vanjske pohrane u unutarnju i obrnuto.
Imajte na umu da se jednom kada korisnik poveže svoj uređaj s računalom i omogući mu razmjenu podataka ili demontira SD karticu, sve aplikacije pokrenute iz vanjske pohrane uništavaju. Ako vaša aplikacija koristi jednu od sljedećih značajki, ne biste je trebali instalirati na vanjsku pohranu:
Razne usluge (alarm usluga a posebno), Input Method Motori, live wallpapere, program widgets, upravitelji računa, Sinkronizacija adapteri, administratori uređaja i elektronskih prijemnici slušanje za dizanje završen.