Created
November 15, 2018 08:39
-
-
Save luxuia/a21d0b42633c009d04e17039218617cd to your computer and use it in GitHub Desktop.
sometime need read apk file in unity, with out know file path
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public static string ReadFileInAPK(string filepath) { | |
//取得应用的Activity | |
var activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"); | |
//从Activity取得AssetManager实例 | |
var assetManager = activity.Call<AndroidJavaObject>("getAssets"); | |
//打开文件流 | |
var stream = assetManager.Call<AndroidJavaObject>("open", filepath); | |
//获取文件长度 | |
var availableBytes = stream.Call<int>("available"); | |
//取得InputStream.read的MethodID | |
var clsPtr = AndroidJNI.FindClass("java.io.InputStream"); | |
var METHOD_read = AndroidJNIHelper.GetMethodID(clsPtr, "read", "([B)I"); | |
//申请一个Java ByteArray对象句柄 | |
var byteArray = AndroidJNI.NewByteArray(availableBytes); | |
//调用方法 | |
int readCount = AndroidJNI.CallIntMethod(stream.GetRawObject(), METHOD_read, new[] { new jvalue() { l = byteArray } }); | |
//从Java ByteArray中得到C# byte数组 | |
var bytes = AndroidJNI.FromByteArray(byteArray); | |
//删除Java ByteArray对象句柄 | |
AndroidJNI.DeleteLocalRef(byteArray); | |
//关闭文件流 | |
stream.Call("close"); | |
stream.Dispose(); | |
//返回结果 | |
return System.Text.Encoding.Default.GetString(bytes); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment