Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我撞上了setOnTapArPlaneListener_Java_Android - Fatal编程技术网

Java 我撞上了setOnTapArPlaneListener

Java 我撞上了setOnTapArPlaneListener,java,android,Java,Android,我试图从服务器上获取3D模型(GLTF)并在m Scenefam中显示,但我在setOnTapArPlaneListener上遇到了崩溃 java.lang.NullPointerException:尝试对空对象引用调用虚拟方法“void com.google.ar.sceneform.ux.ArFragment.setOnTapArPlaneListener(com.google.ar.sceneform.ux.BaseArFragment$OnTapArPlaneListener)” ArF

我试图从服务器上获取3D模型(GLTF)并在m Scenefam中显示,但我在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);
}
公共类ARSceneFormFragment扩展了片段{
私有ArFragment-ArFragment;
私有字符串资产_3D=“”;
字符串imageUri;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.fragment\u a\u R,容器,假);
arFragment=(arFragment)getFragmentManager();
WebServiceFactory.getInstance().getARObject(2).enqueue(新回调()){
@凌驾
公共void onResponse(调用、响应){
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());
}
}
@凌驾
失败时公共无效(调用调用,可丢弃的t){
}
});
返回视图;
}
专用空心模型(锚){
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
ModelRenderable.builder()
.setSource(getContext(),
可渲染源
.builder()
.setSource(getContext()、Uri.parse(imageUri)、RenderableSource.SourceType.GLTF2)
.设置刻度(0.75f)
.setRecenterMode(RenderableSource.RecenterMode.ROOT)
.build()
)
.setRegistryId(资产\u 3D)
.build()
.thenAccept(modelRenderable->addNoteToScene(modelRenderable,锚定))
.例外情况下(可丢弃->{
AlertDialog.Builder=新建AlertDialog.Builder(getContext());
builder.setMessage(throwable.getMessage()).show();
返回null;
});
}
}
私有void addNoteToScene(ModelRenderable ModelRenderable,锚定){
AnchorNode AnchorNode=新的AnchorNode();
anchorNode.setRenderable(modelRenderable);
arFragment.getArSceneView().getScene().addChild(anchorNode);
}

}

发生这种情况是由于片段,无法初始化ArFragment。所以我不能对它执行onTabArPlaneListener。因此,我只需在我的ArFragment中使用Activity而不是fragment,它就可以完美地工作:)

这是由于fragment导致的,无法初始化ArFragment。所以我不能对它执行onTabArPlaneListener。因此,我简单地使用Activity而不是fragment作为我的ArFragment,它工作得非常完美:)

您是如何更改代码的?我也有同样的问题你是在片段中使用ARFragment吗?如果是,只需在创建时初始化您的ARFragment。我的不是一个片段,而是一个活动。这就是问题所在。显示您的日志错误,因为我的错误通过使用活动而不是片段来解决,并初始化arFragment=(arFragment)getSupportFragmentManager();在onCreate中,我不能使用它,因为我的是一个活动而不是片段,所以arFragment/getsupportfragment/findffragmentid/etc不起作用不可逆类型;无法将“android.app.Fragment”强制转换为“com.google.ar.sceneform.ux.ArFragment”//您是如何更改代码的?我也有同样的问题你是在片段中使用ARFragment吗?如果是,只需在创建时初始化您的ARFragment。我的不是一个片段,而是一个活动。这就是问题所在。显示您的日志错误,因为我的错误通过使用活动而不是片段来解决,并初始化arFragment=(arFragment)getSupportFragmentManager();在onCreate中,我不能使用它,因为我的是一个活动而不是片段,所以arFragment/getsupportfragment/findffragmentid/etc不起作用不可逆类型;无法将“android.app.Fragment”强制转换为“com.google.ar.sceneform.ux.ArFragment”//