Principes de base des fichiers Android

Stockage interne et stockage externe

insérez la description de l'image ici

Avant Android4.4, le stockage interne (Internal Storage) fait référence au stockage du corps du téléphone, tandis que le stockage externe (External Storage) fait référence à la carte SD externe.

Dans Android 4.4 et versions ultérieures, s'il n'y a pas de carte SD externe, le stockage du corps est divisé en stockage interne (stockage interne) et stockage externe (stockage externe); si une carte SD externe est ajoutée, la carte SD externe et la machine le stockage externe du stockage personnel est compté comme stockage externe (stockage externe)

//在Android4.4及以后提供了getExternalFilesDirs方法来获取所有的外置存储
File[] files =  getExternalFilesDirs("");

Dossiers dans le système Android

insérez la description de l'image ici

répertoire de données

/dataLe répertoire est ce qu'on appelle le stockage interne (ROM), mais ce dossier ne peut pas être ouvert lorsque le téléphone n'est pas rooté.

  1. données/application/

Stockez tous les fichiers apk installés par les utilisateurs, à l'exception des fichiers d'application par défaut du système

  1. données/données/nom du paquet/

[Le transfert d'image du lien externe a échoué, le site source peut avoir un mécanisme anti-leeching, il est recommandé d'enregistrer l'image et de la télécharger directement (img-jv9LwiLm-1661177297780)(https://p1-jj.byteimg.com/tos -cn-i-t2oaga2asx /gold-user-assets/2020/3/29/171257f84ba6265b~tplv-t2oaga2asx-image.image)]

Les données de chaque application sont stockées dans un dossier nommé d'après le nom du package, comme illustré dans la figure :

  • cache : répertoire de cache
  • bases de données : répertoire de bases de données
  • fichiers : répertoire de stockage des fichiers
  • shared_prefs : répertoire de stockage des fichiers SharedPreferences
  1. /données/divers/

La plupart des informations WIFI et VPN sont stockées ici.

  1. /données/utilisateur/0/

/data/dataLe répertoire est en fait un lien symbolique vers /data/user/0le répertoire, qui /data/dataéquivaut à un pointeur vers
/data/user/0le répertoire.

Après Android 4.2, Android a lancé une fonctionnalité "multi-utilisateurs", ce qui signifie qu'un appareil peut être utilisé par plusieurs personnes en même temps, il est donc nécessaire de séparer les données, les applications et la configuration de la personnalité de chaque personne. Afin de distinguer les données, les nombres sont utilisés pour distinguer plusieurs utilisateurs, où 0 fait référence au premier utilisateur

Des liens souples sont disponibles pour voir les liens souples Linux et les liens durs

système

Fichiers système Android, les autorisations root sont requises

  1. /système/application/

Certaines applications système sont stockées ici

  1. répertoire /system/fonts/

Les fichiers de polices du système sont stockés ici

  1. répertoire /system/lib/

Presque tous les fichiers de bibliothèque partagée (.so) sont stockés ici.

  1. répertoire /system/media/

Ceci est utilisé pour enregistrer les sonneries du système et les invites du système.

stockage

storageLe répertoire est le stockage externe, comprenant le stockage interne du fuselage et la carte SD externe. Notez que différentes versions stockent les données à différents emplacements, par exemple :

Androidr4.4.2 avec carte SD (le téléphone sans Android4.4, les données proviennent du réseau)

Emplacement chemin api pour obtenir le chemin
stockage externe /storage/emulated/0/Android/data/packname/files getExternalStorageDirectory()
carte SD externe /stockage/sdcard1 getExternalFilesDirs()

Android 8 Xiaomi

Emplacement chemin api pour obtenir le chemin
stockage externe /storage/emulated/0/Android/data/packname/files getExternalStorageDirectory()
carte SD externe /stockage/nom_sd getExternalFilesDirs()

carte SD

Pour plus de détails, consultez l'analyse des points de confusion dans le stockage interne et externe d'Android (/mnt/sdcard, /storage/sdcard0, /storage/emulated/0, etc.)

Obtenir un répertoire dans Andorid

Les valeurs renvoyées par les API suivantes sont les valeurs renvoyées sous Android O

répertoire de stockage interne

    //创建/data/user/0/packagename/files文件夹,随着应用位置的改变,位置可能改变
      context.getFilesDir();
       //创建/data/user/0/packagename/cache文件夹当需要空间时,
       //系统会自动删除其中的文件(先删除存在最长时间的)
      context.getCacheDir();
      // 获取 /data 目录
      Environment.getDataDirectory()

Remarque : La lecture et l'écriture de l'objet fichier renvoyé par la méthode ci-dessus ne nécessitent pas d'autorisation. Lorsque l'utilisateur désinstalle l'application, le système supprime tous les fichiers liés à l'application dans le répertoire data/data.

Répertoire privé pour le stockage externe

     //一般存放临时缓存数据,对应 清除缓存
     //目录为 /storage/emulated/0/Android/data/packagename/cache
      context.getExternalCacheDir()/**
       *一般放一些长时间保存的数据,对应 清除数据
       *type的取值
       *null: /storage/emulated/0/Android/data/com.example.androidbase/files
       *DIRECTORY_MUSIC *Environment.DIRECTORY_MUSIC时:/storage/emulated/0/Android/data/com.example.androidbase/file*s/Music  
       * DIRECTORY_PODCASTS
       * DIRECTORY_RINGTONES
       * DIRECTORY_ALARMS
       * DIRECTORY_NOTIFICATIONS
       * DIRECTORY_PICTURES
       * DIRECTORY_MOVIES
       * 自定义字符串:/storage/emulated/0/Android/data/com.example.androidbase/files/自定义字符串
       */
      context.getExternalFilesDir(String type)//使用Environment来获取,需要获取权限来操作
      Environment.getExternalStorageDirectory();

Les méthodes 1 et 2 ne nécessitent pas d'autorisation, tandis que la méthode 3 doit demander une autorisation. Les caractéristiques de ce répertoire sont :

  • Le système ne nettoie généralement pas les fichiers qu'il contient
  • Étant donné que les utilisateurs ordinaires peuvent librement exploiter les fichiers qu'il contient, un jugement non nul et une capture d'exception doivent être ajoutés lors de son utilisation.
  • D'autres applications obtenues WRITE_EXTERNAL_STORAGEpeuvent exploiter le fichier, et après Android 7.0, il doit être accessible via FileProvider
  • Depuis Android 4.4, l'application peut lire et écrire directement dans le répertoire privé de l'application dans l'espace de stockage externe, de sorte que les développeurs n'ont pas besoin de demander des autorisations de lecture et d'écriture de fichier dans le fichier manifeste ou dynamiquement dans l'espace de stockage externe.
  • Supprimé après la désinstallation de l'application

Répertoire public pour le stockage externe

        /**
         * 需要申请权限
         * Type的值看上面(不能为null),注意要创建文件时不能使用 File的 mkdir() 和 mkdirs() 方法,它们只会创建目录,可以使用
         *createNewFile()或者不使用 都可以创建文件
         *空字符串时:/storage/emulated/0
         *自定义字符串:/storage/emulated/0/自定义字符串
         */
        Environment.getExternalStoragePublicDirectory(String type);

Obtenez la taille totale et la taille disponible de l'espace extérieur et de l'espace intérieur

Regardez l' acquisition par Android de la capacité de stockage du téléphone mobile

Informations sur les données multimédia Android

Réimprimé à partir d' Android Multimedia : MediaProvider, MediaStore

MediaProvider est une base de données du système Android, également connue sous le nom de base de données multimédia, qui enregistre les informations de tous les fichiers stockés sur le téléphone mobile. Cette base de données est stockée dans /data/data/com.android.providers.media/databases, qui contient deux bases de données : internal.db et external.db, internal.db stocke les informations de fichier de la partition système, le développeur ne le fait pas n'est pas possible d'obtenir les informations via l'interface, tandis que external.db stocke les informations du fichier dans la zone de stockage que nos utilisateurs peuvent voir, qui comprend le stockage intégré du téléphone mobile et la carte SD.

MediaStore fournit des métadonnées sur tous les médias disponibles sur les périphériques de stockage internes et externes.

Classe interne MediaStore

  • classe MediaStore.Audio : conteneur pour tout le contenu audio
  • classe MediaStore.Files : la table MediaProvider contient un index de tous les fichiers du magasin multimédia, y compris les fichiers non multimédias
  • classe MediaStore.Images : conteneur pour tout le contenu des images
  • interface MediaStore.MediaColumns : champs publics de la table MediaProvider
  • classe MediaStore.Video : conteneur pour tout le contenu vidéo

Description du champ MediaStore.MediaColumns

  • Chaîne DATA : chemin d'accès au fichier sur le disque
  • Chaîne DATE_ADDED : heure à laquelle le fichier a été ajouté au fournisseur de médias (en secondes)
  • Chaîne DATE_MODIFIED : heure à laquelle le fichier a modifié l'unité pour la dernière fois
  • Chaîne DISPLAY_NAME : le nom d'affichage du fichier
  • Chaîne HEIGHT : la hauteur de l'image/vidéo en pixels
  • Chaîne MIME_TYPE : type MIME du fichier
  • Chaîne SIZE : taille du fichier en octets
  • TITRE de la chaîne : Titre
  • String WIDTH : La largeur de l'image/vidéo en pixels.

combat

Imitation QQ sélecteur d'image locale

String[] columns = {
    
    MediaStore.Images.Media._ID, MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Media.DATA, MediaStore.Images.Media.BUCKET_ID,
                MediaStore.Images.Media.BUCKET_DISPLAY_NAME,MediaStore.MediaColumns.MIME_TYPE,MediaStore.MediaColumns.SIZE
};
String sortOrder = MediaStore.Images.Media.DATE_ADDED+" desc";
Cursor cursor = getActivity().getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, null, sortOrder);
LinkedHashMap<String,List<ImageBean>> map = new LinkedHashMap<>();
while (cursor.moveToNext()){
    
    
    String id = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media._ID));
    String thumbnailsPath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Thumbnails.DATA));
    String path =  cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
    String groupId = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_ID));
    String groupName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
    String type = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.MIME_TYPE));
    String size = cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.SIZE));
    ImageBean imageBean = new
            ImageBean(id,thumbnailsPath,path,groupId,groupName,type,size);
    if (map.containsKey(groupId)){
    
    
        map.get(groupId).add(imageBean);
    }else {
    
    
        ImageGroupBean imageGroupBean = new ImageGroupBean(groupId,groupName,path);
        group.add(imageGroupBean);
        List<ImageBean> l = new ArrayList<>();
        l.add(imageBean);
        map.put(groupId,l);
    }
}
cursor.close();

L'effet est comme indiqué sur la figure

Veuillez ajouter une description de l'image

référence

  • https://blog.csdn.net/csdn_aiyang/article/details/80665185
  • https://blog.csdn.net/dongyaqin/java/article/details/88947467
  • https://blog.csdn.net/qq_39074954/java/article/details/97613088

Je suppose que tu aimes

Origine blog.csdn.net/lichukuan/article/details/126474636
conseillé
Classement