La elaborarea unei cereri de competiție, am fost confruntat cu problema de stocare a bazei de date. Problema a fost, cum am defini un card de memorie externă. În general, caută răspunsul exact nu este dat de rețea. Prin urmare, combinarea tuturor rezultatelor obținute, am ales clasa ei. Dacă sunteți interesat, uita-te sub tăietura.
Să începem cu teoria.
terminologie
Google ne spune că există următoarele concepte:
Înainte de versiunea 4.4 KitKat API nu oferă funcționalitate modalități de memorie externă. Deoarece această versiune a (API 19) are acum un fișier abstract publice [] getExternalFilesDirs (tip String), care returnează o matrice șir cu căile în memoria internă și externă. Dar ce putem spune despre card SD nostru, care este introdus în fanta? Calea spre ea din nou, nu putem obține.
rezultatele căutării
Pentru a răspunde la această întrebare, am apelat la Google atotștiutor. Dar el nu mi-a dat un răspuns clar. Acesta a fost analizat mai multe opțiuni pentru a defini utilizarea funcțiilor standard care conduc la memorie externă, dar nimic de-a face cu dispozitivele de stocare amovibile, acestea nu trebuie să montați regulile de unități de procesare (Android ruleaza, de asemenea, pe kernel-ul Linux). În aceste cazuri, a fost folosit „fir“ calea către directorul cu dispozitivele montate corect (în versiuni diferite ale acestui director este diferit). Nu uitați că de la o versiune pentru a monta regulile se schimbă.
În cele din urmă, am decis să combine toate cunoștințele și a scris o clasă care ne poate întoarce către dispozitive externe și amovibile.
Descriere cod
clasa MountDevice a fost creat. care conține calea către dispozitiv, tipul de dispozitiv, și un hash.
Tipuri de dispozitive este împărțit în două (memoria internă, nu am atinge, deoarece accesul la acesta este disponibil prin intermediul sistemului API).
Și a fost creat clasa StorageHelper. care caută carduri de memorie disponibile.
În StorageHelper clasă oferă două moduri de a găsi - prin intermediul mediului de sistem (Mediu) și utilizând utilitarul de Linux. ci mai degrabă rezultatul punerii sale în aplicare.
Metoda una - Mediu
Atunci când se lucrează cu mediul, am utiliza funcția standard de getExternalStorageDirectory () pentru a obține informații despre memoria externă. Pentru a obține informații cu privire la o memorie amovibil, folosesc un „SECONDARY_STORAGE“ variabilă de mediu.
Memoria externă este întotdeauna același, și, de obicei, există întotdeauna, deci verificați-l pentru a fi citite, vom calcula hash și amintiți-vă. O memorie detașabil poate fi mult, astfel încât este necesar să se rupă de linie separator rezultat și pentru a verifica fiecare valoare.
O soluție posibilă este preluată din StackOverflow. Răspunsul este undeva acolo jos.
Metoda a doua - montare
Din moment ce eu nu lucrez pentru o lungă perioadă de timp pentru a obține sistemul meu de a spune calea spre o memorie detașabil, am decis să se uite în direcția dispozitivelor montate. Sistemul are fișiere de configurare, care descriu regulile de montare dispozitive externe. Totul este bun, dar Android versiunea 4. * la acces la fișiere muritorii nu, așa că nu va lua în considerare această metodă.
Să ne întoarcem la utilitarul mount. Folosit fără a comanda parametri returnează o listă cu sisteme de fișiere montate. Dispozitivele amovibile sunt, de obicei, de formatul de sistem de fișiere FAT, acesta va aloca o linie în care există o „grăsime“ facilitate. Memoria externă va fi caracterizat prin parametrul „siguranță“.
Notă: atunci când se utilizează această metodă nu este întotdeauna corect (probabil, ceva ce nu am realizat) identifică dispozitivele tipurile smotntirovannyh. Diferența observată în diferitele versiuni de Android. Prin urmare, această metodă poate fi folosită ca un extra.
O soluție posibilă este preluată din StackOverflow. Răspunsurile există mai multe aproximativ egale.
despre redundanță
Multe observat în dispozitivele de director mount astfel imagine:
Și ceea ce este cel mai interesant, toate același card de memorie externă. Această fragmentare începe cu o versiune de Jelly Bean și este făcută pentru a sprijini operarea multi-utilizator al sistemului. Mai multe detalii aici. Și astfel, pentru a nu primi cardul de exact aceeasi memorie ca un alt dispozitiv, aveți nevoie de o modalitate de a determina identitatea. Dacă a existat acces la configurația muntelui, și nu au existat probleme. Dar nu există acces. Așa că am spionat imediat o soluție la calcularea hash pentru fiecare dispozitiv:
- crea StringBuilder
- scrie dimensiunea totală a dispozitivului și dimensiunea spațiului dispozitivului
- conținut de rădăcină ocolite
- scrie numele directorului
- notați numele și dimensiunea fișierului
- vom calcula hash
Sa calcHash hash funcție de calcul
exemplu de utilizare
concluzie
discuție detaliată a acestei probleme de înțelegere a memoriei în Android, unele sfaturi pot fi găsite aici.
Codul sursă al întregii clase este încă nicăieri să fie localizat. Una din aceste zile voi încerca să plaseze pe GitHub.
Cine se bucură încă de ce fel?