如何解决Android通过“相机”按钮启动Sceneform活动
我正在使用Sceneform创建一个应用程序,当我按下相机按钮时,我希望用户被导航到另一个活动中包含的ArFragment。如果PoiPaintingARCamera活动本身是在新活动中实现的,则它可以完美地工作。 Sample Photo of the Activity
这是我在PoiPainting活动中使用的代码
btnCamera.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(PoiPainting.this,PoiPaintingArCamera.class);
startActivity(intent);
}
PoiPaintingARActivity的代码
public class PoiPaintingArCamera extends AppCompatActivity {
private ExternalTexture texture;
private MediaPlayer mediaPlayer;
private ArFragment arFragment;
private Scene scene;
private ModelRenderable renderable;
private boolean isImageDetected = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poi_painting_ar_camera);
texture = new ExternalTexture();
mediaPlayer = MediaPlayer.create(this,R.raw.video);
mediaPlayer.setSurface(texture.getSurface());
mediaPlayer.setLooping(true);
ModelRenderable
.builder()
.setSource(this,Uri.parse("video_screen.sfb"))
.build()
.thenAccept(modelRenderable -> {
modelRenderable.getMaterial().setExternalTexture("videoTexture",texture);
modelRenderable.getMaterial().setFloat4("keyColor",new Color(0.01843f,1f,0.098f));
renderable = modelRenderable;
});
arFragment = (com.stratos.syrostownhall.CustomArFragment)
getSupportFragmentManager().findFragmentById(R.id.arFragment);
if (arFragment != null) {
scene = arFragment.getArSceneView().getScene();
}
scene.addOnUpdateListener(this::onUpdate);
}
private void onUpdate(FrameTime frameTime) {
if (isImageDetected)
return;
Frame frame = arFragment.getArSceneView().getArFrame();
Collection<AugmentedImage> augmentedImages =
frame != null ? frame.getUpdatedTrackables(AugmentedImage.class) : null;
for (AugmentedImage painting : Objects.requireNonNull(augmentedImages)) {
if (painting.getTrackingState() == TrackingState.TRACKING) {
if (painting.getName().equals("painting")) {
isImageDetected = true;
playVideo(painting.createAnchor(painting.getCenterPose()),painting.getExtentX(),painting.getExtentZ());
break;
}
}
}
}
private void playVideo(Anchor anchor,float extentX,float extentZ) {
mediaPlayer.start();
AnchorNode anchorNode = new AnchorNode(anchor);
texture.getSurfaceTexture().setOnFrameAvailableListener(surfaceTexture -> {
anchorNode.setRenderable(renderable);
texture.getSurfaceTexture().setOnFrameAvailableListener(null);
});
anchorNode.setWorldScale(new Vector3(extentX,extentZ));
scene.addChild(anchorNode);
}
当我按下相机按钮时,应用程序崩溃,提示以下消息。
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.stratos.syrostownhall,PID: 30431
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.stratos.syrostownhall/com.stratos.syrostownhall.PoiPaintingArCamera}: java.lang.ClassCastException: com.google.ar.sceneform.ux.ArFragment cannot be cast to com.stratos.syrostownhall.CustomArFragment
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3271)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3410)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:83)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
at android.os.Handler.dispatchMessage(Handler.java:107)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7397)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
Caused by: java.lang.ClassCastException: com.google.ar.sceneform.ux.ArFragment cannot be cast to com.stratos.syrostownhall.CustomArFragment
at com.stratos.syrostownhall.PoiPaintingArCamera.onCreate(PoiPaintingArCamera.java:59)
有什么办法可以使我工作?
解决方法
问题在于场景表单CustomArFragment类的anroid:name
。将名称更改为android目录可解决此问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。