sdk - Android AR in Fragment -
i've been trying ar (augmented reality) sdk's working in fragment. however, can't seem working.
i've found code of has got metaio (ar framework) working in fragment.
so i've applied code own project, working code not programmed scan picture. want scan picture mark it.
i copied code scan picture mark sample project of metaio, doesn't work.
right failing @ (debug logs after don't logged):
trackingconfigfile = assetsmanager.getassetpath(getactivity().getapplicationcontext(), "aedapp/assets/trackingdata_picturemarker.xml");
this full code:
package com.example.bt6_aedapp; import android.app.application; import android.content.res.configuration; import android.hardware.camera.camerainfo; import android.os.bundle; import android.support.v4.app.fragment; import android.util.log; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import com.metaio.cloud.plugin.metaiocloudplugin; import com.metaio.sdk.metaiodebug; import com.metaio.sdk.metaiosurfaceview; import com.metaio.sdk.sensorscomponentandroid; import com.metaio.sdk.jni.erender_system; import com.metaio.sdk.jni.escreen_rotation; import com.metaio.sdk.jni.igeometry; import com.metaio.sdk.jni.imetaiosdkandroid; import com.metaio.sdk.jni.imetaiosdkcallback; import com.metaio.sdk.jni.metaiosdk; import com.metaio.sdk.jni.trackingvaluesvector; import com.metaio.sdk.jni.vector3d; import com.metaio.tools.screen; import com.metaio.tools.systeminfo; import com.metaio.tools.io.assetsmanager; public class fragmenta extends fragment implements metaiosurfaceview.callback { private application mappcontext; private viewgroup mrootlayout; string trackingconfigfile; private metaiosdkcallbackhandler mcallback; private igeometry mmodel; private imetaiosdkandroid mmetaiosdk; private metaiosurfaceview msurfaceview; private static boolean mnativelibsloaded = false; private boolean mrendererinitialized; private sensorscomponentandroid msensors; static { mnativelibsloaded = imetaiosdkandroid.loadnativelibs(); } @override public void oncreate(bundle savedinstancestate) { metaiocloudplugin.startjunaio(null, getactivity().getapplicationcontext()); super.oncreate(savedinstancestate); log.d("lifecycle", "oncreate"); mappcontext = getactivity().getapplication(); mmetaiosdk = null; msurfaceview = null; mrendererinitialized = false; try { mcallback = new metaiosdkcallbackhandler(); if (!mnativelibsloaded){ throw new exception("unsupported platform, failed load native libs"); } // create sensors component msensors = new sensorscomponentandroid(mappcontext); // create unifeye mobile passing activity instance , // application signature mmetaiosdk = metaiosdk.createmetaiosdkandroid(getactivity(), getresources().getstring(r.string.metaiosdksignature)); mmetaiosdk.registersensorscomponent(msensors); } catch (throwable e) { metaiodebug.log(log.error, "arcamerafragment.oncreate: failed create or intialize metaio sdk: " + e.getmessage()); return; } } @override public view oncreateview(layoutinflater inflater, viewgroup container, bundle savedinstancestate) { log.d("lifecycle", "oncreateview"); view view = inflater.inflate(r.layout.fragment_a, container, false); mrootlayout = (viewgroup)getactivity().findviewbyid(r.id.pager); return view; } @override public void onstart() { super.onstart(); log.d("lifecycle", "onstart"); if(mmetaiosdk == null){ return; } metaiodebug.log("arcamerafragment.onstart()"); try { msurfaceview = null; // start camera startcamera(); // add unifeye gl surface view msurfaceview = new metaiosurfaceview(mappcontext); msurfaceview.registercallback(this); msurfaceview.setkeepscreenon(true); metaiodebug.log("arcamerafragment.onstart: addcontentview(mmetaiosurfaceview)"); mrootlayout.addview(msurfaceview, new viewgroup.layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content)); msurfaceview.setzordermediaoverlay(true); } catch (exception e) { metaiodebug.log(log.error, "error creating views: " + e.getmessage()); metaiodebug.printstacktrace(log.error, e); } } @override public void onresume() { super.onresume(); log.d("lifecycle", "onresume"); // make sure resume opengl surface if (msurfaceview != null) { msurfaceview.onresume(); } if(mmetaiosdk != null){ mmetaiosdk.resume(); } } @override public void onpause() { super.onpause(); log.d("lifecycle", "onpause"); // pause opengl surface if (msurfaceview != null) { msurfaceview.onpause(); } if (mmetaiosdk != null) { // disable camera mmetaiosdk.pause(); } } @override public void onstop() { super.onstop(); log.d("lifecycle", "onstop"); if (mmetaiosdk != null) { // disable camera mmetaiosdk.stopcamera(); } if (msurfaceview != null) { mrootlayout.removeview(msurfaceview); } system.runfinalization(); system.gc(); } @override public void ondestroy() { super.ondestroy(); mcallback.delete(); mcallback = null; /*log.d("lifecycle", "ondestroy"); try { mrendererinitialized = false; } catch (exception e) { metaiodebug.printstacktrace(log.error, e); } metaiodebug.log("arcamerafragment.ondestroy"); if (mmetaiosdk != null) { mmetaiosdk.delete(); mmetaiosdk = null; } metaiodebug.log("arcamerafragment.ondestroy releasing sensors"); if (msensors != null) { msensors.registercallback(null); msensors.release(); msensors.delete(); msensors = null; } // memory.unbindviews(activity.findviewbyid(android.r.id.content)); system.runfinalization(); system.gc();*/ } @override public void onconfigurationchanged(configuration newconfig) { super.onconfigurationchanged(newconfig); final escreen_rotation rotation = screen.getrotation(getactivity()); mmetaiosdk.setscreenrotation(rotation); metaiodebug.log("onconfigurationchanged: " + rotation); } @override public void ondrawframe() { if(mmetaiosdk != null) { trackingvaluesvector poses = mmetaiosdk.gettrackingvalues(); if(poses.size() != 0) { mmodel.setcoordinatesystemid(poses.get(0).getcoordinatesystemid()); } } // log.d("lifecycle", "ondrawframe"); /* if (mrendererinitialized) { mmetaiosdk.render(); } */ } @override public void onsurfacecreated() { log.d("lifecycle", "onsurfacecreated"); try { if (!mrendererinitialized) { mmetaiosdk.initializerenderer(msurfaceview.getwidth(), msurfaceview.getheight(), screen.getrotation(getactivity()), erender_system.erender_system_opengl_es_2_0); mrendererinitialized = true; } else { metaiodebug.log("arcamerafragment.onsurfacecreated: reloading textures..."); mmetaiosdk.reloadtextures(); } metaiodebug.log("arcamerafragment.onsurfacecreated: registering audio renderer..."); // mmetaiosdk.registeraudiocallback(msurfaceview.getaudiorenderer()); mmetaiosdk.registercallback(mcallback); metaiodebug.log("arviewactivity.onsurfacecreated"); } catch (exception e) { metaiodebug.log(log.error, "arcamerafragment.onsurfacecreated: " + e.getmessage()); } msurfaceview.queueevent(new runnable() { @override public void run() { loadcontents(); } }); } private void loadcontents() { try { trackingconfigfile = assetsmanager.getassetpath(getactivity().getapplicationcontext(), "aedapp/assets/trackingdata_picturemarker.xml"); boolean result = mmetaiosdk.settrackingconfiguration(trackingconfigfile); log.d("result", boolean.tostring(result)); metaiodebug.log("tracking data loaded: " + result); string aedlogo = assetsmanager.getassetpath(getactivity().getapplicationcontext(), "aedapp/assets/metaioman.md2"); log.d("aedlogo", "aaa: " + aedlogo); if(aedlogo != null) { mmodel = mmetaiosdk.creategeometry(aedlogo); if(mmodel != null) { mmodel.setscale(new vector3d(4.0f, 4.0f, 4.0f)); } else { metaiodebug.log(log.error, "error loading geometry: " + aedlogo); } } } catch (exception e) { e.printstacktrace(); } } @override public void onsurfacechanged(int width, int height) { log.d("lifecycle", "onsurfacechanged"); mmetaiosdk.resizerenderer(width, height); } @override public void onsurfacedestroyed() { log.d("lifecycle", "onsurfacedestroyed"); metaiodebug.log("arcamerafragment.onsurfacedestroyed(){"); msurfaceview = null; // mmetaiosdk.registeraudiocallback(null); } protected void startcamera() { final int cameraindex = systeminfo.getcameraindex(camerainfo.camera_facing_back); if (mmetaiosdk != null) { mmetaiosdk.startcamera(cameraindex, 640, 480); } } final class metaiosdkcallbackhandler extends imetaiosdkcallback { @override public void ontrackingevent(final trackingvaluesvector trackingvalues) { super.ontrackingevent(trackingvalues); if(!trackingvalues.isempty() && trackingvalues.get(0).istrackingstate()){ log.d("track", "not empty"); } } } }
i hope can me can not figure out.. :(
edit
the error (e.printstacktrace()) throwing is:
03-24 20:25:19.068: w/system.err(28062): java.lang.nullpointerexception: null string 03-24 20:25:19.068: w/system.err(28062): @ com.metaio.sdk.jni.metaiosdkjni.imetaiosdk_settrackingconfiguration__swig_1(native method) 03-24 20:25:19.068: w/system.err(28062): @ com.metaio.sdk.jni.imetaiosdk.settrackingconfiguration(imetaiosdk.java:106) 03-24 20:25:19.068: w/system.err(28062): @ com.example.bt6_aedapp.fragmenta.loadcontents(fragmenta.java:278) 03-24 20:25:19.068: w/system.err(28062): @ com.example.bt6_aedapp.fragmenta.access$0(fragmenta.java:274) 03-24 20:25:19.068: w/system.err(28062): @ com.example.bt6_aedapp.fragmenta$1.run(fragmenta.java:268) 03-24 20:25:19.068: w/system.err(28062): @ android.opengl.glsurfaceview$glthread.guardedrun(glsurfaceview.java:1463) 03-24 20:25:19.068: w/system.err(28062): @ android.opengl.glsurfaceview$glthread.run(glsurfaceview.java:1240)
what want it:
being able 'scan' picture (https://encrypted-tbn2.gstatic.com/images?q=tbn:and9gcqfqkiurd3qmu0zveiwehtm1twlmtcdlnfulfcwdkxta1_xqjiq) , detect image in app. image referenced in app in assets folder of project, , i've made xml file marker defined stated on metaio website. after detecting i'm going database stuff, need detecting part working.
edit if knows how can make ar framework in fragments love tot know.
i don't know pretty fragments null string think happens because haven't extracted assets.
in video http://youtu.be/kvtci-wwmfu?t=30m29s it's explained. have add code
private class assetsextracter extends asynctask<integer, integer, boolean>{ @override protected boolean doinbackground(integer... params){ try { assetsmanager.extractallassets(getapplicationcontext(), buildconfig.debug); }catch (ioexception e){ metaiodebug.printstacktrace(log.error, e); return false; } return true; } }
to activity (or in case, guess, fragment). have add field of class
private assetsextracter mtask;
and inside oncreate() method put
mtask = new assetsextracter(); mtask.execute(0);
after assets should avaliable assetsmanager.getassetpath(..) , shouldn't return null string anymore.
Comments
Post a Comment