Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mounting an encrypted obb apk expansion file in Android

I have created an encrypted .obb file using the jobb tool. I use the following code to mount the obb file:

    public void mountExpansion() {
    final StorageManager storageManager  = (StorageManager) getContext()
        .getSystemService(Context.STORAGE_SERVICE);


    String packageName = "name.of.the.package";
    String filePath = Environment.getExternalStorageDirectory()
            + "/Android/obb/" + packageName + "/" + "main."
            + version + "." + packageName + ".obb";
    final File mainFile = new File(filePath);
    if (mainFile.exists()) {
        Log.d("STORAGE", "FILE: " + filePath + " Exists");
    } else {
        Log.d("STORAGE", "FILE: " + filePath + " DOESNT EXIST");
    }

    String key = "thisIsMyPassword";
    if (!storageManager.isObbMounted(mainFile.getAbsolutePath())) {
        if (mainFile.exists()) {
            if(storageManager.mountObb(mainFile.getAbsolutePath(), key,
                    new OnObbStateChangeListener() {
                        @Override
                        public void onObbStateChange(String path, int state) {
                            super.onObbStateChange(path, state);
                            Log.d("PATH = ",path);
                            Log.d("STATE = ", state+"");
                            expansionFilePath = storageManager.getMountedObbPath(path);
                            if (state == OnObbStateChangeListener.MOUNTED) {
                                expansionFilePath = storageManager
                                        .getMountedObbPath(path);
                                Log.d("STORAGE","-->MOUNTED");
                            } 
                            else {
                                Log.d("##", "Path: " + path + "; state: " + state);
                            }
                        }
                    }))
            {
                Log.d("STORAGE_MNT","SUCCESSFULLY QUEUED");
            }
            else
            {
                Log.d("STORAGE_MNT","FAILED");
            }

        } else {
            Log.d("STORAGE", "Patch file not found");
        }
    }



}

I am getting the following output: FILE: filePath Exists SUCCESSFULLY QUEUED

But nothing inside onObbStateChangeListener is getting called. I am calling this function from a custom view and testing this on Nexus 4/ KitKat.

What could be the reason for this behaviour?

like image 998
chochim Avatar asked Feb 14 '23 12:02

chochim


1 Answers

I know this question is old but this may help someone else.

The StorageManager stores the listener in a weak reference which means that, given your example code (an anonymous instance created in the method call), it is gone almost as soon as you create it and usually well before the mount completes. You must maintain a reference to the listener object in your own code until it is no longer needed.

Something like this should work:

public class MyClass {

    ...
    private OnObbStateChangeListener mListener =
                new OnObbStateChangeListener() {
                    @Override
                    public void onObbStateChange(String path, int state) {
                       // your code here
                    }
                };

    public void mountExpansion() {
        ...
        if (storageManager.mountObb(mainFile.getAbsolutePath(), key, mListener)
        {
            Log.d("STORAGE_MNT","SUCCESSFULLY QUEUED");
        }
        else
        {
            Log.d("STORAGE_MNT","FAILED");
        }
        ...
     }
     ...
}

This particular quirk of obb mounting has existed since at least honeycomb to my knowledge.

like image 193
pcash Avatar answered Mar 04 '23 07:03

pcash