错误膨胀类 com.google.vrtoolkit.cardboard.CardboardView 崩溃应用程序

Posted

技术标签:

【中文标题】错误膨胀类 com.google.vrtoolkit.cardboard.CardboardView 崩溃应用程序【英文标题】:Error inflating class com.google.vrtoolkit.cardboard.CardboardView crashes application 【发布时间】:2020-01-24 06:49:10 【问题描述】:

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

--------- 崩溃开始 E/androidRuntime: 致命异常: main 进程:com.example.myrajawali,PID:6166 java.lang.RuntimeException:无法启动活动 ComponentInfocom.example.myrajawali/com.example.myrajawali.MainActivity:android.view.InflateException:com.example.myrajawali 中的二进制 XML 文件第 9 行:layout/activity_main: 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>

主活动

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

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

</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();
        
    


【问题讨论】:

似乎无法在您的 xml 上找到 com.google.vrtoolkit.cardboard.CardboardView 您是否已将此项目类(库或依赖项)添加到您的项目中? rajawali 库在内部扩展它,如果我尝试添加 cardboard sdk,它会抛出重复的类 【参考方案1】:

android.view.InflateException

当您的 XML 布局文件中存在任何问题时,会发生此错误。 错误发生在您的 activity_main 的第 9 行,您使用的是 CardboardViewcom.google.vrtoolkit.cardboard.CardboardView

XML 布局未正确膨胀以查看的错误的可能性。您必须检查库是否在build.gradle 中正确添加。

另外,Clean ProjectRebuild Project

【讨论】:

以上是关于错误膨胀类 com.google.vrtoolkit.cardboard.CardboardView 崩溃应用程序的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图的“错误膨胀类片段”

无法解决 NavigationView 膨胀类的错误

膨胀类 ImageView 时出错

Android错误膨胀类android.support.constraint.ConstraintLayout

错误:膨胀类 com.google.android.material.textfield.TextInputLayout

Android 活动未在某些设备上启动(错误膨胀类)