java - 我在 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);
}
}
解决方案
这是由于片段无法初始化 ArFragment 而发生的。所以我不能对它执行onTabArPlaneListener。. . 所以我很简单地使用 Activity 而不是我的 ArFragment 片段,它完美地工作:)
推荐阅读
- node.js - 将快递端代码重构为更易使用的格式
- c# - DB First Entity Framework Core 中的 Oracle 将 NUMBER(3) 映射到字节导致运行时异常
- rust - 为什么将 mut 添加到传递的迭代器引用可以解决这个问题?
- python - 包含的 URLconf 'appName.urls' 中似乎没有任何模式
- webpack - webpack watch 结束后运行命令
- node.js - 处理大量出站 HTTP 请求
- azure - 在身份验证期间将“RequireMFA”信息从 Azure SSO 转发到 OnPrem ADFS
- javascript - 简单文本替换 Chrome 扩展的权限?
- javascript - 是否有任何基于 Javascript 的视频游戏开发的物理可下载引擎?
- python - 随机生成器,在挑选后从列表中删除项目