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

Popular posts from this blog

android - Get AccessToken using signpost OAuth without opening a browser (Two legged Oauth) -

org.mockito.exceptions.misusing.InvalidUseOfMatchersException: mockito -

google shop client API returns 400 bad request error while adding an item -