SkillAgentSearch skills...

GoogleVR

Google VR

Install / Use

/learn @JackChan1999/GoogleVR
About this skill

Quality Score

0/100

Supported Platforms

Universal

Tags

README

Google VR全景图片与视频功能开发详解

<img src="./art/VrPanorama3.jpg" width="300" /> <img src="./art/VrPanorama4.jpg" width="300" /> <img src="./art/VrPanorama5.jpg" width="300" />

<img src="./art/VrVideo3.jpg" width="300" /> <img src="./art/VrVideo4.jpg" width="300" />

<img src="./art/VrVideo5.jpg" width="300" /> <img src="./art/VrVideo6.jpg" width="300" />

1. VR开发概述

时下关于“谷歌、Android与VR”的各种言论纷飞。VR群里有人在争论Android VR是不是一体机,是不是类似Android Wear、为VR打造的全新平台,是不是改良后的Android N。

随着vr设备的流行开来,各大招聘平台上也发布了不少关于andorid vr开发相关的Android工程师岗位,从这点来说掌握vr在项目中的实际应用要点,有助于大家为自己的开发经验上增加前沿技术的积累。

经过研发市面上的主流vr app 的功能,抽取并整合项目中的vr开发知识点,希望大家掌握后,在企业相关vr app游刃有余。

1.1 下载google vr sdk 并搭建开发环境

  1. 带大家去github上搜索并下载google vr sdk
  2. 介绍sdk的组成部分与应用范围
  3. 搭建一个基本android vr app的开发环境

1.2 CardBorad应用核心功能

  1. 带大家查找本地vr 全景图片资源
  2. 介绍vr全景图与普通图片的不同点
  3. 使用rv列表进行展示
  4. 使用VrPanoramaView控件进行本地全景图片的展示

1.3 UtoVR应用核心功能

  1. 带大家通过网络请求获取vr视频的json数据
  2. 使用 Gson解析得到javaBean数据
  3. 使用VrVideoView控件进行网络全景视图的展示

以上这些功能是现流行的在线vr视频,vr图片相关app的核心功能。例如.vr管家应用,3d播播,discovery VR ,看房 vr等等热门应用。

1.4 知识点

  1. http网络请求技术
  2. Gson解析技术与gsonformat插件
  3. RecyclerView与cardView
  4. Glider流行图片加载框架
  5. VrPanoramaView
  6. VrVideoView

1.5 好玩好用的VR

成本其实很便宜!教你用手机体验VR魅力

  • 17块钱!把手机改造为VR眼镜
  • 好玩好用的VR APP推荐

2. 全景图片显示

<img src="./art/VrPanorama1.jpg" width="300" /> <img src="./art/VrPanorama2.jpg" width="300" />

2.1 搭建vr全景图片的开发环境

VR开发需要gvr-android-sdk,GitHub下载地址

gvr-android-sdk

VR开发Google官方技术文档

VR开发技术文档

2.1.1 导入全景图相关的三个开发库

common,commonwidget,panowidget PS:最新的SDK已经没有这三个文件夹了,使用下一步的依赖库即可

2.1.2 依赖该库

compile 'com.google.vr:sdk-panowidget:1.30.0'
//compile project(':common')
//compile project(':commonwidget')
//compile project(':panowidget')
//google的一套序列化数据结构开发库
//compile 'com.google.protobuf.nano:protobuf-javanano:3.0.0-alpha-7'

2.1.3 准备全景图片测试资源

放在assets目录 例:assets/a.jpg(全景图与普通图片的不同 大,立体)

2.1.4 功能清单配置

android:largeHeap="true" 全景图片比较耗资源

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

2.2 布局全景控件显示加载后的全景图片

<com.google.vr.sdk.widgets.pano.VrPanoramaView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/vr_pv" />
public class MainActivity extends AppCompatActivity {

    private VrPanoramaView vrPanoramaView;
    private ImageTask imageTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //全景图片的浏览功能
        //步骤一。下载github上google开源 vr-sdk
        //1.1.导入到我们的工作空间 common,commonwidget  panowidget
        //1.2.依赖到我们的项目中
        //1.3.依赖sdk中找不到的api
        //1.4.准备一些测试素材 放置在assets目录下面 例:assets/a.jpg
        //1.5.开启内存设置  android:largeHeap="true"尽可能使应用使用最大内存

2.2.1 布局查找控件

//步骤二。布局全景控件显示加载后的全景图片
//2.1.布局查找控件
vrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_pv);

2.2.2 设置初始化参数

//2.2.设置初始化参数
vrPanoramaView.setDisplayMode(VrWidgetView.DisplayMode.FULLSCREEN_STEREO);
//删除不需要连接,信息图标
vrPanoramaView.setInfoButtonEnabled(false);
//隐藏全屏按钮
vrPanoramaView.setFullscreenButtonEnabled(false);

2.2.3 创建异步任务加载图片

Bitmap是图片在内存中的表示对象,全景图也可加载成bitmap

    //2.3.创建异步任务加载图片 Bitmap是图片在内存中的表示对象,全景图也可加载成bitmap
    imageTask = new ImageTask();
    imageTask.execute();

}
private class ImageTask extends AsyncTask<Void, Void, Bitmap> {
    @Override
    protected Bitmap doInBackground(Void... params) {
        //2.4.从资产目录打开一个流
        try {
            InputStream inputStream = getAssets().open("a.jpg");
            //2.5.使用BitmapFactory转换成Bitmap
            Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
            return bitmap;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    //2.6任务执行完后,可获取Bitmap图片
    @Override
    protected void onPostExecute(Bitmap bitmap) {
        super.onPostExecute(bitmap);
        if (bitmap != null) {
            //loadImageFromBitmap加载bitmap到显示控件 参1.bitmap 参2 显示参数的封装
            VrPanoramaView.Options options = new VrPanoramaView.Options();
            //加载立体图片,上部分显示在左眼,下部分显示在右眼
            options.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
            if (listener == null) {
                listener = new VrPanoramaEventListener() {
                    @Override
                    public void onLoadError(String errorMessage) {
                        super.onLoadError(errorMessage);
                        //处理加载失败的情况
                        Toast.makeText(MainActivity.this, "错误消息:" + errorMessage, Toast.LENGTH_SHORT).show();
                    }

                    @Override
                    public void onLoadSuccess() {
                        super.onLoadSuccess();
                        //成功的情况提示下现在要进行全景图片的展示
                        Toast.makeText(MainActivity.this, "进入vr:", Toast.LENGTH_SHORT).show();
                    }
                };
                // 增加加载出错的业务逻辑处理
                vrPanoramaView.setEventListener(listener);
            }
            //2.7.让控件加载bitmap对象
            vrPanoramaView.loadImageFromBitmap(bitmap, options);
            //2.8.如果loadImageFromBitmap加载失败需要提示用户相关信息则需要添加事件监听器listener
        }
    }
}
private VrPanoramaEventListener listener;

2.3 VrPanoramaView控件退到后台,回到屏幕,销毁处理细节

    //步骤三。VrPanoramaView控件退到后台,回到屏幕,销毁处理细节
    //3.1.退到后台.暂停显示
    @Override
    protected void onPause() {
        super.onPause();
        if (vrPanoramaView != null) {
            vrPanoramaView.pauseRendering();
        }
    }
    //3.2.回到屏幕,恢复显示
    @Override
    protected void onResume() {
        super.onResume();
        if (vrPanoramaView != null) {
            vrPanoramaView.resumeRendering();
        }
    }
    //3.3.退出界面停止显示
    @Override
    protected void onDestroy() {
        if (vrPanoramaView != null) {
            vrPanoramaView.shutdown();
        }
        if (imageTask != null && !imageTask.isCancelled()) {//销毁任务
            imageTask.cancel(true);
            imageTask = null;
        }
        super.onDestroy();
    }
}
package com.itheima.demovrimagevideo2;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

import com.google.vr.sdk.widgets.common.VrWidgetView;
import com.google.vr.sdk.widgets.pano.VrPanoramaEventListener;
import com.google.vr.sdk.widgets.pano.VrPanoramaView;

import java.io.IOException;
import java.io.InputStream;

public class MainActivity extends AppCompatActivity {

    private VrPanoramaView vrPanoramaView;
    private ImageTask imageTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //全景图片的浏览功能
        //步骤一。下载github上google开源 vr-sdk
        //1.1.导入到我们的工作空间 common,commonwidget  panowidget
        //1.2.依赖到我们的项目中
        //1.3.依赖sdk中找不到的api
        //1.4.准备一些测试素材 放置在assets目录下面 例:assets/a.jpg
        //1.5.开启内存设置  android:largeHeap="true"尽可能使应用使用最大内存
        //步骤二。将全景图片加载到内存中,再显示在控件
        //2.1.布局全景图片显示控件
        vrPanoramaView = (VrPanoramaView) findViewById(R.id.vr_pano);
        //删除不需要连接
        vrPanoramaView.setInfoButtonEnabled(false);
        //隐藏全屏按钮
        vrPanoramaView.setFullscreenButtonEnabled(false);
        //2.2.所有的图片在内存表示成Bitmap
        imageTask = new ImageTask();
        imageTask.execute();
        //vrPanoramaView.loadImageFromBitmap(bitmap);
    }

    //2.3.AsyncTask异步加载
    private class ImageTask extends AsyncTask<Void, Void, Bitmap> {
        @Override
        protected Bitmap doInBackground(Void... params) {
            try {
                InputStream inputStream = getAssets().open("a.jpg");
                //2.4.使用BitmapFactory 可以sd ,byte[] inputstream-->Bitmap
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            } catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            if (bitmap != null) {
                //loadImageFromBitmap加载bitmap到显示控件 参1.bitmap 参2 显示参数的封装
                VrPanoramaView.Options option = new VrPanoramaView.Options();
                //立体图片:上半张显示在左眼,下半张显示在右眼
                option.inputType = VrPanoramaView.Options.TYPE_STEREO_OVER_UNDER;
                VrPanoramaEventListener listener=new VrPanoramaEventListener(){
                    @Override
                    public void onLoadSuccess() {
                        super.onLoadSuccess();
                        //成功的情况提示下现在要进行全景图片的展示
                        Toast.makeText(MainActivity.this, "进入vr图片", Toast.LENGTH_SHORT).show();
                    }
                    @Override
                    public void onLoadError(String errorMessage) {
                        super.onLoadError(errorMessage);
                        //处理加载失败的情况
                        Toast.makeText(MainActivity.this, "E:"+errorMessage, Toast.LENGTH_SHORT).show();
                    }
                };
                //2.5.增加加载出错的业务逻辑处理
                vrPanoramaView.setEventListener(listener);
                //2.6.全屏展示
                vrPanoramaView.setDisp
View on GitHub
GitHub Stars79
CategoryDevelopment
Updated6mo ago
Forks27

Languages

Java

Security Score

82/100

Audited on Sep 24, 2025

No findings