Maison > Java > javaDidacticiel > Explication détaillée de la façon de lire et d'écrire des fichiers dans le répertoire des actifs sous Android

Explication détaillée de la façon de lire et d'écrire des fichiers dans le répertoire des actifs sous Android

高洛峰
Libérer: 2017-01-17 15:10:49
original
2066 Les gens l'ont consulté

Les fichiers de ressources Android peuvent être grossièrement divisés en deux types :

Le premier est le fichier de ressources compilable stocké dans le répertoire res :

Ce type de système de fichiers de ressources sera dans R. java L'ID du fichier de ressources est généré automatiquement, donc accéder à ce fichier de ressources est relativement simple, il suffit de passer R.XXX.ID

Le second est le fichier de ressources natif stocké dans le répertoire des actifs :

Étant donné que le système ne compile pas les fichiers de ressources sous les actifs lors de la compilation, nous ne pouvons pas y accéder via R.XXX.ID. Alors peut-on y accéder par le chemin absolu de la ressource ? Parce qu'une fois l'apk installé, il sera placé dans le répertoire /data/app/**.apk et existera sous la forme d'apk Asset/res et sera lié dans l'apk et ne sera pas décompressé dans /data/. data/YourApp, nous ne pouvons donc pas obtenir directement les chemins absolus vers les actifs car ils n'existent pas.

Heureusement, le système Android nous fournit une classe d'outils AssetManager.

En regardant l'API officielle, vous pouvez voir qu'AssetManager donne accès aux fichiers de ressources originaux de l'application ; cette classe fournit une API de bas niveau qui vous permet d'ouvrir, de lire et d'appliquer sous la forme d'un flux d'octets simple Les fichiers de ressources brutes que le programme regroupe.

En plus de fournir le répertoire /res pour stocker les fichiers de ressources, Android fournit également les fichiers de ressources à stocker dans le répertoire /assets. Les ID ne seront pas automatiquement générés dans R.java sous le répertoire /assets, donc. lisez le répertoire des ressources. Les fichiers de ressources doivent fournir des chemins, et nous pouvons accéder à ces fichiers via la classe AssetManager.
L'auteur doit copier les ressources de A.apk (ressource apk, mettre toutes les ressources telles que : so, apk, fichiers exécutables, etc. sous le répertoire des actifs, apk n'implémente pas de code logique) dans le répertoire spécifié, donc l'auteur crée A B.apk (un service, qui peut également être implémenté avec Activity) est créé pour implémenter la logique de copie de ressources, car le chemin de copie est généralement inaccessible ou créé (chaque apk ne peut accéder qu'à /data/data/propre nom de package. / après l'installation) Espace privé ci-dessous), si l'auteur a besoin de cet apk pour obtenir les autorisations système (Autorisations système), le shareduserid doit être déclaré dans AndroidManifest.xml. L'opération spécifique sera enregistrée dans la section suivante.


1. Plusieurs API couramment utilisées par AssetManager pour lire des fichiers

1. Méthode de lecture de fichier
AssetManager.open(String filename) renvoie un flux d'octets de type InputSteam, le nom du fichier ici doit être un fichier, pas un dossier. La méthode open d'AssetManager pour ouvrir les fichiers de ressources est une méthode surchargée. Vous pouvez ajouter un paramètre int de la méthode d'ouverture, et les opérations correspondantes peuvent être effectuées en fonction de différents paramètres. Pour plus de détails, veuillez consulter le document officiel http://web.mit.edu/clio/MacData/afs/sipb/project/android/docs/reference/android/content/res/AssetManager.html
2. Fichiers de ressources peut exister Dossiers et sous-répertoires
public final String[]list(String path), renvoie les noms de tous les fichiers et sous-répertoires du répertoire actuel. L'accès à tous les fichiers de ressources peut être obtenu en parcourant de manière récursive l'intégralité du répertoire de fichiers. String[] Tableau de chaînes, une pour chaque actif. Ces noms de fichiers sont relatifs au « chemin ». Vous pouvez ouvrir le fichier en concaténant « chemin » et un nom dans la chaîne renvoyée (via File) et en le transmettant à open(). .

2. Code d'implémentation pertinent
Ressource APK (A.apk)

Explication détaillée de la façon de lire et décrire des fichiers dans le répertoire des actifs sous Android

Extrait de code d'implémentation spécifique, en raison de l'utilisation des autorisations système, le chemin généré Vous pouvez modifier B.apk vous-même

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    try {
      ctxDealFile = this.createPackageContext("com.zlc.ipanel",
          Context.CONTEXT_IGNORE_SECURITY);
    } catch (NameNotFoundException e1) {
      // TODO Auto-generated catch block
      e1.printStackTrace();
    }
    
    btn3.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        // TODO Auto-generated method stub
        try {
          String uiFileName = "ipanelJoin";
          deepFile(ctxDealFile, uiFileName);
        } catch (Exception e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          textView.setText("file is wrong");
        }
      }
    });
    //
  }
  public void deepFile(Context ctxDealFile, String path) {
    try {
      String str[] = ctxDealFile.getAssets().list(path);
      if (str.length > 0) {//如果是目录
        File file = new File("/data/" + path);
        file.mkdirs();
        for (String string : str) {
          path = path + "/" + string;
          System.out.println("zhoulc:\t" + path);
          // textView.setText(textView.getText()+"\t"+path+"\t");
          deepFile(ctxDealFile, path);
          path = path.substring(0, path.lastIndexOf('/'));
        }
      } else {//如果是文件
        InputStream is = ctxDealFile.getAssets().open(path);
        FileOutputStream fos = new FileOutputStream(new File("/data/"
            + path));
        byte[] buffer = new byte[1024];
        int count = 0;
        while (true) {
          count++;
          int len = is.read(buffer);
          if (len == -1) {
            break;
          }
          fos.write(buffer, 0, len);
        }
        is.close();
        fos.close();
      }
    } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
Copier après la connexion

Pour des informations plus détaillées sur la façon de lire et d'écrire des fichiers dans le répertoire des actifs sous Android, veuillez faire attention au site Web PHP chinois pour les articles connexes !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal