最近下了个google的vr sdk,下载地址:https://github.com/googlevr/gvr-android-sdk,因为没有开源,所以只能拿java反编译去看,幸好大部分代码都能看到(除了native的),一边看官方文档一边看代码,下面记录下之间遇到的一些问题:
1、编出来老是xml错误:首先看libraries/native/README.md,按照其中步骤操作。我用的是video那个例子,打开对应sample目录下的build.gradle,编辑如下
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 19
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
/** See the documentation in libraries/native/README.md regarding architectures.**/
sourceSets {
main {
jniLibs.srcDir file('jniLibs/')
}
}
/** Use this to remove the default native library.**/
packagingOptions {
exclude('lib/armeabi-v7a/libpanorenderer.so')
}
}
dependencies {
compile project(':libraries-common')
compile project(':libraries-commonwidget')
compile project(':libraries-videowidget')
}
之后就能编出包了
2、因为自带的sdk在设置vr参数的时候会跳到googleplay商店,让你下个app,然后通过那个app扫码才能设置各种参数,实在是太麻烦了。后来搜了下网上,发现了这么个文章
https://medium.com/google-developer-experts/using-google-cardboard-with-unsupported-vr-viewers-95c17e65bc1#.fwdejin2z
这文章大概意思就是用https://wwgc.firebaseapp.com/ 的设置来配置google carboard的参数,方法很麻烦,但原理就是通过网站模拟carboard,然后在生成参数,最后写到手机的文件中,最后在手机里起sample的时候sameple本身会读那个文件,然后参数就有效果了。
后来研究了下代码,发现最核心的读写参数函数就是com.google.vr.cardboard.ConfigUtils.readDeviceParamsFromExternalStorage 以及writeDeviceParamsToExternalStorage,在初始化view的时候会掉read函数,最开始的想法是重载相关的函数,把这个read函数换掉或者重新设置参数,后来发现sdk封的比较死,没法继承,重写一遍又比较麻烦,所以想了个比较蠢的办法:在程序启动时先用自己伪造的数据写入到文件中, 这样sdk在读的时候就能读到新数据了,代码如下
private void recreateViewParams() { String urlString = "http://google.com/cardboard/cfg?p=CgNsY2gSA2xjaB0xCCw9JY_CdT0qEAAASEIAAEhCAABIQgAASEJYADUpXA89OggAAAAAAAAAAFAAYAA"; Uri tUri = Uri.parse(urlString); com.google.vrtoolkit.cardboard.proto.nano.CardboardDevice.DeviceParams tParams = ConfigUtils.readDeviceParamsFromUri(tUri); tParams.setInterLensDistance(0.050f); ConfigUtils.writeDeviceParamsToExternalStorage(tParams); }那一大长串网址是通过https://wwgc.firebaseapp.com/ 这个网站的参数生成出来的,如果不用也可以,直接自己填param就行,在view初始化前调用这函数,就把参数写到sdcard里了,这样初始化后view就可以读到伪造的数据
3、手机能直接播放的视频这个sdk就能播,不能直接播放的就会报错,估计是用的手机自带的解码器