본문 바로가기
Android

OBB File을 Mount하여 이용하는 방법 - 압축해제 안하고!

by CodeDiver 2015. 1. 21.

<OBB파일 Mount 방법>


OBB파일을 압축해제하지 않고 바로 Cocos2d-x에서 로드하려고 찾다가 발견했다.

아직 Cocos2d-x 에서는 접근되는지 확인은 안했지만, 아마도 될거같다.

이게 안되면 예전처럼 Cocos2d-x 엔진소스 분석해서 OBB에서 바로 읽도록 수정해야 한다. 

이 작업을 v2.0.4에서 했었는데, 이번에 v3.3 으로 업글하려고 진행 중인 상황에서

부가적인 작업까지 해야하는건 좀 가혹하다. ㅡ.ㅡ;

-> Cocos2d-x에서 mount된 경로(/mnt/obb/xxxxx)에 바로 접근이 가능하다. 


I. Jobb를 이용한 OBB 파일 생성


1. sdk/tools/jobb.bat 를 path로 걸어준다.

2. 커맨드창에서 아래와 같이 입력한다.


d:\>jobb -d /Resources -o /Resources_test.obb -pn com.gonghee.exobb -pv 1





중요! 패키지명을 맞추지 않으면 퍼미션 디나이드! ㅡ.ㅡ; (버전은 안맞아도 된다)



자세한 내용은 구글 개발자페이지 참고.

       링크: http://developer.android.com/intl/ko/tools/help/jobb.html




II.Android 에서 Mount 하는 방법


ERROR_INTERNAL 때문에 한참 고생했는데, JOBB로 obb 파일을 만드니까 잘 된다. 기존에 zip tool로 만들어뒀던 obb파일들은 재사용이 불가능.

public class AppActivity extends Cocos2dxActivity {

    private StorageManager mgr = null;

    private String mMountPath = "";

    private String mObbFile = "";


    @Override

    protected void onCreate(Bundle savedInstanceState) {

        mountObbFile();

        super.onCreate(savedInstanceState);

    }


    public void mountObbFile() {

        mObbFile = Environment.getExternalStorageDirectory() + "/Resources_test.obb";

        

        

        

        final File obbFile = new File(mObbFile);

        if (obbFile.exists()) {

            Log.d("OBB", "FILE: " + mObbFile + " Exists");

        } else {

            Log.d("OBB", "FILE: " + mObbFile + " DOESNT EXIST");

        }

        

        // mgr is a member varible of my main activity

        mgr = (StorageManager)getSystemService(Context.STORAGE_SERVICE);

        

        if(mgr.isObbMounted(mObbFile)) {

            Log.i("OBB", "*********** Already mounted **********");

            return;

        }        


       

        if (mgr.mountObb(mObbFile, null, listener)) {

            Log.i("OBB", "Attempting to mount");

        } else {

            Log.i("OBB", "Mount failed"); // this isn't happening

        }

    }


    OnObbStateChangeListener listener = new OnObbStateChangeListener() {

        @Override

        public void onObbStateChange(String path, int state) {


            Log.i("OBB", String.format("onObbStateChange:Path [%s] State=%d", path, state));


            

            if (state == OnObbStateChangeListener.MOUNTED) {

                Log.i("OBB", "Mounted! According to the listener");


                mMountPath = mgr.getMountedObbPath(path);

                Log.i("OBB", String.format("mountedPath:[%s]", mMountPath));


                if (mgr.isObbMounted(mObbFile)) {

                    Log.i("OBB", "Efectively mounted!");

                    Toast.makeText(getApplicationContext(), mMountPath, Toast.LENGTH_LONG).show();


                } else {

                    Log.i("OBB", "Not really :(");

                }

                

                

            } else if (state == OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT) {

                Log.e("OBB", "ERROR_COULD_NOT_MOUNT");

            } else {

                Log.e("OBB", "NOT mounted according to the listener");

            }

        }

    };



III. Cocos2d-x에서 Resources 경로 지정방법

- 해보고 내용추가 예정.

   FileUtils API에 리소스 경로 지정하는게 있던것 같다.