개발/Mobile

[안드로이드] .obb 확장자 파일을 다운받아 압축 풀기

hojak99 2016. 9. 30. 05:38

이전 글에서는 구글에 업로드한 .obb 파일, 즉 확장 파일을 다운받을 수 있는 환경을 만들었다. 이번에는 다운받은 .obb 파일을 이용해 이미지를 띄우는 것에 대해 글을 작성하겠다.




구글 플레이스토어에 어플을 등록할 때 확장 파일도 업로드 했다고 가정하겠다. 

확장 파일을 업로드 할 때 확장 파일로 업로드할 파일들을 압축해 (파일명).zip 라는 형식으로 만들어야 한다.


그렇다면 이제 플레이스토어에 등록된 어플리케이션을 다운받게 되면 .obb 파일, 즉 확장 파일도 함께 다운을 받게 된다. 



[그림 1: 확장 파일이 다운로드 되는 경로]



[그림 1]을 보면 핸드폰 최상위 폴더에 있는 Android/obb 폴더로 경로가 지정되있는데 확장 파일이 다운받아지게 된다면 이 경로로 다운을 받게된다.


※ 폴더를 제외한 나머지 파일들은 무시한다. 필자가 확장 파일을 테스트하려고 이동시킨 파일들이니 무시하자



보통 확장 파일을 다운받게되면 폴더가 생성되는데 그 폴더의 이름은 어플리케이션의 패키지명일 것이다.

예를 들어 패키지명이 "hojak99.tistrory.com" 일시 폴더도 이 이름으로 생성이 되어 이 폴더 안에 .obb 파일이 생성된다.

그렇다면 .obb의 이름은 무엇일까?


.obb의 이름은 보통 "m0ain.(어플 버전).패키지명.obb" 일 것이다. 

[그림 1]에서 아까 무시해도 된다고 했던 파일들을 보면 알 수 있다. 필자가 등록한 어플리케이션의 확장 파일이다.



File path = new File(Environment.getExternalStorageDirectory() + "/Android/obb/");
System.out.println(".obb folder Path:" + path);

PackageInfo info = null;
PackageManager manager = this.getPackageManager();

info = manager.getPackageInfo(this.getPackageName(), 0);

int version = info.versionCode;    //어플리케이션의 버전 명을 알려준다.

if (path.exists()) {
File filePath =
new File(path + File.separator + "main." + version + "." + getPackageName() + ".obb");
System.out.println(".obb Path: " + filePath);

[소스 코드 1: obb 파일 경로]


[소스 코드 1]은 보시다시피 변수 path에 .obb 폴더의 경로가 들어가고 version 변수에는 어플리케이션의 버전, 

file path에는 .obb의 경로가 들어간다.




ZipResourceFile zipfile = new ZipResourceFile(filePath.toString());    //
InputStream inputStream = zipfile.getInputStream("CCCam_Picture.zip");

createZIPFile(inputStream);

File ppa = new File(Environment.getExternalStorageDirectory() + "/.CCCam_Picture");

ppa.mkdirs();

String source = Environment.getExternalStorageDirectory() + "/Download/CCCam_Picture.zip";
String destination = Environment.getExternalStorageDirectory() + "/.CCCam_Picture";

net.lingala.zip4j.core.ZipFile zipFile = new net.lingala.zip4j.core.ZipFile(source);
zipFile.extractAll(destination);



public void createZIPFile(InputStream inputStream) throws PackageManager.NameNotFoundException {

File file = new File(Environment.getExternalStorageDirectory() + "/Download/CCCam_Picture.zip");
try {

OutputStream outputStream = new FileOutputStream(file);

if (outputStream == null) {
System.out.println("outputStream is null");
} else
System.out.println("outputStream is good");

byte[] buf = new byte[1024];
int len = 0;

while ((len = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, len);
}
outputStream.close();
inputStream.close();

System.out.println("finish");

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}

[소스 코드 2: .obb 파일압축 풀기]


필자는 먼저 .obb에 대한 파일을 압축해제를 하기 위해 특정 폴더에 확장 파일로 해놓은 (이름).zip 파일을 생성하고 생성한 zip파일을 압축 해제해 .zip을 삭제하는 방식으로 코드를 짰다.


[소스 코드 2]에 대해서 이야기하기 전 필자는 압축을 풀기 위해 "zip4j" 라는 라이브러리를 이용했다. 이 라이브러리를 이용하면 압축, 압출 해제를 하기 편하다.


[소스 코드 2] 는 zipfile 이라고 객체선언을 해주고 인자값으로 filepath, 즉 .obb의 경로를 넣어서 객체를 생성했다. 그리고 inputstream 이라는 변수를 선언해 "CCCam_Picture.zip"이라는 이름의 InputStream 을 넣어준다. (이해하기 쉽게 말하겠다..)


createZIPFile() 메소드를 이용해 인자값으로 inputstream을 넣고 inputstream 해당하는 파일을 생성한다. 

필자는 다운로드 폴더에 파일을 생성하였다.  그리고 다운로드 폴더에 있는 zip 파일을 압축해제 시키고자 하는 폴더를 생성해 그 폴더에 zipFile.extractAll()메소드를 이용해 압축을 풀었다.


그렇게 된다면 성공!!



이제 압축 해제한 파일들을 이용해 개발을 하길 바랍니다~

반응형