Android 의 assets 디 렉 터 리 에 있 는 파일 을 읽 고 쓰 는 방법 에 대한 자세 한 설명
첫 번 째 는 res 디 렉 터 리 에 저 장 된 컴 파일 가능 한 자원 파일 입 니 다.
이러한 자원 파일 시스템 은 R.java 에서 이 자원 파일 의 ID 를 자동 으로 생 성 하기 때문에 이 자원 파일 에 접근 하 는 것 이 비교적 간단 합 니 다.R.XXX.ID 를 통 해 가능 합 니 다.
두 번 째 는 assets 디 렉 터 리 에 저 장 된 네 이 티 브 자원 파일 입 니 다.
시스템 이 컴 파일 할 때 assets 의 자원 파일 을 컴 파일 하지 않 기 때문에 R.XXX.ID 를 통 해 접근 할 수 없습니다.그럼 저 는 이 자원 의 절대적 인 경 로 를 통 해 그들 을 방문 할 수 있 습 니까?apk 설치 후/data/app/**.apk 디 렉 터 리 에 apk 형식 으로 존재 하기 때문에 asset/res 와 apk 에 연결 되 어 있 고/data/YourApp 디 렉 터 리 에 압축 을 풀 지 않 기 때문에 assets 의 절대 경 로 를 직접 얻 을 수 없습니다.왜냐하면 이것 은 전혀 없 기 때 문 입 니 다.
다행히 안 드 로 이 드 시스템 은 우리 에 게 AssetManager 도구 류 를 제공 했다.
공식 API 를 보면 알 수 있 듯 이 AssetManager 는 응용 프로그램의 원본 자원 파일 에 접근 할 수 있 습 니 다.이 클래스 는 간단 한 바이트 흐름 으로 프로그램 과 연 결 된 원본 자원 파일 을 열 고 읽 을 수 있 도록 낮은 수준의 API 를 제공 합 니 다.
Android 는/res 디 렉 터 리 에 자원 파일 을 저장 하 는 것 외 에/assets 디 렉 터 리 에 도 자원 파일 을 저장 합 니 다./assets 디 렉 터 리 아래 에 R.java 에서 자동 으로 ID 가 생 성 되 지 않 기 때문에 assets 디 렉 터 리 아래 의 자원 파일 을 읽 으 려 면 경 로 를 제공 해 야 합 니 다.저 희 는 AssetManager 클래스 를 통 해 이 파일 에 접근 할 수 있 습 니 다.
저 자 는 A.apk(자원 apk,예 를 들 어 so,apk,실행 가능 한 파일 등 을 assets 디 렉 터 리 아래 에 두 어야 합 니 다.apk 는 논리 코드 를 실현 하지 못 했 습 니 다)에서 지정 한 디 렉 터 리 로 자원 을 복사 해 야 합 니 다.그래서 저 자 는 자원 복사 논 리 를 실현 하 는 B.apk(하나의 Service,Activity 로 도 가능 합 니 다)를 만 들 었 습 니 다.복사 경 로 는 일반적으로 접근 하거나 만 들 수 없 기 때문에(각 apk 설치 후/data/자기 가방 이름/아래 의 개인 공간 에 만 접근 할 수 있 습 니 다)저 자 는 이 apk 가 시스템 권한(System 권한)을 가 져 올 수 있 도록 해 야 합 니 다.AndroidManifest.xml 에서 shareduserid 를 설명 하고 다음 절 을 어떻게 조작 하 는 지 구체 적 으로 기록 해 야 합 니 다.
1.AssetManager 에서 파일 을 읽 을 때 자주 사용 하 는 API
1.파일 읽 기 방식
AssetManager.open(String filename)은 InputSteam 형식의 바이트 흐름 을 되 돌려 줍 니 다.이 파일 이름 은 폴 더 가 아 닌 파일 이 어야 합 니 다.AssetManager 가 자원 파일 을 여 는 open 방법 은 리 로드 방법 입 니 다.열 리 는 방식 의 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[] Array of strings, one for each asset. These file names are relative to 'path'. You can open the file by concatenating 'path' and a name in the returned string (via File) and passing that to open().
2.관련 실현 코드
자원 APK(A.apk)
구체 적 으로 코드 세 션 을 실현 합 니 다.시스템 권한 을 사용 하기 때문에 생 성 된 경 로 는 스스로 B.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();
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.