膨胀类com.google.vrtoolkit.cardboard.CardboardView时出错,导致应用程序崩溃

时间:2019-09-24 07:39:04

标签: android android-studio 3d google-cardboard rajawali

它没有构建错误,但是在模拟器上运行时崩溃。

---------崩溃开始 E / AndroidRuntime:致命异常:main     流程:com.example.myrajawali,PID:6166     java.lang.RuntimeException:无法启动活动ComponentInfo {com.example.myrajawali / com.example.myrajawali.MainActivity}:android.view.InflateException:com.example.myrajawali:layout / activity_main中的二进制XML文件第9行: com.example.myrajawali:layout / activity_main中的二进制XML文件第9行:膨胀类com.google.vrtoolkit.cardboard.CardboardView时出错         在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3270)         在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)         在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)         在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)         在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)         在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:2016)         在android.os.Handler.dispatchMessage(Handler.java:107)         在android.os.Looper.loop(Looper.java:214)         在android.app.ActivityThread.main(ActivityThread.java:7356)         在java.lang.reflect.Method.invoke(本机方法)         在com.android.internal.os.RuntimeInit $ MethodAndArgsCaller.run(RuntimeInit.java:492)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)      原因:android.view.InflateException:com.example.myrajawali:layout / activity_main中的二进制XML文件第9行:com.example.myrajawali:layout / activity_main中的二进制XML文件第9行:膨胀类com.google的错误。 vrtoolkit.cardboard.CardboardView      原因:android.view.InflateException:com.example.myrajawali:layout / activity_main中的二进制XML文件第9行:膨胀类com.google.vrtoolkit.cardboard.CardboardView时出错      造成原因:java.lang.reflect.InvocationTargetException         在java.lang.reflect.Constructor.newInstance0(本地方法)         在java.lang.reflect.Constructor.newInstance(Constructor.java:343)         在android.view.LayoutInflater.createView(LayoutInflater.java:854)         在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:1006)         在android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:961)         在android.view.LayoutInflater.rInflate(LayoutInflater.java:1123)         在android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:1084)         在android.view.LayoutInflater.inflate(LayoutInflater.java:682)         在android.view.LayoutInflater.inflate(LayoutInflater.java:534)         在android.view.LayoutInflater.inflate(LayoutInflater.java:481)         在com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:438)         在android.app.Activity.setContentView(Activity.java:3324)         在com.example.myrajawali.MainActivity.onCreate(MainActivity.java:23)         在android.app.Activity.performCreate(Activity.java:7802)         在android.app.Activity.performCreate(Activity.java:7791)         在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1299)         在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3245)         在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3409)         在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myrajawali">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity" android:screenOrientation="landscape">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="com.google.intent.category.CARDBOARD" />
            </intent-filter>
        </activity>
    </application>

</manifest>

mainActivity

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/black"
    tools:context=".MainActivity">

    <com.google.vrtoolkit.cardboard.CardboardView
        android:id="@+id/cardboard_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

MainActivity.java

    package com.example.myrajawali;



import android.media.MediaPlayer;
import android.os.Bundle;
import android.util.Log;


import com.google.vrtoolkit.cardboard.CardboardActivity;
import com.google.vrtoolkit.cardboard.CardboardView;



public class MainActivity extends CardboardActivity {

    private CardboardView cardboardView;
    private MediaPlayer mediaPlayer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cardboardView = findViewById(R.id.cardboard_view);

        // init media player for video
        mediaPlayer = MediaPlayer.create(this, R.raw.sample);
        Log.d("AAAA","aaaaaaaaaaaaaaaaaaaaaaaa");
        mediaPlayer.setLooping(true);

        //create renderee

        CardboardView.StereoRenderer renderer = new Vediorenderer(this, mediaPlayer);
        // associate a renderer with cardboardView
        cardboardView.setRenderer(renderer);

        // associate the cardboardView with this activity
        setCardboardView(cardboardView);

    }

    @Override
    public void onCardboardTrigger() {
        super.onCardboardTrigger();

        // toggle vr mode on touch/trigger
        cardboardView.setVRModeEnabled(!cardboardView.getVRMode());
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (mediaPlayer != null) {
            mediaPlayer.pause();
        }
    }

    @Override
    protected void onResume() {
        super.onResume();
        if (mediaPlayer != null) {
            mediaPlayer.start();
        }
    }



}

VedioRenderer.java

package com.example.myrajawali;

import android.content.Context;
import android.graphics.SurfaceTexture;
import android.media.MediaPlayer;
import android.view.MotionEvent;

import com.google.vrtoolkit.cardboard.CardboardView;
import com.google.vrtoolkit.cardboard.Eye;
import com.google.vrtoolkit.cardboard.FieldOfView;
import com.google.vrtoolkit.cardboard.HeadTransform;
import com.google.vrtoolkit.cardboard.Viewport;

import org.rajawali3d.cameras.Camera;
import org.rajawali3d.materials.Material;
import org.rajawali3d.math.Matrix4;
import org.rajawali3d.math.Quaternion;
import org.rajawali3d.math.vector.Vector3;
import org.rajawali3d.primitives.Sphere;
import org.rajawali3d.renderer.Renderer;

import javax.microedition.khronos.egl.EGLConfig;

import c.org.rajawali3d.textures.StreamingTexture;
 //import rajawali.renderer.RajawaliRenderer;



public class Vediorenderer extends Renderer implements CardboardView.StereoRenderer {
    // video stuff
    private MediaPlayer mediaPlayer;
    private StreamingTexture videoTexture;

    // temporary math variables
    /** position and rotation of eye camera in 3d space as matrix object */
    private Matrix4 eyeMatrix;
    /** rotation of eye camera in 3d space */
    private Quaternion eyeOrientation;
    /** position of eye camera in 3d space */
    private Vector3 eyePosition;


    /**
     * @param context      e.g. an activity
     * @param mediaPlayer  Fully initialized media player instance with loaded video.
     *                     Make sure to call play/pause by yourself.
     */
    public  Vediorenderer(Context context, MediaPlayer mediaPlayer){
        super(context);
        this.mediaPlayer = mediaPlayer;
        // init math stuff
        eyeMatrix = new Matrix4();
        eyeOrientation = new Quaternion();
    }

    /*========================================================
     Override Renderer abstract methods
     =========================================================*/

    @Override
    protected void initScene() {
        // setup world sphere
        Sphere sphere = new Sphere(1, 24, 24);
        sphere.setPosition(0, 0, 0);
        // invert the sphere normals
        // factor "1" is two small and result in rendering glitches
        sphere.setScaleX(100);
        sphere.setScaleY(100);
        sphere.setScaleZ(-100);
        // create texture from media player video
        videoTexture = new StreamingTexture("video", this.mediaPlayer);
        // set material with video texture
        Material material = new Material();
        material.setColorInfluence(0f);
        try {
            material.addTexture(videoTexture);
        } catch (Exception e){
            throw new RuntimeException(e);
        }
        sphere.setMaterial(material);

        // add sphere to scene
        getCurrentScene().addChild(sphere);
    }
    @Override
    public void onRenderSurfaceDestroyed(SurfaceTexture surfaceTexture) {
        super.onRenderSurfaceDestroyed(surfaceTexture);
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    @Override
    public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {

    }

    @Override
    public void onTouchEvent(MotionEvent event) {

    }

    /*========================================================
     Override CarboardView abstract methods
     =========================================================*/



    @Override
    public void onNewFrame(HeadTransform headTransform) {

    }

    @Override
    public void onDrawEye(Eye eye) {
        // Rajawali camera
        Camera currentCamera = getCurrentCamera();

        // cardboard field of view
        FieldOfView fov = eye.getFov();

        // update Rajawali camera from cardboard sdk
        currentCamera.updatePerspective(fov.getLeft(), fov.getRight(), fov.getBottom(), fov.getTop());
        eyeMatrix.setAll(eye.getEyeView());
        // orientation
        eyeOrientation.fromMatrix(eyeMatrix);
        currentCamera.setOrientation(eyeOrientation);
        // position
        eyePosition = eyeMatrix.getTranslation().inverse();
        currentCamera.setPosition(eyePosition);

        // render with Rajawali
        super.onRenderFrame(null);
    }

    @Override
    public void onFinishFrame(Viewport viewport) {

    }

    @Override
    public void onSurfaceChanged(int width, int height) {
        // tell Rajawali that cardboard sdk detected a size change
        super.onRenderSurfaceSizeChanged(null, width, height);
    }


    @Override
    public void onSurfaceCreated(EGLConfig eglConfig) {
        // pass opengl config to Rajawali
        super.onRenderSurfaceCreated(eglConfig, null, -1, -1);
    }

    @Override
    public void onRendererShutdown() {
        // tell Rajawali about shutdown
        super.onRenderSurfaceDestroyed(null);
    }
    @Override
    protected void onRender(long elapsedRealTime, double deltaTime) {
        super.onRender(elapsedRealTime, deltaTime);

        if (videoTexture != null) {
            // update texture from video content
            videoTexture.update();
        }
    }

}

1 个答案:

答案 0 :(得分:0)

android.view.InflateException

当XML布局文件中存在任何问题时,将发生此错误。 错误发生在您的activity_main的第9行上,而您正在使用CardboardView的{​​{1}}。

可能出现XML布局无法正确膨胀以查看的错误。您必须检查库是否已正确添加到com.google.vrtoolkit.cardboard.CardboardView中。

还要执行build.gradleClean Project