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)
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(); } }
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 !