Depozitarea este un lucru pe care îl conștientizăm cu toții, dar pe care îl luăm întotdeauna de la sine. Nu cu mult timp în urmă, fiecare salt în capacitatea de stocare a fost incremental și părea imposibil. În zilele noastre, nu ne gândim din nou când ne gândim cât de mult au dispozitivele noastre (și nu ne-ar putea interesa mai puțin de diferențe).

Un punct mai important ar fi să analizăm evoluția a ceea ce este stocat în memorie. Înainte de smartphone-uri, am salvat fotografia ocazională sau două, câteva jocuri și o tonă de mesaje text. Dar acum, orice telefon standard va avea o combinație de aplicații, documente, fotografii, videoclipuri, fișiere muzicale și multe altele. Să aflăm cum putem utiliza spațiul de stocare al unui dispozitiv pentru aplicațiile noastre.

Ceea ce vom acoperi în acest articol este:

  1. Diferitele tipuri de stocare pe telefoanele Android
  2. Diferențe între tipurile de stocare
  3. Cum se utilizează stocarea în aplicația dvs.

Fiecare aplicație are acces la două tipuri diferite de stocare: intern și extern. Există diferențe majore între aceste două tipuri de stocare, iar cunoașterea acestora vă va ajuta la proiectarea următoarei aplicații.

Înainte de a începe, trebuie spus un lucru despre stocare și cache. Stocarea este destinată lucrurilor pe care doriți să le salvați în mod constant, în timp ce memoria cache este acolo pentru a salva temporar lucrurile.

Ziua mutarii
Fotografie de Erda Estremera / Unsplash

Stocare internă

Când fiecare aplicație este rulată pe sistemul de operare, aceasta are propria sa memorie internă. Acest spațiu de stocare este privat și numai pentru utilizarea aplicației. Adică, alte aplicații nu îl pot accesa și nici utilizatorul nu poate accesa. Un alt lucru de care trebuie să ții cont atunci când folosești stocarea internă este disponibilitatea acestuia. Spre deosebire de stocarea externă, stocarea internă este întotdeauna disponibilă pentru aplicația dvs.

Cu toate acestea, utilizarea acestui spațiu de stocare are dezavantajele sale. Dacă utilizatorul elimină aplicația, toate datele stocate în spațiul de stocare intern al aplicației sunt eliminate. Imaginați-vă ce s-ar întâmpla dacă ați instala un joc pe telefonul dvs. și, undeva pe drum, ați decis să îl eliminați. Ați dori să vă salvați progresul jocului, dacă, din întâmplare, ați instala jocul din nou.

Deci, cum salvăm un fișier în stocarea internă?

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();
        }
 }
Salvarea unui fișier numit hello_world_file

După cum puteți vedea în exemplul de cod, salvăm un fișier numit hello_world_file care conține textul, „Bună ziua de la stocarea internă!”. Am creat două clauze catch doar pentru a demonstra excepțiile care pot apărea atunci când încercați să faceți acest lucru, dar le puteți reduce la o singură clauză catch cu obiectul general Exception.

Fii atent la faptul că metoda openFileOutput va deschide fișierul dacă există deja, dar dacă nu, îl va crea. Al doilea parametru al acestei metode este modul fișier. Acest parametru desemnează domeniul de aplicare al fișierului și accesul la acesta. Valoarea implicită este MODE_PRIVATE, ceea ce face ca fișierul să fie accesibil numai aplicației dvs.

Celelalte două valori pentru acest parametru sunt MODE_WORLD_READABLE și MODE_WORLD_WRITEABLE, dar au fost depreciate de la API 17. Partajarea fișierelor private cu alte aplicații utilizează un set diferit de logică despre care puteți citi mai multe aici. În cele din urmă, când scriem în fișier, ne convertim șirul în octeți și ne asigurăm că închidem fișierul la final.

HDD spart - Backup de stocare
Fotografie de Markus Spiske / Unsplash

Stocare externă

Contrar a ceea ce sugerează numele, aceasta este stocarea care este definită de faptul că nu este întotdeauna accesibilă. Acest lucru poate însemna că poate fi un card SD extern (stocare externă secundară), dar poate fi găsit și pe dispozitiv (stocare externă primară).

Pentru a aduce acest fapt acasă, stocarea externă este stocarea care poate fi accesată atunci când vă conectați dispozitivul la un computer printr-un cablu USB. După cum probabil ați ghicit, orice stocat în acest tip de stocare este accesibil altor aplicații de pe dispozitivul dvs., dar va fi păstrat dacă dezinstalați aplicația.

Înainte de a putea demonstra cum se salvează fișiere în spațiul de stocare extern, trebuie să facem două lucruri:

  1. Asigurați-vă că există suficient spațiu acolo pentru a salva fișierul
  2. Solicitați permisiunea în timpul rulării

Pentru a vă asigura că există suficient spațiu de stocare este nevoie de următoarele linii de cod:

//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;
}
Verificăm dacă putem scrie și citi în stocarea externă

Pentru a obține acces la stocarea externă, trebuie să adăugăm următoarea permisiune la AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Scrieți permisiunea de stocare externă

Mai mult, de la API 23, permisiunile periculoase nu sunt autorizate în timpul instalării, ci în timpul rulării. Scrierea în spațiul de stocare extern este clasificată ca fiind una, așa că trebuie să adăugăm logică pentru a permite utilizatorului să decidă dacă acordă sau nu permisiunea aplicației.

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;
                }
            }
        }
Verificați dacă utilizatorul a acordat permisiunea

Al nostru writeFileToExternalStorage arata asa:

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();
            }
        }
Scrieți un fișier în spațiul de stocare extern

Dacă doriți să vedeți un exemplu al tuturor codurilor prezentate aici, puteți accesa acest lucru Depozitul GitHub.

Nouă opt șapte
Fotografie de Steve Johnson / Unsplash

Bine de stiut

Mai sus erau doar două exemple simple despre cum să lucrați cu diferitele tipuri de stocare pentru aplicația dvs. Deoarece avem de-a face cu o resursă pe care sistemul o gestionează, ar trebui să fim, de asemenea, conștienți de comportamentele asociate cu aceasta.

În mod implicit, aplicația dvs. va fi instalată în spațiul de stocare intern (vezi explicația internă), dar de la nivelul API 8, puteți adăuga un atribut, installLocation, la manifestul dvs. care permite instalarea aplicației dvs. pe spațiul de stocare extern. Un motiv pentru aceasta este dacă aplicația dvs. este foarte mare și ați prefera ca utilizatorul să o instaleze pe stocarea externă a dispozitivului, deoarece există mai mult spațiu acolo.

Există trei valori pentru acest atribut:

  • auto – înseamnă că nu aveți o preferință specifică unde va fi instalată aplicația. Aplicația va încerca să fie instalată în spațiul de stocare intern, dar dacă este plină, o va instala în spațiul de stocare extern
  • intern Numai – aplicația va fi instalată numai în spațiul de stocare intern și, dacă nu există suficient spațiu acolo, nu va fi instalată
  • preferExternal – înseamnă că doriți ca aplicația dvs. să fie instalată pe un spațiu de stocare extern, dar dacă nu există suficient spațiu acolo, aceasta va fi instalată intern

Atât pentru opțiunile automate, cât și pentru cele preferate externe, utilizatorul are opțiunea de a muta aplicația din stocarea externă în cea internă și invers.

Rețineți că, odată ce un utilizator își conectează dispozitivul la un computer și îi permite să partajeze date sau demontează un card SD, toate aplicațiile care rulează din spațiul de stocare extern sunt distruse. Dacă aplicația dvs. folosește una dintre următoarele caracteristici, nu ar trebui să o instalați în spațiul de stocare extern:

Servicii diverse (serviciu de alarmăs în special), motoare pentru metode de intrare, imagini de fundal live, widgeturi de aplicații, administratori de conturi, adaptoare de sincronizare, administratori de dispozitive și receptoare de difuzare care ascultă pornirea finalizată