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