Google VR for Android 開發入門

iwitcy 7年前發布 | 21K 次閱讀 安卓開發 Android開發 移動開發

本文介紹了

  1. Google官方的VR demo

  2. 全景圖(PanoramaActivity)

  3. 360 視頻

  4. VR開發demo(源碼:https://github.com/uncleleonfan/VRDemo)

一.VR介紹

目前VR主流產品有:

Google VR

Oculus

HTC Vivi 

Google VR for Android 文檔

支持DayDream和Cardboard

Github:https://github.com/googlevr/gvr-android-sdk

Document:https://developers.google.com/vr/android API Reference:https://developers.google.com/vr/android/reference_overview

二. 官方Sample運行

1. SDK下載

使用git命名下載或者直接在github上下載壓縮包

git clone https://github.com/googlevr/gvr-android-sdk.git  

2. sdk導入

導入gvr-android-sdk到Android Studio, 同步的過程中需要下載很多庫所以會比較耗時,另外可能出現build失敗的情況,這時可以嘗試使用本地的gradle來編譯。gradle版本最好為最新版本。

3.simplepanowidget

simplepanowidget展示了印加文明遺跡馬丘比丘的全景圖(Panorama)

在真機上運行時,會有一個Cardboard選項。 

點擊上圖紅色框中的按鈕即可進入Cardboard模式。

Demo代碼的主要邏輯就是加載一張全景圖放入VrPanoramaView中。

panoOptions = new Options();
panoOptions.inputType = Options.TYPE_STEREO_OVER_UNDER;

//圖像類型為立體圖像
istr = assetManager.open("andes.jpg");

//加載assets目錄下的全景圖
panoWidgetView.loadImageFromBitmap(BitmapFactory.decodeStream(istr), panoOptions);

全景圖片andes是由兩張圖片組成,上面一張是給左眼看,下面一張是給右眼看。

圖片類型

4. simeplevideowidget

simeplevideowidget展示了剛果雨林中大猩猩的360視頻。

Demo的核心代碼是加載assets目錄下的congo.mp4視頻到VrVideoView中

videoWidgetView.loadVideoFromAsset("congo.mp4", options);  

congo.mp4的視頻內容也是分為上下部分,上面給左眼看,下面給右眼看。

5. treasurehunt

treasurehunt展示了一個簡單到離譜的尋寶游戲,當vr世界中矩形變成金黃色時,點擊手機屏幕或者使用Daydream的控制器,即可完成尋寶。游戲還伴有音效。

6. controllerclient

接收DayDream控制器輸入示例

7. videoplayer

使用Asynchronous Reprojection播放視頻示例

三. 全景圖(PanoramaActivity)

1. 配置build.gradle

//修改minSDK為19 
minSdkVersion 19  
//添加依賴  
compile 'com.google.vr:sdk-panowidget:1.20.0'   

2. 配置AndroidManifest.xml

由于全景圖占內存較大,當加載多張全景圖時可能存在內存溢出的情況,所以這里開啟largeHeap。

<application
    android:largeHeap="true">
</application>

3. 加載全景圖

private class LoadPanoramaImageTask extends AsyncTask<Void, Void, Bitmap> {

    @Override
    protected Bitmap doInBackground(Void... params) {
        try {
            //加載assets目錄下的全景圖片
            AssetManager assetManager = getAssets();
            InputStream open = assetManager.open("andes.jpg");
            return BitmapFactory.decodeStream(open);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Bitmap bitmap) {
        VrPanoramaView.Options options = new VrPanoramaView.Options();
        //圖片類型為立體圖像
        options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
        mVrPanoramaView.loadImageFromBitmap(bitmap, options);
    }
}

4. 生命周期管理

@Override
protected void onPause() {
    mVrPanoramaView.pauseRendering();
    super.onPause();
    }

@Override
protected void onResume() {
    super.onResume();
    mVrPanoramaView.resumeRendering();
}

@Override
protected void onDestroy() {
    // Destroy the widget and free memory.
    mVrPanoramaView.shutdown();
    // The background task has a 5 second timeout so it can potentially stay alive for 5 seconds
    // after the activity is destroyed unless it is explicitly cancelled.
    if (mLoadPanoramaImageTask != null) {
        mLoadPanoramaImageTask.cancel(true);
    }
    super.onDestroy();
}

5. 事件監聽

mVrPanoramaView.setEventListener(mVrPanoramaEventListener);

private VrPanoramaEventListener mVrPanoramaEventListener = new VrPanoramaEventListener() {
    /**
     * 點擊回調
     */
    @Override
    public void onClick() {
        super.onClick();
    }

    /**
     * 加載數據成功回調
     */
    @Override
    public void onLoadSuccess() {
        super.onLoadSuccess();
    }

    /**
     * 加載數據失敗回調
     */
    @Override
    public void onLoadError(String errorMessage) {
        super.onLoadError(errorMessage);
    }
};

四. 360 視頻

1. 配置build.gradle

//添加依賴
//minSdkVersion 19
//已經配置則忽略
compile 'com.google.vr:sdk-videowidget:1.20.0'

2. 配置AndroidManifest.xml (已經配置則忽略)

<application
    android:largeHeap="true">
</application>

3. 加載視頻

VrVideoView.Options options = new VrVideoView.Options();

//視頻類型為立體視頻
options.inputType = VrVideoView.Options.TYPE_STEREO_OVER_UNDER;

try {
    mVrVideoView.loadVideoFromAsset("congo.mp4", options);

} catch (IOException e) {
    e.printStackTrace();
}

4. 繩命周期管理

@Override
protected void onPause() {
    super.onPause();
    // Prevent the view from rendering continuously when in the background.
    mVrVideoView.pauseRendering();
    // If the video is playing when onPause() is called, the default behavior will be to pause
    // the video and keep it paused when onResume() is called.
    isPaused = true;
}

@Override
protected void onResume() {
    super.onResume();
    mVrVideoView.resumeRendering();
}

@Override
protected void onDestroy() {
    // Destroy the widget and free memory.
    mVrVideoView.shutdown();
    super.onDestroy();
}

5. 事件監聽

private VrVideoEventListener mVrEventListener = new VrVideoEventListener() {

    @Override
    public void onLoadError(String errorMessage) {
        Toast.makeText(VrVideoActivity.this, "onLoadError", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onLoadSuccess() {
        Toast.makeText(VrVideoActivity.this, "onLoadSuccess", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onNewFrame() {
    }

    @Override
    public void onCompletion() {
        Toast.makeText(VrVideoActivity.this, "onCompletion", Toast.LENGTH_SHORT).show();
        mVrVideoView.seekTo(0);//播放結束后重新開始播放
    }

    @Override
    public void onClick() {
        togglePause();//點擊暫停或者播放
    }};

五. Demo

該Demo簡單展示了全景圖控件VrPanoramaView的使用,及其相關的基本的配置。 

初始化VrPanoramaView

private void initPanoramaView() {
    mVrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_panorama_view);
    //mVrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_MONO);//全屏模式,彈出一個全屏的Dialog
    mVrPanoramaView.setInfoButtonEnabled(false);//隱藏信息按鈕
    mVrPanoramaView.setStereoModeButtonEnabled(false);//隱藏cardboard按鈕
    mVrPanoramaView.setFullscreenButtonEnabled(false);//隱藏全屏按鈕
    mUrl = getIntent().getStringExtra("url");
    OkGo.get(mUrl).cacheKey(mUrl).tag(mUrl).execute(new BitmapCallback() {

        @Override
        public void onSuccess(Bitmap bitmap, Call call, Response response) {
            VrPanoramaView.Options options = new VrPanoramaView.Options();
            //設置圖片類型為單通道圖片
            options.inputType = VrPanoramaView.Options.TYPE_MONO;
            mVrPanoramaView.loadImageFromBitmap(bitmap, options);
        }
    });
}

初始化MediaPlayer

/**
 * 如果有音樂數據則播放音樂
 */
private void initMediaPlayer() {
    String mp3 = getIntent().getStringExtra("mp3");
    if (mp3 != null) {
        mMediaPlayer = new MediaPlayer();
        try {
            mMediaPlayer.setDataSource(this, Uri.parse(mp3));
            mMediaPlayer.setOnPreparedListener(mOnPreparedListener);
            mMediaPlayer.prepareAsync();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

生命周期管理

@Override
protected void onResume() {
    super.onResume();
    mVrPanoramaView.resumeRendering();
}

@Override

protected void onPause() {
    super.onPause();
    mVrPanoramaView.pauseRendering();
    if (mMediaPlayer != null) {
        mMediaPlayer.pause();
    }
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mVrPanoramaView.shutdown();
    OkGo.getInstance().cancelTag(mUrl);//取消請求
    if (mMediaPlayer != null) {
        mMediaPlayer.release();
        mMediaPlayer = null;
    }
}

 

 

 

 

來自:http://mp.weixin.qq.com/s/mjOvJMQ_5Zy-LstduPA9Zg

 

 本文由用戶 iwitcy 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!