Où se trouve la racine de la carte mémoire sur psp. Une méthode de protection contre la copie non autorisée de fichiers à la racine d'une carte flash pour les utilisateurs du système d'exploitation WINDOWS. Les clés ne sont pas à vendre ! Les dons avec toute mention de clés ou d'achats dans les commentaires seront restitués aux expéditeurs.

Où se trouve le dossier racine d'une clé USB ou d'une carte mémoire ?

    Si vous connectez un périphérique de stockage à votre ordinateur, il apparaîtra dans l'Explorateur en tant que lecteur avec un lettre anglaise, si vous ouvrez ce disque, ce sera le dossier racine. Vous pouvez y créer d'autres dossiers, dans chacun de ces dossiers, vous pouvez à votre tour créer d'autres dossiers, et ainsi de suite, et dans chaque dossier il y a des fichiers. Cela peut être imaginé comme un arbre avec un tronc et des branches ramifiées qui en partent - des dossiers - des branches, des fichiers - des feuilles, et la racine de cet arbre est précisément le dossier racine, d'où son nom.

    Nous appelons le dossier racine simplement le dossier d'un lecteur flash ou d'une carte mémoire spécifique. Dès que vous insérez la clé USB, un nouveau périphérique s'affiche devant vous, s'ouvrant qui vous mènera au dossier racine de la clé (le dossier racine, c'est-à-dire le dossier initial), qui peut contenir un tas d'autres dossiers.

    Le dossier racine de n'importe quel disque est le dossier principal de ce disque.

    Autrement dit, lorsque vous êtes dans le dossier racine d'un disque, il vous semble que vous n'avez jamais accédé à aucun dossier.

    Autrement dit, l'adresse du dossier racine est :

    les lecteurs A: et B: sont généralement réservés aux lecteurs de disquettes, qui sont ordinateurs modernes Souvent, ils ne l’installent même plus.

    pour un disque dur, c'est généralement C :

    D est souvent réservé au lecteur DVD :

    Le reste est généralement utilisé pour les appareils externes connectés.

    Par exemple, pour une clé USB.

    Mais, à mon avis, ils ne doivent pas nécessairement être dans cet ordre. Quelqu'un sur son ordinateur peut avoir un ordre différent dans lequel les périphériques correspondent aux noms de disque. Connectez-vous à la rubrique Mon ordinateur(si vous avez Windows) et vous verrez comment il se trouve pour vous.

    Le dossier racine du site a l'adresse suivante : http://sitename/

    Même si pour le créateur du site, sur son hébergement, ce même dossier n'est le plus souvent qu'un sous-dossier, puisque plusieurs sites peuvent y être créés, plus stockés différents paramètres configurations.

    Le dossier racine est considéré comme le dossier du lecteur flash, du programme ou du disque lui-même. Autrement dit, il peut y avoir d'autres (sous-dossiers). Autrement dit, racine signifie original. Et si, par exemple, il est indiqué que, par exemple, un fichier doit être glissé vers le répertoire racine d'un lecteur flash, il vous suffit alors de le placer sur le lecteur flash lui-même, et non dans un autre dossier de celui-ci. clé USB. Et aussi par analogie avec d'autres ressources.

    Qu'est-ce que le dossier racine et comment y accéder ?

    En fait, tout est très simple, le dossier racine est le dossier considéré comme celui d'origine. Si, par exemple, vous connectez votre clé USB à l'appareil, un menu apparaîtra à travers lequel vous pourrez accéder au dossier racine = il s'agit de la clé USB elle-même, qui peut contenir à la fois des dossiers et des fichiers.

    Très souvent, vous pouvez entendre ou rencontrer la phrase : installer/déplacer/copier fichier spécifiqueà la racine de la carte mémoire ou au dossier racine de la carte flash. Mais qu'est-ce que et où se trouve le dossier racine ou simplement la racine du lecteur flash ?

    La réponse est en fait très simple. Ce nom provient du répertoire racine. Autrement dit, lorsque nous cliquons sur l'icône de la carte mémoire/carte flash et qu'une fenêtre s'ouvre devant nous, il s'agit du même dossier racine. Bien que nous n’y voyons pas réellement le dossier. Il s'agit de la zone de carte elle-même avec d'autres fichiers et d'autres dossiers placés dessus. Dossier racine(ou racine) d'un lecteur flash peut être comparé au dernier étage de la hiérarchie de tous les dossiers qu'il contient.

1. Télécharger sur l'appareil fichier d'installation SAS4Android.apk

2. Activez l'autorisation d'installation sur votre appareil (téléphone, tablette, etc.) applications tierces(pas du marché). Cela peut être fait dans les paramètres de votre appareil : Paramètres - Sécurité - Sources inconnues– cochez la case Autoriser l'installation d'applications à partir de sources inconnues (après avoir installé SAS4Android, cette case peut être décochée). Copiez le fichier SAS4Android.apk sur votre appareil et commencez à l'installer.

3. Exécutez le fichier SAS4Android.apk .

4. Lorsque vous le démarrez pour la première fois, une fenêtre apparaît vous demandant le chemin d'accès à la racine de la carte CD et acceptant les conditions d'utilisation. Cliquez D'ACCORD. De plus, au premier lancement, il est automatiquement créé dossier de travail candidatures - SAS4Android et il y a un dossier dedans travail. Il s'agit du dossier de travail du programme dans lequel les données nécessaires seront enregistrées. Veuillez noter que vous devez indiquer le chemin mène exactement à la racine Carte SD (et pas dans un autre dossier) - c'est important !

Par défaut, la structure des dossiers du programme est la suivante :

Racine_carte_SD/SAS4Android/travail - dossier de travail - créé automatiquement ;

Racine_carte_SD/SAS4Android/cache - dossier cache - créé par l'utilisateur.

Si la structure de dossiers par défaut est utilisée, le programme détecte automatiquement les chemins d'accès les dossiers nécessaires et des fichiers. Si une structure de dossiers différente est utilisée, les chemins doivent être spécifiés manuellement. Dans les appareils avec Version Android Avant la version 4.3.x, il est recommandé d'utiliser la structure de dossiers par défaut.

Vous pouvez déterminer le chemin d'accès à la carte de la manière suivante: Avant d'insérer la carte SD dans l'appareil, créez (sur votre ordinateur) un dossier avec compréhensible pour toi nom, par exemple Nom.
Déconnectez l'appareil de l'ordinateur, sinon la carte SD en mode stockage ne sera pas disponible pour Android et tous les programmes. (Il est plus pratique d'utiliser pour communiquer avec un ordinateur Programme MyPhoneExplorer, qui permet d'éditer les informations sur l'appareil via un ordinateur et la carte SD reste accessible à tous). Ouvrez n'importe quel gestionnaire de fichiers sur votre appareil et connectez-vous la racine même répertoire des appareils. Il y aura plusieurs répertoires là-bas. En parcourant leur contenu, trouvez « votre » dossier dans l’un d’eux. Le chemin indiqué par le gestionnaire de fichiers racine ce répertoire est ce dont vous avez besoin. Souvenez-vous-en ou écrivez-le. DANS différents appareils Les deux versions d'Android proposent des options différentes pour l'emplacement et le nom du dossier de la carte SD. S'il y a un dossier mnt Par exemple mnt/carte SD , ou mnt/externe_sd , ou mnt/extSdkard . Sur certains appareils, les dossiers mnt il se peut qu'il n'y en ait pas. Dans ce cas, le dossier monté sur la carte se trouve généralement directement à la racine de l'appareil, par exemple comme ceci : /Sdkard ou /Sdkard1 ou /extSdkard . Sur les versions Android 4 et supérieures, on trouve généralement le dossier suivant : stockage/carte SD ou stockage/Sdkard1 ou stockage/externe_sd ou stockage/extSdkard .
Déterminons donc que notre carte SD est montée comme /mnt/externe . C'est exactement le chemin qui doit être saisi (ou mieux encore, sélectionné en ouvrant la boîte de dialogue de fichier avec le bouton [...]) lorsque vous démarrez le programme pour la première fois avant que le menu n'apparaisse.

Fonctionnalités de lancement sur Android 4.4 et supérieur

Sur Android 4.4 et supérieur, les droits d'écriture de l'application sur la carte SD ont été supprimés. Si le fabricant n'a pas corrigé le firmware lors de l'assemblage, l'application sur un appareil non root ne pourra pas écrire sur la carte SD. Dans ce cas, le programme tentera lui-même de trouver où placer le répertoire de travail. Il s'agira très probablement d'un répertoire dans la section des données d'application de la mémoire interne (hors stockage) de l'appareil.
Dans ce cas, le programme fonctionnera, les données seront écrites dans le dossier travail , lisez à partir de là. Mais l'utilisateur sera privé de la possibilité de récupérer quoi que ce soit dans le dossier travail ou mettez quelque chose là-bas. Bien entendu, nous parlons d’un appareil non rooté. Si cet état de fait convient à l'utilisateur, il n'y a rien d'autre à faire. Sinon, vous devrez travailler de vos mains.
Nous devons trouver un endroit sur l'appareil où le programme peut écrire des données, et nous pouvons récupérer ces données à partir de là et ajouter les nôtres si nécessaire.
Expérimentalement, nous avons réussi à trouver un tel endroit. Procédure d'installation :

1. De liaison Périphérique USB câble à l'ordinateur et créez-le dans le répertoire stockage interne dossier Données . Ou nous faisons la même chose sur l'appareil lui-même à l'aide du gestionnaire de fichiers. Le chemin doit être stockage/sdcard0/Données . Vers le dossier Données mettre le fichier .nomedia .
Attention! Toutes les tentatives de création d'un dossier travail(visible et modifiable sur l'ordinateur) dans d'autres endroits/dossiers de la mémoire interne infructueux. Vous pouvez le créer, et même lorsque vous lancez SAS4Android pour la première fois, vous pouvez spécifier le chemin d'accès au dossier souhaité. Mais après l'installation, l'accès à ce dossier devient impossible. Vous pouvez visualiser l'appareil via le gestionnaire de fichiers, mais vous pouvez ajouter quelque chose (pistes, une nouvelle clé de licence, configurations de carte/couche, etc.) à partir d'une carte amovible ou d'un ordinateur, et également le copier sur carte amovible ou un ordinateur - impossible.
Pourquoi le nom du dossier est-il choisi ? "Données" ? Le truc c'est que ça correspond au nom Données , adopté dans la terminologie standard de l'appareil, et en plus cet Android fait la distinction entre les grandes et les petites lettres. En tout Système Android perçoit ce dossier, comme le sien et ne limite pas les droits sur son contenu.

Voici une méthode de contournement toute faite et éprouvée Restrictions Android 4,4x. Il n'est pas interdit à l'utilisateur d'expérimenter l'emplacement et le nom de ce dossier.

Maintenant le dossier que nous avons créé stockage/sdcard0/Données remplira le rôle dont le chemin d'accès doit être spécifié lors du premier lancement du programme.
2. Nous créons à la racine externe Dossier de la carte SD SAS4Android , et dans ce dossier - le dossier cache . Nous y mettons la cache. Le chemin vers le cache sera .
3. Lorsque vous le lancerez pour la première fois, le programme vous demandera le chemin d'accès à la racine de la carte SD. Spécifiez le chemin d'accès au dossier que nous avons créé : stockage/sdcard0/Données . Dans un dossier Données le programme créera un dossier SAS4Android , et dedans un dossier travail avec norme ensemble de base fichiers. Désormais, tous les fichiers du programme de travail seront situés dans le dossier stockage/sdcard0/Data/SAS4Android/travail , et nous y aurons accès.
4. Vous devez maintenant indiquer au programme le chemin d'accès au cache, car il diffère du chemin par défaut. A cet effet dans programme en cours d'exécution nous entrons Paramètres - Répertoire du cache de la carte et utilisez la boîte de dialogue de fichier pour spécifier le chemin stockage/sdcard1/SAS4Android/cache .L'installation est terminée.
#!!! De nombreux contrôles ont montré qu'avec une telle installation de SAS4Android sur des appareils fonctionnant sous Android 4.4.4, avec des mises à jour ultérieures ou même suppression complète et réinstallation du répertoire de l'application stockage/sdcard0/Données reste fonctionnel, contenu travail ne se perd ni ne se casse, accès à l'édition travail ouvert à la fois via l'appareil et via l'ordinateur. Testé sur Sony Xperia Z, ainsi que Z3 compact et WinXP/Win7.
#!!! Que le répertoire de travail travail est obligé de se retrouver sur la mémoire interne de l'appareil, il y a un plus non négligeable - en cas de problème/panne de la carte SD dans conditions de terrain, et cela peut arriver à n'importe qui, vous perdez (temporairement) uniquement le cache, mais le tracklog et autres contenus travail restera intact et fonctionnel.
Conseil : Il est toujours utile d'avoir une réserve extrême - périodiquement, après l'apparition de nouveaux morceaux et points importants, je copie/enregistre celui de travail modifié travail sur la carte SD dans le dossier natif SAS4Android, à côté de cache . Là travail, bien sûr, cela ne fonctionne pas - c'est juste un fichier de sauvegarde. Et si la bête avait un problème, la carte vous aidera en cas de récupération partielle.

#!!! Sous Android 4.4.x (si le constructeur n'a pas corrigé le firmware lors du montage) échange en ligne mapper les données dans un cache décompressé à partir de services de tiers en utilisant des scripts écrits en JavaScript, sans racine possible uniquement vers la mémoire interne. Pour charger le cache en ligne vous devrez en plus créer un deuxième dossier cache dans le répertoire de travail du programme stockage/sdcard0/Données/SAS4Android/ et placez à l'avance le nombre requis de dossiers avec les noms des sources/couches cartographiques et les scripts qui y sont placés. Il faudra s'habituer à basculer entre deux répertoires de cache en fonction des besoins du moment : travailler sans pagination - avec le principal cache , et avec la pagination - passez à cache dans la mémoire interne.

Quittez le menu des paramètres du programme.

Après avoir démarré le programme, quittez le menu des paramètres en appuyant sur bouton système"Menu". Cela peut être soit un bouton matériel, soit bouton d'écran en bas de l'écran ( trois points verticaux). En fonction de votre appareil et de la version d'Android installée, il peut s'agir d'un bouton matériel ou d'un bouton affiché en bas de l'écran. Sur de nombreux nouveaux appareils équipés d'Android versions 4 et supérieures, ce bouton est combiné avec le bouton liste applications en cours d'exécution (deux rectangles combinés). Dans ce cas, il suffit de sortir au menu appuyer et maintenir appuyez sur le bouton des applications en cours d'exécution jusqu'à ce que le menu des paramètres apparaisse.

Fonctionnalités d'activation et de désactivation de SAS4Android

Lorsque vous démarrez le programme, tous les modes sont activés : affichage des cartes, navigation, enregistrement d'un journal de suivi (démarrage du service). Il est possible de quitter l'application (la mettre en mode veille) sans arrêter le service, c'est-à-dire suivre les enregistrements du journal. En fonction des paramètres (mode d'enregistrement du journal de suivi, mode d'arrêt du service), si nécessaire, démarrez tout autre programme, passez un appel ou répondez à un appel tout en maintenant un service en cours d'exécution, vous devez utiliser soit le bouton dos, ou le bouton home en forme de maison.

Pour arrêter le service, selon les paramètres, double-cliquez sur le bouton « Retour », ou baissez le « rideau » et cliquez sur la ligne dans la liste des applications en cours d'exécution. SAS4Android, appuyez sur le bouton Arrêt.

#!!! Sur les tablettes, la barre d'état est le plus souvent située en bas. Sur son côté droit, les icônes des applications en cours d'exécution sont regroupées. Si vous cliquez sur une icône, une fenêtre apparaîtra avec une règle avec des icônes " Paramètres rapides"(son, luminosité WiFi, BT, réseau, emplacement, etc.), et ci-dessous se trouve une liste ligne par ligne des applications en cours d'exécution.

Caractéristiques de la distribution du programme

Programme SAS4Android distribué gratuitement.

Limite de durée de vie de l'application - note de l'auteur.

Après une violation répétée et malveillante du droit d'auteur par certains revendeurs de navigateurs malhonnêtes, l'auteur a dû introduire une restriction - après l'installation (ou la prochaine mise à jour) du programme SAS4Android fonctionne correctement pendant 1 mois à compter de la date de mise à jour, puis "se casse" partiellement - devient pourri. Cela se traduit par une réduction du temps d'enregistrement continu du tracklog (généralement dans les 20 à 30 minutes), après quoi l'enregistrement s'arrête et un message correspondant apparaît à l'écran. Il ne reste plus qu'à redémarrer le programme (fermer l'application et le service et les relancer). Et ainsi de suite un nombre de fois imprévisible jusqu'à la fin du voyage. Les pistes sont enregistrées, mais avec des lacunes. Une solution simple mais gênante à ce problème consiste à effectuer des mises à jour régulières, une fois par mois. Chaque nouvelle mise à jour a une date d'expiration ultérieure, alors mettez à jour et continuez...

Mais il existe une meilleure façon.

Le programme contient un algorithme pour supprimer les restrictions - la clé licence.dat, qui désactive "l'atténuation". L'auteur remet les clés en signe de gratitude à ceux qui ont soutenu le projet. Alors ne demandez pas « combien ça coûte » ou « comment acheter ». Accédez à n’importe quelle page du forum et regardez attentivement l’en-tête.

Les clés ne sont pas à vendre ! Les dons avec toute mention de clés ou d'achats dans les commentaires seront restitués aux expéditeurs.

Pour générer une clé, un fichier est requis périphériqueld.txt . Il est généré par le programme SAS4Android lui-même et placé dans le dossier travail .

Tout d'abord, vérifiez que le fichier est sur votre appareil périphériqueld.txt Il y a.

Si ce n'est pas le cas, alors il ne sera pas possible de créer une clé pour votre navigateur (hélas, il existe quelques modèles très limités sur lesquels ce mécanisme ne fonctionne pas).

Si vous avez un fichier périphériqueld.txt vide ou ne fonctionne pas (resté de ancienne version programme avant de réinitialiser les paramètres d’usine ou de mettre à jour le système).

1. Supprimez l'ancien périphériqueld.txt .

2. Lancez le programme.

3. Nous attendons qu'il capte les satellites (la ligne de coordonnées deviendra noire).

4. Fermez le programme. Un identifiant valide devrait apparaître dans le dossier travail .

Veuillez noter le fait que la clé est liée à l'ID de l'appareil. Sur Android, lors de l'installation d'une mise à jour du système, l'identifiant de l'appareil change. La réinitialisation aux paramètres d'usine conduit également à cela. (Pourquoi est-ce ainsi ? Demandez aux fabricants de votre appareil).

Ainsi, si vous mettez à jour le système ou effectuez une réinitialisation d’usine, la clé cessera de fonctionner.

Cependant, ce problème peut également être résolu en remplaçant la clé. Veuillez envoyer toute question concernant la suppression des restrictions dans un message personnel à l'auteur du programme.

Puis il est apparu Sucette Android, et avec lui de nouvelles fonctionnalités pour travailler avec une carte SD. Apparu FAS(Storage Acces Framework), une nouvelle Intent ACTION_OPEN_DOCUMENT_TREE est apparue, avec laquelle vous pouvez sélectionner la racine de la carte SD puis l'utiliser selon vos besoins. En fait, SAF était toujours sur KitKat, mais sans cet Intent, il était de peu d'utilité, car pour accéder aux fichiers de la carte, il fallait utiliser Intent ACTION_OPEN_DOCUMENT , qui, à en juger par son nom, permet à l'utilisateur de sélectionner le fichier qu'il souhaite. souhaite modifier manuellement via le sélecteur de système. D'accord, mais si l'utilisateur possède 5 000 fichiers, fera-t-il cela ? Non.

Détermination des disques externes sur l'appareil

Je vais commencer par le sujet le plus pénible concernant le travail avec les cartes mémoire. Nous avons une merveilleuse méthode sous Android

Fichier Environnement.getExternalStorageDirectory()

Comme son nom l’indique, c’est ce dont vous avez besoin. « Externe » se traduit par « externe », n'est-ce pas ? Mais vous ne devriez pas vous fier à cette méthode. Il peut renvoyer le chemin vers la mémoire interne, peut-être vers la carte, mais cela se produit différemment sur chaque appareil. Cette situation est due en grande partie à à différents fabricants les téléphones et leurs firmware modifié et des coquilles. Ce que je dis, c'est que la méthode getExternalStorage() peut renvoyer le chemin non pas vers la carte SD réelle, mais vers ce que le fabricant considère comme un disque externe. C’est là que surgit une confusion définitionnelle. Stockage externe ce n'est pas nécessairement une clé USB : sur certains appareils, c'est le cas mémoire interne, certains possèdent en fait une carte SD. Les points de montage de la carte peuvent être :

  • /stockage/extSdCard/
  • /stockage/sdcard1/
  • /stockage/sdcard0/
  • /mnt/externe_sd/
  • /mnt/externe/
  • /mnt/sdcard2/
  • /stockage/sdcard0/external_sdcard/
  • /stockage/amovible/sdcard1/
  • /amovible/microsd
  • /mnt/media_rw/sdcard1
  • /mnt/emmc

Et ce n'est pas une sorte de gros problème jusqu'à ce que vous le rencontriez vous-même.

Il existe de nombreux sujets sur StackOverflow avec une tonne de différentes options définitions d'un lecteur flash, en commençant par la recherche dans tous combinaisons possibles points de montage, tentatives d'obtention de Java variables d'environnement System.getenv("EXTERNAL_STORAGE") , System.getenv("SECONDARY_STORAGE") et se terminant par l'analyse fichier système/system/etc/vold.fstab. Ces méthodes fonctionnent, mais chacune seulement dans un cas particulier. Aucune méthode ne couvre tous les appareils ou ne fonctionne pas du tout. Et s'il semble que tous les lecteurs sont détectés correctement, il y aura toujours un périphérique dont la carte ne sera pas détectée par ces méthodes. J'ai essayé presque toutes les méthodes.

Pour comprendre l'ampleur du problème, je dirai que je l'ai traité pendant environ quatre mois. Ce problème existe depuis 2011, mais il n’existe toujours pas de solution exacte. Pendant quelques temps je me suis contenté de ce code plus ou moins fonctionnel :

Liste de tableaux allPaths = nouveau ArrayList<>(); Liste de tableaux sdPaths = nouvelle liste de tableaux<>(); pour ( Fichier fichier: mContext.getExternalFilesDirs("external")) ( if (file == null) ( continue; ) int index = file.getAbsolutePath().lastIndexOf("/Android/data"); if (index > 0) ( Chemin de chaîne = file.getAbsolutePath().substring(0, index); try ( path = new File(path).getCanonicalPath(); ) catch (Exception e) ( e.printStackTrace(); ) allPaths.add(path); !file.equals(mContext.getExternalFilesDir("external"))) ( sdPaths.add(path); ) )

Mais il a également planté sur certains appareils. Et encore une fois, après avoir reçu un appareil sur le marché, je suis parti à la recherche.

J'étais hanté par le sélecteur de système Android (également un gestionnaire de fichiers), dans lequel tous les lecteurs sont toujours correctement identifiés. Sans y réfléchir à deux fois, j'ai retiré l'apk système à l'aide de Root et je l'ai décompilé.

Aperçu

J'ai trouvé que le sélecteur utilise les classes StorageVolume et StorageManager. Il parcourt tous les éléments StorageVolume obtenus à l'aide de la méthode StorageManger.getVolumeList() et appelle les méthodes StorageVolume.getPath() et StorageVolume.getState() sur chacun d'eux. Le problème est que ces méthodes sont cachées. Ils ne sont pas privés, mais sont marqués de l'annotation @hide. Eh bien, que pouvons-nous faire, sortons notre réflexion :

StorageManager getStorageManager() ( return (StorageManager) mContext.getSystemService(Context.STORAGE_SERVICE); ) /* Utiliser la réflexion pour détecter tous les stockages comme le fait Android, cela ne fonctionne probablement pas avec USB-OTG, ne fonctionne que sur l'API 19+ */ liste publique getAllPaths() (Liste allPaths = nouveau ArrayList<>();essayez (Classe< 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; }

storageVolumeClass = Class.forName("android.os.storage.StorageVolume"); Méthode getVolumeList = getStorageManager().getClass().getMethod("getVolumeList"); Méthode getPath = storageVolumeClass.getMethod("getPath");

Méthode getState = storageVolumeClass.getMethod("getState");

Objet getVolumeResult = getVolumeList.invoke(getStorageManager());

longueur finale int = Array.getLength(getVolumeResult); pour (int je = 0; je La question se pose de savoir pourquoi il n'y a pas

voie officielle faire ça ? Oui, utiliser la réflexion dans un projet de combat n'est pas entièrement fiable, mais il n'y a pas d'autres options : si le système lui-même utilise ce code, alors il fonctionne dans tous les cas. La pratique le confirme. SAF (cadre d'accès au stockage)

Documentation officielle :

p>Afin de pouvoir éditer les données de la carte, vous devez obtenir l'URI de la racine de la carte SD, qui aura les droits d'édition. Ensuite, en utilisant cet URI, vous pouvez obtenir l’URI de n’importe quel fichier sur la carte mémoire. Pour cela, vous devez lancer le sélecteur de système à l'aide de Intent ACTION_OPEN_DOCUMENT_TREE et demander à l'utilisateur de sélectionner la racine de la carte SD (sinon rien ne fonctionnera !).

En images :


@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)), REQUEST_CODE_SD_CARD); )

Des choses très importantes se produisent ici : dans onActivityResult, nous traitons le choix de l'utilisateur et acquérons les droits convoités pour accéder à la carte. En général, les droits sont accordés jusqu'au redémarrage de l'appareil, et afin de ne pas renvoyer l'utilisateur pour autorisation après le redémarrage de l'appareil, vous devez utiliser la méthode

TakePersistableUriPermission (Uri uri, int modeFlags)

avec des drapeaux pour écrire et lire. Après toutes ces machinations, vous devez sauvegarder l'Uri reçu de la carte SD quelque part pour travaux supplémentaires avec, par exemple, dans SharedPreferences.

@RequiresApi(api = Build.VERSION_CODES.KITKAT) @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) ( super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SD_CARD && resultCode == RESULT_OK && takePermission(getApplicationContext(), data.getData())) ( //faites vos affaires) ) @RequiresApi(api = Build.VERSION_CODES.KITKAT) private boolean takePermission(Context context, Uri treeUri) ( /* Il serait utile de ajoutez une vérification que l'URI reçu est l'URI de la carte. Je laisse cette tâche comme un exercice pour les lecteurs */ 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 (Exception e2) ( e2.printStackTrace(); return false; )

Interaction avec la carte SD

Le lecteur devine probablement déjà que nous ne pourrons pas interagir avec des fichiers (comme file.renameTo(file2)) de manière normale. Si nous regardons le code de la méthode file.renameTo(File), nous ne verrons rien de suspect, aucune vérification. Et à juste titre, car les contrôles sont au niveau système de fichiers. Et si nous essayons de modifier un fichier situé sur la carte SD en utilisant les moyens habituels, nous obtiendrons l'exception suivante :

Java.io.IOException : impossible d'apporter des modifications au fichier your_file.ext

Ici manière intéressante déterminer si le fichier peut être modifié :

Public boolean isFileWritable(File file) ( boolean writable; try ( new FileOutputStream(file, true).close(); writable = file.exists() && file.canWrite(); ) catch (IOException e) ( writable = false; ) return inscriptible ;

Si le fichier est sur la carte, nous recevrons une IOException.

Pour modifier un fichier sur la carte mémoire, nous devons obtenir un DocumentFile représentant notre fichier, mais avec les autorisations d'écriture que nous avons obtenues avec SAF.

Au début de l'article, j'ai parlé de deux intentions pour SAF : ACTION_OPEN_DOCUMENT_TREE et ACTION_OPEN_DOCUMENT . Et j'ai dit que nous n'utiliserons pas la seconde intention, car cela oblige l'utilisateur à rechercher le fichier manuellement. Mais nous avons un URI que nous avons reçu en utilisant la première intention et cela signifie... Non, aucun API standard Il n'y a aucun moyen d'obtenir un DocumentFile, tout se fait manuellement.

L'algorithme est le suivant :

  1. Nous avons un fichier
  2. Déterminer le nom du lecteur sur lequel se trouve ce fichier
  3. Nous déterminons le chemin du fichier par rapport au lecteur sur lequel il se trouve. Nous obtenons une ligne comme android/dossier/fichier.txt
  4. Séparez une ligne par un symbole «/»
  5. Dans la boucle, pour chaque pièce reçue, on retrouve le DocumentFile représentant ce chemin, basé sur le DocumentFile de la pièce précédente
  6. Si l'algorithme s'est terminé sans erreur, le résultat est un DocumentFile représentant notre fichier

Public DocumentFile getDocumentFile(File file) ( DocumentFile document = null; String baseFolder = null; for (String path: getAllPaths()) ( File filePath = new File(path); 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 (Exception e) ( e.printStackTrace(); ) return document; getDocumentFileForUri(Uri treeUri, String relativePath) ( String parts = relativePath.split("/"); if (parts.length == 0) ( return null; ) DocumentFile document = DocumentFile.fromTreeUri (mContext, treeUri); for (String partie : pièces) ( DocumentFile nextDocument = document.findFile(part);

if (nextDocument != null) ( document = nextDocument; ) ) renvoie le document ;

) FileOutputStream outputStream = (FileOutputStream) mContentResolver.openOutputStream(documentFile.getUri()); Exemple de copie d'un fichier

Fichier de classe

dans DocumentFichier :

Public void writeFile(File file) ( boolean fileWritable = isFileWritable(file); boolean hasSdCardUri = !sharedPreferences.getString(SD_CARD_URI).isEmpty(); if (fileWritable || hasSdCardUri) ( /* vous pouvez modifier le fichier normalement, ou SAF */ return; ) if (Build.VERSION.SDK_INT >= 21) ( /* bienvenue ! (nous demandons la permission à l'utilisateur) */ throw new NoLollipopWritePermissionException(); ` ) else if (Build.VERSION.SDK_INT == 19 ) ( / * au revoir ! (impossible de modifier) ​​*/ throw new NoKitkatWritePermissionException() ) )

Conclusion

J'espère que mon expérience décrite dans l'article aidera ceux qui n'ont pas encore travaillé avec une carte SD à éviter de longues recherches et recherches.



Des questions ?

Signaler une faute de frappe

Texte qui sera envoyé à nos rédacteurs :