首页 > 解决方案 > 我在 setOnTapArPlaneListener 上崩溃了

问题描述

我正在尝试从服务器获取 3D 模型(GLTF)并在 m scenefoam 中显示,但我在 setOnTapArPlaneListener 上崩溃了

java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法 'void com.google.ar.sceneform.ux.ArFragment.setOnTapArPlaneListener(com.google.ar.sceneform.ux.BaseArFragment$OnTapArPlaneListener)'

ArFragment.xml

///<LinearLayout 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"
tools:context=".Fragments.ARSceneFormFragment">

 <fragment
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/arFragment"
    android:name="com.google.ar.sceneform.ux.ArFragment"/>

</LinearLayout>

ArFragment.java

public class ARSceneFormFragment extends Fragment {

private ArFragment arFragment;
private String Asset_3D = "";
String imageUri;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view =  inflater.inflate(R.layout.fragment_a_r, container, false);


    arFragment= (ArFragment) getFragmentManager().findFragmentById(R.id.arFragment);
    WebServiceFactory.getInstance().getARObject(2).enqueue(new Callback<ARObject>() {
        @Override
        public void onResponse(Call<ARObject> call, Response<ARObject> response) {
            if (response.body().getFlag() ==1){
                Asset_3D = response.body().getFILES().getFilePath();
                imageUri = "http://aamirabid.solad.pk/api"+Asset_3D;
                Log.e("3dObject",imageUri );
                Toast.makeText(getContext(), ""+imageUri, Toast.LENGTH_SHORT).show();
                arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) ->
                        placeModel(hitResult.createAnchor()));

            }
        }

        @Override
        public void onFailure(Call<ARObject> call, Throwable t) {

        }
    });


    return view;
}

private void placeModel(Anchor anchor) {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        ModelRenderable.builder()
                .setSource(getContext(),
                        RenderableSource
                                .builder()
                                .setSource(getContext(), Uri.parse(imageUri),RenderableSource.SourceType.GLTF2)
                        .setScale(0.75f)
                        .setRecenterMode(RenderableSource.RecenterMode.ROOT)
                        .build()
                )
                .setRegistryId(Asset_3D)
                .build()
                .thenAccept(modelRenderable -> addNoteToScene(modelRenderable,anchor))
                .exceptionally(throwable -> {
                    AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                    builder.setMessage(throwable.getMessage()).show();
                    return null;

                });
    }
}

private void addNoteToScene(ModelRenderable modelRenderable, Anchor anchor) {
    AnchorNode anchorNode = new AnchorNode();
    anchorNode.setRenderable(modelRenderable);

    arFragment.getArSceneView().getScene().addChild(anchorNode);
}

}

标签: javaandroid

解决方案


这是由于片段无法初始化 ArFragment 而发生的。所以我不能对它执行onTabArPlaneListener。. . 所以我很简单地使用 Activity 而不是我的 ArFragment 片段,它完美地工作:)


推荐阅读