Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Siguranță
  • O metodă de protecție împotriva copierii neautorizate a fișierelor în rădăcina unui card flash pentru utilizatorii OS WINDOWS. Unde este rădăcina cardului de memorie

O metodă de protecție împotriva copierii neautorizate a fișierelor în rădăcina unui card flash pentru utilizatorii OS WINDOWS. Unde este rădăcina cardului de memorie

1. Încărcați fișierul de instalare pe dispozitiv SAS4Android.apk

2. Activați permisiunea pe dispozitivul dvs. (telefon, tabletă etc.) pentru a instala aplicații terță parte (nu de la Market). Acest lucru se poate face în setările dispozitivului dvs.: Setări - Securitate - Surse necunoscute- bifeaza casuta Permite instalarea de aplicații din surse necunoscute(după instalarea SAS4Android, această casetă de selectare poate fi debifată). Copiați fișierul SAS4Android.apk pe dispozitivul dvs. și începeți să îl instalați.

3. Rulați fișierul SAS4Android.apk .

4. Când îl porniți pentru prima dată, apare o fereastră care vă cere calea către rădăcina cardului CD și sunt de acord cu termenii de utilizare. Clic BINE. De asemenea, la prima lansare, folderul de lucru al aplicației este creat automat - SAS4Android și există un folder în el muncă. Acesta este folderul de lucru al programului în care vor fi salvate datele necesare. Vă rugăm să rețineți că trebuie să indicați calea este exact la rădăcină Card SD (și nu în orice alt folder) - acest lucru este important!

În mod implicit, structura folderului programului este următoarea:

SD_card_root/SAS4Android/work - folder de lucru - creat automat;

SD_card_root/SAS4Android/cache - folderul cache - creat de utilizator.

Dacă se utilizează structura implicită de foldere, programul determină automat căile către folderele și fișierele necesare. Dacă este utilizată o structură de foldere diferită, căile trebuie specificate manual. Pentru dispozitivele care rulează versiuni Android anterioare 4.3.x, se recomandă utilizarea structurii implicite de foldere.

Puteți determina calea către card în felul următor: Înainte de a introduce cardul SD în dispozitiv, creați (pe computer) un folder cu de înțeles pentru tine nume, de exemplu Nume.
Deconectați dispozitivul de la computer, altfel cardul SD în modul de stocare nu va fi disponibil pentru Android și pentru toate programele. (Este mai convenabil să utilizați programul MyPhoneExplorer pentru a comunica cu un computer, ceea ce vă permite să editați informațiile de pe dispozitiv prin intermediul unui computer, iar cardul SD rămâne accesibil tuturor). Deschideți orice manager de fișiere de pe dispozitiv și conectați-vă chiar rădăcina directorul dispozitivului. Vor fi mai multe directoare acolo. Căutând prin conținutul lor, găsiți folderul „tău” într-unul dintre ele. Calea pe care o arată managerul de fișiere rădăcină acest director este ceea ce ai nevoie. Amintiți-vă sau scrieți-l. Diferite dispozitive și versiuni de Android pot avea opțiuni diferite pentru locația și numele folderului cardului SD. Dacă există un folder mnt de exemplu mnt/sdkard , sau mnt/external_sd , sau mnt/extSdkard . Pe unele dispozitive, foldere mnt s-ar putea să nu existe. În acest caz, folderul montat pe card se află de obicei direct în rădăcina dispozitivului, de exemplu astfel: /Sdkard sau /Sdkard1 sau /extSdkard . Pe versiunile Android 4 și ulterioare, se găsește de obicei următorul folder: stocare/Sdkard sau stocare/Sdkard1 sau stocare/sd_extern sau stocare/extSdkard .
Deci, să stabilim că cardul nostru SD este montat ca /mnt/extern . Aceasta este exact calea care trebuie introdusă (sau mai bine, selectată prin deschiderea dialogului de fișier cu butonul [...]) când porniți pentru prima dată programul înainte de apariția meniului.

Caracteristici de lansare pe Android 4.4 și versiuni ulterioare

Pe Android 4.4 și versiuni ulterioare, drepturile aplicației de a scrie pe cardul SD au fost eliminate. Dacă producătorul nu a corectat firmware-ul în timpul asamblarii, atunci aplicația de pe un dispozitiv nerădăcinat nu va putea scrie pe cardul SD. În acest caz, programul însuși va încerca să găsească unde să plaseze directorul de lucru. Cel mai probabil acesta va fi un director în secțiunea de date aplicației din memoria internă (non-stocare) a dispozitivului.
În acest caz, programul va funcționa, datele vor fi scrise în folder muncă , citeste de acolo. Dar utilizatorul va fi privat de posibilitatea de a lua orice din folder muncă sau pune ceva acolo. Bineînțeles, vorbim despre un dispozitiv nerădăcinat. Dacă această stare de lucruri se potrivește utilizatorului, atunci nu trebuie făcut nimic altceva. În caz contrar, va trebui să lucrați cu mâinile.
Trebuie să găsim un loc pe dispozitiv în care programul poate scrie date și putem lua aceste date de acolo și le putem adăuga pe ale noastre dacă este necesar.
Experimental, am reușit să găsim un astfel de loc. Procedura de instalare:

1. Conectăm dispozitivul cu un cablu USB la computer și îl creăm în director stocare internă pliant Date . Sau facem același lucru pe dispozitivul însuși folosind managerul de fișiere. Calea trebuie să fie stocare/sdcard0/Date . În dosar Date pune dosarul .nomedia .
Atenţie! Toate încercările de a crea un folder muncă(vizibil și editabil pe computer) în alte locuri/directoare ale memoriei interne fără succes. Îl puteți crea și chiar și atunci când lansați SAS4Android pentru prima dată, puteți specifica calea către folderul dorit. Dar după instalare, accesul la acest folder devine imposibil. Puteți vizualiza dispozitivul prin intermediul managerului de fișiere, dar adăugarea de orice (melodii, o nouă cheie de licență, configurații de hărți/strat etc.) de pe un card amovibil sau computer, sau copierea acestuia pe un card amovibil sau computer este imposibilă.
De ce este ales numele pentru folder? "Date" ? Trucul este că se potrivește cu numele Date , adoptat în terminologia standard a dispozitivului și, în plus, Android distinge între litere mari și mici. Drept urmare, sistemul Android percepe acest folder ca fiind al său și nu restricționează drepturile asupra conținutului său.

Iată o modalitate gata făcută și dovedită de a ocoli limitările Android 4.4x. Utilizatorului nu îi este interzis să experimenteze locația și numele acestui folder.

Acum folderul pe care l-am creat stocare/sdcard0/Date va îndeplini rolul, calea către care trebuie specificată la prima lansare a programului.
2. Creăm la rădăcină extern Dosarul cardului SD SAS4Android , iar în acest folder - folderul cache . Punem cache-ul acolo. Calea către cache va fi .
3. Când îl lansați pentru prima dată, programul vă va cere calea către rădăcina cardului SD. Specificați calea către folderul creat de noi: stocare/sdcard0/Date . În dosar Date programul va crea un folder SAS4Android , și în el un folder muncă cu un set standard de fișiere de bază. Acum toate fișierele de program de lucru vor fi localizate în folder stocare/sdcard0/Data/SAS4Android/work , și vom avea acces la ele.
4. Acum trebuie să spuneți programului calea către cache, deoarece diferă de calea implicită. Pentru a face acest lucru, în programul care rulează, introduceți Setări - Directorul cache al hărțilorși utilizați dialogul fișierului pentru a specifica calea stocare/sdcard1/SAS4Android/cache .Instalare completă.
#!!! Numeroase verificări au arătat că odată cu o astfel de instalare a SAS4Android în dispozitivele care rulează Android 4.4.4, cu actualizări ulterioare sau chiar cu eliminarea și reinstalarea completă a aplicației, directorul stocare/sdcard0/Date ramane de lucru, continut muncă nu se pierde sau se sparge, acces la editare muncă deschide atât prin dispozitiv, cât și prin computer. Testat pe Sony Xperia Z, precum și pe Z3 compact și WinXP/Win7.
#!!! Că directorul de lucru muncă este forțat să ajungă pe memoria internă a dispozitivului, există un plus semnificativ - în cazul unei erori/căderi de pe cardul SD în teren, iar asta se poate întâmpla oricui, pierzi (temporar) doar cache și tracklog și alte conținuturi muncă va rămâne intactă și funcțională.
Sfat : este întotdeauna util să aveți o rezervă extremă - periodic, după apariția unor piste și puncte noi importante, o copiez/salvez pe aceasta modificată de lucru muncă pe cardul SD din folderul nativ SAS4Android, lângă cache . Acolo muncă, desigur, nu funcționează - este doar un fișier de salvare. Ce se întâmplă dacă fiara se defectează - atunci cardul va ajuta la recuperarea parțială.

#!!! În Android 4.4.x (dacă producătorul nu a corectat firmware-ul în timpul asamblarii) schimb online maparea datelor într-un cache dezambalat de la servicii terță parte folosind scripturi scrise în JavaScript, fără rădăcină posibil doar pentru memoria internă. Pentru a încărca memoria cache pe net va trebui să creați suplimentar un al doilea dosar cache în directorul de lucru al programului stocare/sdcard0/Data/SAS4Android/ și plasați în prealabil numărul necesar de foldere cu numele surselor/straurilor hărții și scripturile plasate în acestea. Va trebui să vă obișnuiți să comutați între două directoare cache în funcție de nevoile curente: să lucrați fără paginare - cu cel principal cache , iar cu paginare - comutați la cache în memoria internă.

Ieșiți în meniul de setări program.

După pornirea programului, puteți ieși în meniul de setări apăsând butonul de sistem „Meniu”. Acesta poate fi fie un buton hardware, fie un buton de pe ecran în partea de jos a ecranului ( trei puncte verticale). În funcție de dispozitivul dvs. și de versiunea de Android pe acesta, acesta poate fi fie un buton hardware, fie un buton de pe ecran în partea de jos a ecranului. Pe multe dispozitive noi cu Android versiuni 4 și superioare, acest buton este combinat cu un buton pentru lista aplicațiilor care rulează ( două dreptunghiuri combinate). În acest caz, este suficient să ieși în meniu apasa si tine apasat butonul de rulare a aplicațiilor până când apare meniul de setări.

Caracteristici de pornire și dezactivare a SAS4Android

Când porniți programul, toate modurile sunt activate: afișarea hărților, navigarea, înregistrarea unui jurnal de urmărire (pornirea serviciului). Este posibil să părăsiți aplicația (o puneți în modul de repaus) fără a opri serviciul, de exemplu. înregistrările jurnalului de urmărire. În funcție de setări (mod de înregistrare a jurnalului de urmărire, modul de oprire a serviciului), dacă este necesar, porniți orice alt program, efectuați un apel sau răspundeți la un apel în timp ce mențineți un serviciu în funcțiune, ar trebui să utilizați fie butonul înapoi, sau butonul de pornire sub forma unei case.

Pentru a opri serviciul, în funcție de setări, faceți dublu clic pe butonul „Înapoi” sau coborâți „cortina” și faceți clic pe linia din lista de aplicații care rulează SAS4Android, apasa butonul Stop.

#!!! În tablete, bara de stare este cel mai adesea situată în partea de jos. În partea dreaptă sunt grupate pictogramele aplicațiilor care rulează. Dacă faceți clic pe orice pictogramă, va apărea o fereastră cu o linie cu pictograme „Setări rapide” (sunet, luminozitate WiFi, BT, rețea, locație etc.), iar mai jos este o listă linie cu linie a aplicațiilor care rulează .

Caracteristicile distribuției programului

Program SAS4Android distribuite gratuit.

Limita de viață a aplicației - nota autorului.

După încălcarea repetată și rău intenționată a drepturilor de autor de către unii dealeri de navigatori necinstiți, autorul a trebuit să introducă o restricție - după instalarea (sau următoarea actualizare) programul SAS4Android funcționează corect timp de 1 lună de la data actualizării, apoi se „rupe” parțial - devine putred. Acest lucru se exprimă într-o reducere a timpului de înregistrare continuă a jurnalului de urmărire (de obicei în 20-30 de minute), după care înregistrarea se oprește și pe ecran apare un mesaj corespunzător. Apoi, tot ce rămâne este să reporniți programul (închideți aplicația și serviciul și lansați-le din nou). Și așa mai departe de un număr imprevizibil de ori până la sfârșitul călătoriei. Piesele sunt înregistrate, dar cu goluri. O soluție simplă, dar supărătoare la această problemă este actualizările regulate, o dată pe lună. Fiecare actualizare nouă are o dată de expirare ulterioară, așa că actualizați și continuați...

Dar există o cale mai bună.

Programul conține un algoritm pentru eliminarea restricțiilor - cheia license.dat, care dezactivează „atenuarea”. Autorul dă cheile în semn de recunoștință celor care au susținut proiectul. Așa că nu întrebați „cât costă” sau „cum să cumpăr”. Accesați orice pagină de forum și priviți cu atenție antetul.

Cheile nu sunt de vânzare! Donațiile cu orice mențiuni de chei sau achiziții în comentarii vor fi returnate expeditorilor.

Pentru a genera o cheie, este necesar un fișier deviceld.txt . Este generat de programul SAS4Android însuși și plasat în folder muncă .

Mai întâi, verificați dacă fișierul este pe dispozitivul dvs deviceld.txt Există.

Dacă nu este acolo, atunci nu va fi posibil să creați o cheie pentru navigatorul dvs. (din păcate, există câteva modele foarte limitate pe care acest mecanism nu funcționează).

Dacă ai un dosar deviceld.txt gol sau nu funcționează (a rămas din versiunea veche a programului înainte de a reseta setările din fabrică sau de a actualiza sistemul).

1. Ștergeți-l pe cel vechi deviceld.txt .

2. Lansați programul.

3. Așteptăm până prinde sateliții (linia de coordonate se va înnegri).

4. Închideți programul. În dosar ar trebui să apară un ID valid muncă .

Vă rugăm să rețineți faptul că cheia este legată de ID-ul dispozitivului. Pe Android, la instalarea unei actualizări de sistem, identificatorul dispozitivului se modifică. Resetarea la setările din fabrică duce, de asemenea, la acest lucru. (De ce este așa? Întrebați producătorii dispozitivului dvs.).

Deci, dacă actualizați sistemul sau faceți o resetare din fabrică, cheia nu va mai funcționa.

Totuși, acest lucru poate fi rezolvat și prin înlocuirea cheii. Vă rugăm să trimiteți toate întrebările despre eliminarea restricțiilor într-un mesaj personal către autorul programului.

Cred că toată lumea s-a confruntat cu problema „autorilor” răi. Și există multe modalități de a o rezolva: software open source, scripturi, „dancing with a tamburine” etc. Vreau să ofer un algoritm de soluție simplă pentru utilizatorii de sistem de operare Windows care nu necesită intervenția unei terțe părți. Pentru a ne atinge scopul, vom avea nevoie de mai mulți pași – sau mai degrabă doi.

Pasul #1 - pregătire

Formatarea sistemului de fișiere media în NTFS utilizând sistemul de operare.

Nu există NTFS atunci când selectați opțiunile de format

Dacă nu există nicio opțiune de a formata sistemul de fișiere în NTFS, ceea ce este cazul în Windows XP, atunci procedați în felul următor:

  1. Accesați proprietățile unității flash;
  2. Accesați fila „Echipament”.
  3. Selectați cardul nostru flash și faceți clic pe butonul de proprietăți;
  4. Accesați fila „Politici”;
  5. Selectați opțiunea de utilizare a memoriei cache;
  6. Acceptăm modificările și le formatăm în NTFS;
  7. Apoi îl întoarcem înapoi la „Ștergere rapidă”.

Pasul nr 2 - diferențierea drepturilor

Acum creăm un folder („dosar de lucru”) în rădăcină și setăm imediat numele (în viitor este imposibil să schimbați numele folderului), toate informațiile vor fi stocate în el. Dar rădăcina folderului va fi doar pentru citire. Acum diferențiam drepturile:
  1. Accesați securitate - deschideți proprietățile unității flash, fila „Securitate”;

    Dacă nu există o astfel de filă, atunci procedați în felul următor

    1. Accesați „Opțiuni dosar” din „Panou de control”;
    2. Pe fila Vizualizare, în lista „Setări avansate”, găsim un parametru care conține cuvintele „sharing” și „(recomandat)”;
    3. Debifați caseta.
    Acum a apărut fila
  2. Faceți clic pe butonul „Avansat”;
  3. În fereastra care se deschide, accesați fila „Proprietar” și faceți clic pe butonul „Schimbare”;

    Pentru XP

  4. Bifați caseta „Înlocuiți proprietarul subcontainerelor și obiectelor”;
  5. Ne alegem pe noi înșine și devenim proprietarul obiectului;
  6. Închidem casetele de dialog la cererea sistemului de operare cu butonul „OK” și apoi deschidem din nou „securitate” și „avansat”;
  7. Schimbăm permisiunile - pentru a face acest lucru, mergeți la securitate și în fila „Permisiuni”, faceți clic pe butonul „Schimbați permisiunile” și ștergeți drepturile existente;

    Pentru XP

    (în Windows XP nu există un buton „Modificați permisiunile”, acționăm imediat acolo)

  8. Adăugați grupul „Toți” - faceți clic pe butoanele „Adăugați”, „Avansat”, „Căutare”, selectați grupul „Toate”, „OK”, „OK” din listă;
  9. În fereastra care se deschide, setați parametrii de permisiuni pentru grupul „Toată lumea”:
    • „Aplicați: pentru acest folder, subfolderele și fișierele sale”;
    • Setați următoarele casete de selectare în câmpul „Permisiuni”:
      1. Permite: „Control total”;
      2. Interzice: „Schimbați proprietarul”, „Schimbați permisiunile”, „Ștergeți”, „Ștergeți subfolderele și fișierele”, „Scrieți atribute suplimentare”, „Scrieți atribute”, „Creați foldere / adăugați date suplimentare”, „Creați fișiere / scrieți date” .
  10. Acceptăm modificările, mergem în folderul creat anterior în rădăcina cardului flash și efectuăm aproape aceleași operațiuni;
  11. Schimbarea proprietarului - conform unui model familiar;
  12. Eliminarea drepturilor existente prin debifarea casetei de selectare „Adăugați permisiuni moștenite de la obiectele părinte” din fila „Permisiuni”;
  13. În caseta de dialog care apare, selectați „Ștergeți”;
  14. Adăugați grupul „Toți” (știm deja cum) și setați parametrii de permisiune:
    • „Aplicați: pentru acest folder, subfolderele și fișierele sale”;
    • Bifați caseta Permite: „Acces complet”.
  15. Din nou, adăugați grupul „Toți” și setați parametrii de permisiune:
    • „Aplicați: numai pentru acest folder”;
    • Setați următoarele casete de selectare „Refuză” în câmpul „Permisiuni”:
      „Schimbați proprietarul”, „Schimbați permisiunile”, „Ștergeți”, „Scrieți atribute suplimentare”, „Scrieți atribute”
pro
+ Nu există posibilitatea de a crea/șterge fișiere și foldere în rădăcina cardului flash. În consecință, lacuna pentru „autorans” este închisă.
+ În „dosarul de lucru” există acces complet - putem face tot ce vrem (puneți singur accentul).
+ Sistemul de fișiere NFTS este potrivit pentru uz personal. (DIN PUNCTUL MEU DE VEDERE)
Minusuri
- Nu este posibil să folosiți elementul de meniu „Trimite” pentru a copia informații pe unitatea noastră flash, deoarece Directorul rădăcină nu poate fi scris. Trebuie copiat în „dosarul de lucru”.
- Nu există nicio modalitate de a redenumi „dosarul de lucru” - practic numai pentru citire.
- Sistem de fișiere NTFS - nu este potrivit pentru dispozitivele care citesc doar FAT (playere de muzică/video, smartphone-uri, camere foto etc.).
Note
  • Această operațiune este cel mai bine efectuată pe o „mașină sănătoasă”. În caz contrar, puteți crea un nemuritor-autorun;
  • PE Windows XP, când am încercat să șterg „dosarul de lucru”, acesta a rămas (cum ar trebui să fie), dar totul din interior a fost șters;
  • Dar pe Windows 7, toate fișierele rămân atunci când încercați să ștergeți „dosarul de lucru”;
  • În interiorul „dosarului de lucru” nu protejează împotriva programelor malware care creează un exe cu numele folderului atunci când este deschis.

Diverse informații pot fi stocate electronic pe un dispozitiv special numit card de memorie. Este conceput pentru a stoca documente text, înregistrări audio și video și imagini. Principalul avantaj al acestui tip de memorie este ușurința înregistrării informațiilor și compactitatea dispozitivului, alături de cantități semnificative de date stocate.

Memoria internă este reprezentată de RAM, memorie permanentă și memorie cache. Avantajele sale includ viteza, dar dezavantajul este cantitatea limitată de date stocate.

Foarte des, un utilizator modern al unui computer personal și al altor echipamente electronice trebuie să se confrunte cu următoarea propoziție: „instalați în rădăcina cardului de memorie” sau „copiați în rădăcina cardului”. Poate fi găsit oriunde, deoarece tehnologia modernă începe din ce în ce mai mult să accepte carduri de la terți pentru a crește memoria internă.

Cardurile de memorie sunt standardizate. Acestea au anumite dimensiuni de gabarit și amplasarea plăcuțelor de contact în funcție de tipul de dispozitive pentru care sunt destinate a fi utilizate.

Acestea includ laptopuri, tablete, smartphone-uri, camere digitale și chiar PSP cu alte console de jocuri. Prin urmare, pentru a lucra cu ele corect, nu vă puteți lipsi de o idee clară despre ce poate însemna expresia „rădăcină card de memorie” și unde poate fi localizată.

Numele locului pentru salvarea datelor pe card provine de la cuvântul englezesc rădăcină - „indigen, rădăcină”, adică ceva curat, primordial. A intrat în uz chiar de la început, când au început să apară computerele. Pe ele, rădăcina era chiar conținutul dispozitivului, adică locul de unde a fost lansat sistemul și unde puteau fi salvate datele. De fapt, în ceea ce privește cardurile de memorie actuale, această denumire nu s-a schimbat deloc.

Directorul rădăcină

Astăzi, rădăcina unui card de memorie este directorul în sine, care se află pe card. Acesta este același folder care este lansat atunci când faceți clic pe pictograma cardului de memorie de pe smartphone-ul dvs. sau. Doar că cuvântul rădăcină a fost tradus literal, iar acum analogul său rus este folosit pentru a se referi la cardul în sine. Astfel, dacă vi se cere să copiați datele în rădăcină, atunci nu trebuie să creați nimic suplimentar pe cardul de memorie, ci pur și simplu să copiați fișierele necesare pe acesta, în directorul rădăcină.

Apoi a apărut Android Lollipop și odată cu el noi funcții pentru lucrul cu un card SD. A apărut SAF(Storage Acces Framework), a apărut o nouă Intenție ACTION_OPEN_DOCUMENT_TREE, cu care poți selecta rădăcina cardului SD și apoi o poți folosi pentru nevoile tale. De fapt, SAF era încă pe KitKat, dar fără această Intenție era de puțin folos, deoarece pentru a accesa fișierele de pe card era necesar să se folosească Intent ACTION_OPEN_DOCUMENT , care, judecând după nume, permite utilizatorului să selecteze fișierul pe care îl dorește să editeze manual prin selectorul de sistem. Bine, dar dacă utilizatorul are 5000 de fișiere, va face asta? Nu.

Determinarea unităților externe de pe dispozitiv

Voi începe cu cel mai dureros subiect în lucrul cu cardurile de memorie. Avem o metodă minunată în Android

File Environment.getExternalStorageDirectory()

După cum sugerează și numele, acesta este ceea ce aveți nevoie. „Extern” se traduce prin „extern”, nu? Dar nu ar trebui să te bazezi pe această metodă. Poate întoarce calea către memoria internă, poate către card, dar se întâmplă diferit pe fiecare dispozitiv. Această situație s-a dezvoltat în mare parte din cauza diferiților producători de telefoane și a firmware-ului și a carcaselor lor modificate. Ceea ce spun este că metoda getExternalStorage() poate returna calea nu către cardul SD real, ci către ceea ce producătorul consideră a fi o unitate externă. Aici apare confuzia de definiție. O unitate externă nu este neapărat o unitate flash: pe unele dispozitive este memorie internă, pe altele este de fapt un card SD. Punctele de montare a cardului pot fi oricare:

  • /storage/extSdCard/
  • /storage/sdcard1/
  • /storage/sdcard0/
  • /mnt/external_sd/
  • /mnt/extern/
  • /mnt/sdcard2/
  • /storage/sdcard0/external_sdcard/
  • /storage/removable/sdcard1/
  • /detașabil/microsd
  • /mnt/media_rw/sdcard1
  • /mnt/emmc

Și aceasta nu este o mare problemă până când nu o întâlnești singur.

Există multe subiecte pe StackOverflow în care există o mulțime de opțiuni diferite pentru definirea unei unități flash, variind de la încercarea tuturor combinațiilor posibile de puncte de montare, încercarea de a obține variabile de mediu Java System.getenv("EXTERNAL_STORAGE") , System.getenv( „SECONDARY_STORAGE”) și se termină cu analizarea fișierului de sistem /system/etc/vold.fstab. Aceste metode funcționează, dar fiecare numai într-un anumit caz. Nicio metodă nu acoperă toate dispozitivele sau nu funcționează deloc. Și dacă se pare că toate unitățile sunt detectate corect, atunci va exista întotdeauna un dispozitiv al cărui card nu este detectat prin aceste metode. Am încercat aproape toate metodele.

Pentru a înțelege amploarea problemei, voi spune că m-am ocupat de ea timp de aproximativ patru luni. Această problemă există din 2011, dar încă nu există o soluție exactă. De ceva timp m-am mulțumit cu acest cod mai mult sau mai puțin funcțional:

ArrayList allPaths = noua ArrayList<>(); ArrayList sdPaths = noua ArrayList<>(); pentru (Fișier: mContext.getExternalFilesDirs("extern")) ( if (fișier == null) (continuare; ) int index = file.getAbsolutePath().lastIndexOf("/Android/data"); if (index > 0 ) ( String path = file.getAbsolutePath().substring(0, index); try ( cale = new File(path).getCanonicalPath(); ) catch (Excepție e) ( e.printStackTrace(); ) allPaths.add( cale); dacă (!file.equals(mContext.getExternalFilesDir("extern"))) ( sdPaths.add(cale); ) )

Dar s-a prăbușit și pe unele dispozitive. Și încă o dată, după ce am primit o unitate pe piață, am plecat în căutare.

Am fost bântuit de selectorul de sistem Android (de asemenea, un manager de fișiere), în care toate unitățile sunt întotdeauna identificate corect. Fără să mă gândesc de două ori, am scos apk-ul de sistem folosind Root și l-am decompilat.

Insight

Am descoperit că selectorul folosește clasele StorageVolume și StorageManager. Iterează prin toate elementele StorageVolume obținute folosind metoda StorageManger.getVolumeList() și apelează metodele StorageVolume.getPath() și StorageVolume.getState() pe fiecare. Problema este că aceste metode sunt ascunse. Nu sunt private, dar sunt marcate cu adnotarea @hide. Ei bine, ce putem face, să ne ieșim din reflecția:

StorageManager getStorageManager() ( return (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); ) /* Folosiți reflectarea pentru detectarea tuturor stocărilor așa cum face Android probabil că nu funcționează cu USB-OTG funcționează numai pe API 19+ */ Public List getAllPaths() (Lista allPaths = noua ArrayList<>(); încercați ( ClasastorageVolumeClass = Class.forName("android.os.storage.StorageVolume"); Metoda getVolumeList = getStorageManager().getClass().getMethod("getVolumeList"); Metoda getPath = storageVolumeClass.getMethod("getPath"); Metoda getState = storageVolumeClass.getMethod("getState"); Obiect getVolumeResult = getVolumeList.invoke(getStorageManager()); lungime int final = Array.getLength(getVolumeResult); pentru (int i = 0; i< length; ++i) { Object storageVolumeElem = Array.get(getVolumeResult, i); String mountStatus = (String) getState.invoke(storageVolumeElem); if (mountStatus != null && mountStatus.equals("mounted")) { String path = (String) getPath.invoke(storageVolumeElem); if (path != null) { allPaths.add(path); } } } } catch (Exception e) { e.printStackTrace(); } return allPaths; }

Se pune întrebarea, de ce nu există o modalitate oficială de a face acest lucru? Da, utilizarea reflectării într-un proiect de luptă nu este pe deplin de încredere, dar nu există alte opțiuni: dacă sistemul însuși folosește acest cod, atunci funcționează în toate cazurile. Practica confirmă acest lucru.

SAF (cadru de acces la stocare)

Documentație oficială:

Platforma SAF facilitează căutarea și deschiderea documentelor, imaginilor și altor fișiere în arhivele tuturor furnizorilor cu care lucrează. O interfață standard, ușor de utilizat, permite utilizatorilor să folosească aceeași experiență între aplicații și furnizori pentru a căuta fișiere și a accesa cele mai recent fișiere adăugate.

p>SAF agregează furnizorii de conținut (Subclase ale clasei DocumentProvider). Acestea sunt, de exemplu, Google Drive, diverse galerii și manageri de fișiere.

SAF emite URI-ul documentelor (fișierelor) care au permisiuni de scriere sau citire. Putem spune că acesta este un strat deasupra accesului la fișier. Clasa File în sine nu știe nimic despre SAF.

p>Pentru a putea edita datele de pe card, trebuie să obțineți URI-ul rădăcinii cardului SD, care va avea drepturi de editare. Apoi, folosind acest URI, puteți obține URI-ul oricărui fișier de pe cardul de memorie. Pentru a face acest lucru, trebuie să lansați selectorul de sistem folosind Intent ACTION_OPEN_DOCUMENT_TREE și să cereți utilizatorului să selecteze rădăcina cardului SD (altfel nimic nu va funcționa!).

In imagini:


@TargetApi(Build.VERSION_CODES.LOLLIPOP) void showDocumentTreeDialog() ( Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(Intent.createChooser(intent, getString(R.string.permission_intent));)_SD_CEST_CODE);

Aici se întâmplă lucruri foarte importante: în onActivityResult procesăm alegerea utilizatorului și dobândim drepturile râvnite de a accesa harta. În general, drepturile sunt acordate până când dispozitivul este repornit, iar pentru a nu trimite utilizatorul din nou pentru permisiune după repornirea dispozitivului, trebuie să utilizați metoda

TakePersistableUriPermission(Uri uri, int modeFlags)

cu steaguri pentru scris și citit. După toate aceste mașinațiuni, trebuie să salvați undeva Uri-ul primit al cardului SD pentru a lucra în continuare cu acesta, de exemplu, în SharedPreferences.

@RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onActivityResult(int requestCode, int resultCode, date Intent) ( super.onActivityResult(requestCode, resultCode, date); if (requestCode == REQUEST_CODE_SD_CARD == && RESULT_CARD) takePermission(getApplicationContext(), data.getData())) ( //faceți-vă lucrurile ) ) @RequiresApi(api = Build.VERSION_CODES.KITKAT) private boolean takePermission(Context context, Uri treeUri) ( /* Ar fi util să adăugați o verificare că URI-ul primit este URI-ul hărții. Voi lăsa această sarcină ca un exercițiu pentru cititori */ try ( if (treeUri == null) ( return false; ) context.getContentResolver().takePersistableUriPermission( treeUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION) ; sharedPreferences.putString(SD_CARD_URI,treeUri.toString()); return true; ) catch (Excepție e2) ( e2.printStackTrace()); return false; );

Interacțiune cu cardul SD

Cititorul probabil că deja ghicește că nu vom putea interacționa cu fișierele (cum ar fi file.renameTo(file2)) într-un mod normal. Dacă ne uităm la codul metodei file.renameTo(File), nu vom vedea nimic suspect, nici verificări. Și pe bună dreptate, pentru că verificările sunt la nivel de sistem de fișiere. Și dacă încercăm să schimbăm un fișier aflat pe cardul SD folosind mijloacele obișnuite, vom obține următoarea excepție:

Java.io.IOException: Nu se pot face modificări la fișierul your_file.ext

Iată o modalitate interesantă de a determina dacă un fișier poate fi modificat:

Boolean public isFileWritable(Fișier fișier) ( boolean inscriptibil; încercați ( new FileOutputStream(fișier, adevărat).close(); inscriptibil = fișier.exists() && fișier.canWrite(); ) catch (IOException e) ( scris = fals; ) returnează scris; )

Dacă fișierul este pe hartă, vom primi o IOException.

Pentru a schimba un fișier de pe cardul de memorie, trebuie să obținem un DocumentFile care să reprezinte fișierul nostru, dar cu permisiunile de scriere pe care le-am obținut cu SAF.

La începutul articolului, am vorbit despre două intenții pentru SAF: ACTION_OPEN_DOCUMENT_TREE și ACTION_OPEN_DOCUMENT . Și am spus că nu vom folosi a doua intenție, deoarece aceasta obligă utilizatorul să caute fișierul manual. Dar avem un URI, pe care l-am primit folosind prima intenție, și asta înseamnă... Nu, nu există un API standard pentru obținerea unui DocumentFile, totul se face manual.

Algoritmul este astfel:

  1. Avem File
  2. Determinați numele unității pe care se află acest fișier
  3. Determinăm calea fișierului în raport cu unitatea pe care se află. Primim o linie ca android/folder/file.txt
  4. Separați o linie cu un simbol «/»
  5. În buclă, pentru fiecare parte primită, găsim DocumentFile reprezentând această cale, pe baza DocumentFile pentru partea anterioară
  6. Dacă algoritmul este finalizat fără erori, rezultatul este un DocumentFile care reprezintă fișierul nostru

Public DocumentFile getDocumentFile(Fișier) ( DocumentFile = null; șir de bază Folder = nul; for (String cale: getAllPaths()) (Fișier filePath = new File(cale); if (filePath.getAbsolutePath().startsWith(file.getAbsolutePath) ())) (baseFolder = filePath.getAbsolutePath(); break; ) ) if (baseFolder == null) ( return null; ) try ( String relativePath = file.getCanonicalPath().substring(baseFolder.length() + 1) ; Uri permissionUri = Uri.parse(sharedPreferences.getString(SD_CARD_URI)); document = getDocumentFileForUri(permissionUri, relativePath); ) catch (Excepție e) ( e.printStackTrace(); ) return document; ) /* Metodă pentru obținerea DocumentFile ( pașii 4-6) */ private DocumentFile getDocumentFileForUri(Uri treeUri, String relativePath) ( String parts = relativePath.split("/"); if (parts.length == 0) ( return null; ) DocumentFile document = DocumentFile.fromTreeUri (mContext, treeUri); for (String part: parts) ( DocumentFile nextDocument = document.findFile(part); if (nextDocument != null) ( document = nextDocument; ) ) returnează document; )

FileOutputStream outputStream = (FileOutputStream) mContentResolver.openOutputStream(documentFile.getUri());

Un exemplu de copiere a unui fișier de clasă File în DocumentFile:

Public void copyFile(Fișier sursă, document DocumentFile) ( FileInputStream inputStream = nul; FileOutputStream outputStream = nul; încercați ( inputStream = nou FileInputStream(sourceFile); outputStream = (FileOutputStream) mContentResolver.openOutputStream(document.getUri()); FileChannel = fileChannel inputStream.getChannel(); FileChannel fileChannelOut = outputStream.getChannel(); fileChannelIn.transferTo(0, fileChannelIn.size(), fileChannelOut); //noinspection ResultOfMethodCallIgnored sourceFile.delete(); ) catch (IOException e) (e.TraceprintStack) (); //noinspection ResultOfMethodCallIgnored sourceFile.delete(); ) în cele din urmă (încercați (if (inputStream != null) inputStream.close(); if (outputStream != null) outputStream.close(); ) catch (IOException e) ( e.printStackTrace(); ) ) )

Și mai vreau să spun că acum codul va fi completat cu astfel de verificări

Public void writeFile(Fișier fișier) ( boolean fileWritable = isFileWritable(fișier); boolean hasSdCardUri = !sharedPreferences.getString(SD_CARD_URI).isEmpty(); if (fileWritable || hasSdCardUri) ( /* puteți edita fișierul în mod normal, sau SAF */ return; ) if (Build.VERSION.SDK_INT >= 21) ( /* bine ai venit! (cerem permisiunea utilizatorului) */ throw new NoLollipopWritePermissionException(); ` ) else if (Build.VERSION.SDK_INT == 19 ) ( / * la revedere! (nu pot edita) */ lansează NoKitkatWritePermissionException (); ) )

Concluzie

Sper că experiența mea descrisă în articol îi va ajuta pe cei care nu au lucrat încă cu un card SD pentru a evita cercetările și căutările îndelungate.

Unde este folderul rădăcină al unei unități flash sau al cardului de memorie?

    Dacă conectați orice dispozitiv de stocare la computer, acesta va apărea în Explorer ca o unitate cu o literă în limba engleză atribuită; dacă deschideți această unitate, acesta va fi folderul rădăcină. Puteți crea alte foldere în el, în fiecare dintre acele foldere puteți crea, la rândul său, alte foldere și așa mai departe, iar în fiecare folder există fișiere. Acesta poate fi imaginat ca un copac cu un trunchi și ramuri ramificate care se extind din el - foldere - ramuri, fișiere - frunze, iar rădăcina acestui copac este tocmai folderul rădăcină, de unde și numele.

    Numim folderul rădăcină doar folderul unei anumite unități flash sau card de memorie. De îndată ce introduceți o unitate flash, în fața dvs. se afișează un nou dispozitiv, deschiderea care vă va duce la folderul rădăcină al unității (dosarul rădăcină, adică cel inițial), care poate conține o grămadă de alte foldere.

    Dosarul rădăcină al oricărui disc este folderul principal al acestui disc.

    Adică, când vă aflați în folderul rădăcină al unui disc, vi se pare că nu ați fi intrat niciodată în niciun folder.

    Adică, adresa folderului rădăcină este:

    unitățile A: și B: sunt de obicei rezervate pentru unitățile de dischete (pentru dischete), care adesea nu mai sunt instalate în computerele moderne.

    pentru un hard disk acesta este de obicei C:

    D este adesea rezervat pentru DVD player:

    Restul sunt de obicei folosite pentru dispozitivele externe conectate.

    De exemplu, pentru o unitate flash.

    Dar, în opinia mea, nu trebuie neapărat să fie în această ordine. Cineva de pe computerul său poate avea o ordine diferită în care dispozitivele corespund numelor de disc. Conectați-vă la secțiune Calculatorul meu(dacă ai Windows) și vei vedea cum se află pentru tine.

    Dosarul rădăcină al site-ului are următoarea adresă: http://sitename/

    Deși pentru creatorul site-ului, pe găzduirea sa, același folder este cel mai adesea doar un subfolder, deoarece acolo pot fi create mai multe site-uri, plus sunt stocate diferite setări de configurare.

    Folderul rădăcină este considerat folderul unității flash, al programului sau al discului în sine. Adică, pot exista și alte (subdosare) acolo. Adică rădăcină înseamnă original. Și dacă, de exemplu, se indică faptul că, de exemplu, un fișier trebuie să fie tras în directorul rădăcină al unei unități flash, atunci trebuie doar să-l plasați pe unitatea flash în sine, și nu într-un alt folder de pe acesta. unitate flash. Și, de asemenea, prin analogie cu alte resurse.

    Ce este folderul rădăcină și cum se ajunge acolo?

    De fapt, totul este foarte simplu, folderul rădăcină este folderul care este considerat cel original. Dacă, de exemplu, vă conectați unitatea flash la dispozitiv, va apărea un meniu prin care puteți merge la folderul rădăcină = aceasta este unitatea flash în sine, care poate conține atât foldere, cât și fișiere.

    Destul de des puteți auzi sau întâlni fraza: instalați/mutați/copiați un anumit fișier în rădăcina unui card de memorie sau în folderul rădăcină al unui card flash. Dar ce este și unde este folderul rădăcină sau doar rădăcina unității flash?

    Răspunsul este de fapt foarte simplu. Acest nume vine din directorul rădăcină. Adică, când facem clic pe pictograma cardului de memorie/cardului flash și se deschide o fereastră în fața noastră, acesta este același folder rădăcină. Deși de fapt nu vedem folderul acolo. Aceasta este zona hărții în sine, cu alte fișiere și alte foldere plasate pe ea. Dosarul rădăcină (sau rădăcină) al unei unități flash poate fi comparat cu ultimul etaj din ierarhia tuturor folderelor de pe acesta.

Cele mai bune articole pe această temă