Android-Ressourcendateien können grob in zwei Typen unterteilt werden:
Die erste ist die kompilierbare Ressourcendatei, die im res-Verzeichnis gespeichert ist:
Diese Art von Ressourcendateisystem befindet sich in R. java Die ID der Ressourcendatei wird automatisch generiert, sodass der Zugriff auf diese Ressourcendatei relativ einfach ist. Übergeben Sie einfach R.XXX.ID. Die zweite ist die im Assets-Verzeichnis gespeicherte native Ressourcendatei:
Da das System die Ressourcendateien unter Assets während der Kompilierung nicht kompiliert, können wir nicht über R.XXX.ID darauf zugreifen. Können wir also über den absoluten Pfad der Ressource auf sie zugreifen? Denn nachdem die APK installiert wurde, wird sie im Verzeichnis /data/app/**.apk abgelegt und liegt in der Form apk Asset/res vor. Sie ist in der APK gebunden und wird nicht in /data/ dekomprimiert. data/YourApp-Verzeichnis, daher können wir die absoluten Pfade zu Assets nicht direkt abrufen, da sie nicht existieren.
Glücklicherweise stellt uns das Android-System eine AssetManager-Toolklasse zur Verfügung.
Wenn Sie sich die offizielle API ansehen, können Sie sehen, dass AssetManager Zugriff auf die ursprünglichen Ressourcendateien der Anwendung bietet. Diese Klasse bietet eine Low-Level-API, mit der Sie sie öffnen, lesen und anwenden können einfacher Bytestream Die Rohressourcendateien, die das Programm bündelt.
Zusätzlich zur Bereitstellung des /res-Verzeichnisses zum Speichern von Ressourcendateien stellt Android auch Ressourcendateien zur Verfügung, die im /assets-Verzeichnis gespeichert werden. Daher werden in R.java nicht automatisch unter dem /assets-Verzeichnis generiert Lesen Sie das Assets-Verzeichnis. Die Ressourcendateien müssen Pfade bereitstellen, und wir können über die AssetManager-Klasse auf diese Dateien zugreifen.
Der Autor muss Ressourcen von A.apk (Ressourcen-Apk, alle Ressourcen wie: so, apk, ausführbare Dateien usw. im Assets-Verzeichnis ablegen, apk implementiert keinen logischen Code) in das angegebene Verzeichnis kopieren, also Der Autor erstellt eine B.apk (einen Dienst, der auch mit Aktivität implementiert werden kann), um die Logik zum Kopieren von Ressourcen zu implementieren, da auf den Kopierpfad im Allgemeinen nicht zugegriffen werden kann (jede APK kann nur auf den eigenen Paketnamen zugreifen). / nach der Installation) Privater Bereich unten), wenn der Autor diese APK benötigt, um Systemberechtigungen (Systemberechtigungen) zu erhalten, muss die shareduserid in AndroidManifest.xml deklariert werden. Der spezifische Vorgang wird im nächsten Abschnitt aufgezeichnet.
1. Dateilesemethode
2. Ressourcendateien kann existieren Ordner und Unterverzeichnisse
public final String[]list(String path), gibt die Namen aller Dateien und Unterverzeichnisse im aktuellen Verzeichnis zurück. Der Zugriff auf alle Ressourcendateien kann durch rekursives Durchlaufen des gesamten Dateiverzeichnisses erreicht werden. String[] Array von Zeichenfolgen, eine für jedes Asset. Sie können die Datei öffnen, indem Sie „Pfad“ und einen Namen in der zurückgegebenen Zeichenfolge verketten (über Datei) und diesen an open() übergeben. .
2. Relevanter Implementierungscode
Spezifischer Implementierungscode-Snippet, aufgrund der Verwendung von Systemberechtigungen, den generierten Pfad Sie können B.apk selbst ändern
Weitere Informationen zum Lesen und Schreiben von Dateien im Asset-Verzeichnis in Android finden Sie auf der chinesischen PHP-Website für verwandte Artikel!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(); } }