Android数据包相关

1 data数据

data数据位于 /data/data/com.xxx.xxx/xxx.xml 。 可用 sys.io.File.getContent(SystemPath.applicationStorageDirectory + "/xxx.xml")

new URLLoader(new URLRequest(SystemPath.applicationStorageDirectory + "/xxx.xml")) 读取。
需要保证所有者为 当前程序 ,且拥有读写权限。

2 obb数据

2.1 obb生成

jobb [-d <directory>][-o <filename>][-pn <package>][-pv <version>] \
     [-k <key>][-ov][-dump <filename>][-v][-about]

例如:

jobb -pn hoothin.SnakeRaiden -pv 10 -o D:\Workspace\xxx\xxx.obb -k mypassword -d D:\Workspace\xxx\assets

obb文件内不能有obb文件

2.2 obb读取

2.2.1 获取StorageManager

StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

2.2.2 挂载obb文件

//通过一个文件名判断挂载的OBB文件路径
String getMountedObbPath(String filename) 

//这个OBB文件是否挂载了
boolean isObbMounted(String filename) 

//挂载一个OBB文件,如果没有密码key传null
boolean mountObb(String filename, String key, OnObbStateChangeListener listener) 
//例如
mainFile = new File(Environment.getExternalStorageDirectory() + "/Android/obb/" + packageName + "/" + "main." + packageVersion + "." + packageName + ".obb");
sm.mountObb(mainFile.getAbsolutePath(), null, mainObbStateChangeListener );

//反挂载一个obb文件,这个方法是异步的,第二个参数可以强制反挂载。
boolean unmountObb(String filename, boolean force, OnObbStateChangeListener listener)

2.2.3 读取数据

  1. 加载回调

    android.os.storage.OnObbStateChangeListener接口实现了一个void onObbStateChange(String path, int state) 方法来回调状态,第二个参数state的状态有:

    int ERROR_ALREADY_MOUNTED 这个OBB已经挂载了
    int ERROR_COULD_NOT_MOUNT 这个OBB不能挂在到系统.
    int ERROR_COULD_NOT_UNMOUNT 这个OBB不能反挂载.
    int ERROR_INTERNAL 一个内部的系统错误导致正在重试挂载obb
    int ERROR_NOT_MOUNTED 一个反挂载调用执行时这个obb还没有挂在过.
    int ERROR_PERMISSION_DENIED 当前程序没有使用这个obb的权限.
    int MOUNTED The obb容器已经挂载好了,可以使用了.
    int UNMOUNTED The OBB容易现在反挂载完成,将无法再使用.
    
    OnObbStateChangeListener mainObbStateChangeListener = new OnObbStateChangeListener() {
        @Override
        public void onObbStateChange(String path, int state) {
            super.onObbStateChange(path, state);
            if (state == MOUNTED) {
                Log.d(TAG, "Mounting main file done.");
                main = sm.getMountedObbPath(mainFile.getAbsolutePath());
                if ( listener != null ) {
                    listener.onMountSuccess();
                }
            } else {
                Log.d(TAG, "Mounting main file failed with state = " + state);
                if ( listener != null ) 
                listener.onObbStateChange(path, state);
            }
        }
    };
    
  2. 加载完成

    OBB将被挂载到/mnt/XXXX/的位置 (XXXX是系统自动生成的字符串路径), 可用getMountedObbPath获取该位置,然后用File读取

    new File(sm.getMountedObbPath("/path/to/obb/file") + 
            "path/to/file/in/obb.png");
    

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注