안드로이드 리소스 파일은 크게 두 가지 유형으로 나눌 수 있습니다.
첫 번째는 res 디렉터리에 저장되는 컴파일 가능한 리소스 파일입니다.
이런 종류의 리소스 파일 시스템은 R에 있습니다. java 리소스 파일의 ID는 자동으로 생성되므로 이 리소스 파일에 액세스하는 것은 상대적으로 간단합니다. R.XXX.ID를 전달하면 됩니다.
두 번째는 자산 디렉터리에 저장된 기본 리소스 파일입니다.
컴파일 시 에셋의 리소스 파일을 시스템에서 컴파일하지 않기 때문에 R.XXX.ID를 통해 접근할 수 없습니다. 그러면 리소스의 절대 경로를 통해 액세스할 수 있습니까? apk가 설치된 후에는 /data/app/**.apk 디렉토리에 배치되고 apk Asset/res 형식으로 존재하며 apk에 바인딩되어 /data/에 압축이 풀리지 않습니다. data/YourApp 디렉터리가 존재하지 않기 때문에 자산에 대한 절대 경로를 직접 얻을 수 없습니다. 다행히 Android 시스템에서는 AssetManager 도구 클래스를 제공합니다. 공식 API를 살펴보면 AssetManager는 애플리케이션의 원본 리소스 파일에 대한 액세스를 제공합니다. 이 클래스는 간단한 바이트 스트림 형식으로 열고 읽고 적용할 수 있는 하위 수준 API를 제공합니다. 프로그램이 함께 묶는 원시 리소스 파일입니다. 리소스 파일을 저장하기 위해 /res 디렉토리를 제공하는 것 외에도 Android는 /assets 디렉토리에 리소스 파일 저장소를 제공합니다. ID는 /assets 디렉토리 아래의 R.java에서 자동으로 생성되지 않으므로 읽어보세요. 자산 디렉토리. 리소스 파일은 경로를 제공해야 하며 AssetManager 클래스를 통해 이러한 파일에 액세스할 수 있습니다. 작성자는 A.apk(리소스 apk, 모든 리소스(예: apk, 실행 파일 등과 같은 모든 리소스를 자산 디렉토리 아래에 넣음, apk는 논리 코드를 구현하지 않음))의 리소스를 지정된 디렉토리로 복사해야 하므로 작성자는 리소스 복사 논리를 구현하기 위해 A B.apk(활동으로도 구현될 수 있음)를 생성합니다. 복사 경로는 일반적으로 액세스할 수 없거나 생성되기 때문에(각 APK는 /data/data/자신의 패키지 이름에만 액세스할 수 있습니다.) / 설치 후) 아래 개인 공간) 작성자가 시스템 권한(시스템 권한)을 얻기 위해 이 APK가 필요한 경우 AndroidManifest.xml에 공유 사용자 ID를 선언해야 합니다. 구체적인 작업은 다음 섹션에 기록됩니다.
1. AssetManager가 파일을 읽는 데 일반적으로 사용되는 여러 API
AssetManager.open(String filename)은 InputSteam 유형 바이트 스트림, 파일 이름을 반환합니다. 여기에는 폴더가 아니라 파일이 있어야 합니다. 리소스 파일을 여는 AssetManager의 열기 메서드는 열기 메서드의 int 매개변수를 추가할 수 있으며, 해당 작업은 다른 매개변수에 따라 수행될 수 있습니다. 자세한 내용은 공식 문서 http://web.mit.edu/clio/MacData/afs/sipb/project/android/docs/reference/android/content/res/AssetManager.html
을 참조하세요. 2. 리소스 파일 존재할 수 있음 폴더 및 하위 디렉터리
public final String[]list(String path)는 현재 디렉터리 아래의 모든 파일 및 하위 디렉터리의 이름을 반환합니다. 전체 파일 디렉터리를 반복적으로 탐색하면 모든 리소스 파일에 액세스할 수 있습니다. String[] 각 자산에 대해 하나씩 문자열 배열입니다. 이러한 파일 이름은 'path'에 상대적입니다(File을 통해). .
리소스 APK(A.apk)
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(); } }