Aller au contenu

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

bigbang

différence activity principale et activity secondaire

Recommended Posts

Bonjour chers Androidiens,

j'aurais une petite question peut-être toute bête :

Y a t il une différence entre une Activity principale et une Activity que l'on a appelé par startActivity() ?

En fait, pour faire simple, j'ai fait une Activity affichant en background la camera, et par dessus j'affiche des objets 3D OpenGL ( réalité augmentée). Le problème c'est que ça marche quand je défini cette activity en MAIN, mais pas si elle est appelée par un startActivity(). Ça m'affiche juste la camera mais pas la sur-couche OpenGL...

C'est pour cela que j'en déduit qu'il doit y avoir une différence... mais laquelle ? :/

Voilà, si quelqu'un a une petite idée d'où pourrait venir le problème c'est m'aiderait fortement =)

merci d'avance,

BigBang

Partager ce message


Lien à poster
Partager sur d’autres sites

ben non, regarde un peu dans logcat

fais du debug au niveau de ta "boucle" opengl

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ta réponse.

oui, j'ai checké les logs, et il n'y a aucune différence : ca passe bien dans ma boucle de dessin , mais en activity secondaire rien ne s'affiche :/ c'est comme si ma GLSurface n'existait pas ou n'etait pas au premier plan ...

Là je sèche vraiment ...

Partager ce message


Lien à poster
Partager sur d’autres sites

je pense que oui, vu que j'utilise le même layout je vois pas ce qui peut changer. à moins que l'activity principale ai une influence sur les layout de ses enfants ? :/

Partager ce message


Lien à poster
Partager sur d’autres sites

il n'y a pas d'interactions comme ça entre Activity

si tu veux poster un peu de code ...

Partager ce message


Lien à poster
Partager sur d’autres sites

a vrai dire je saurais pas vraiment par ou commencer, car j'ai beaucoup de classes dont certaines de gestion de camera, de rendering OpenGL ( la plupart viennent de la librairie NyARToolkit )

et pas trop le temps de faire du tri actuellement, mais merci quand même =)

au moins je sais que ça vient pas de l'activity, je vais continuer à chercher,

je posterais si je trouve une solution

Partager ce message


Lien à poster
Partager sur d’autres sites
Bonjour chers Androidiens,

j'aurais une petite question peut-être toute bête :

Y a t il une différence entre une Activity principale et une Activity que l'on a appelé par startActivity() ?

En fait, pour faire simple, j'ai fait une Activity affichant en background la camera, et par dessus j'affiche des objets 3D OpenGL ( réalité augmentée). Le problème c'est que ça marche quand je défini cette activity en MAIN, mais pas si elle est appelée par un startActivity(). Ça m'affiche juste la camera mais pas la sur-couche OpenGL...

C'est pour cela que j'en déduit qu'il doit y avoir une différence... mais laquelle ? :/

Voilà, si quelqu'un a une petite idée d'où pourrait venir le problème c'est m'aiderait fortement =)

merci d'avance,

BigBang

Si je comprends bien ton code actuel, il te manque quelque côté organisationnel des composants. Veux-tu juste nous montrer le code de ton activity, juste les signature.

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut mokbir,

bon du coup, voici le code de mon activity qui plante (j'ai supprimé quelques méthodes)

le code de la méthode "init()" est tiré de l'exemple de la librairie NyARToolkit


public class DamiARGameActivity extends Activity implements View.OnClickListener, SurfaceHolder.Callback  {
   private final int MENU_TOGGLE_FLASH         = 0;
   public static final String TAG                 = "DamiARGameActivity";

   public static final int CROP_MSG             = 1;
   public static final int FIRST_TIME_INIT     = 2;
   public static final int RESTART_PREVIEW     = 3;
   public static final int CLEAR_SCREEN_DELAY     = 4;
   public static final int SHOW_LOADING         = 5;
   public static final int HIDE_LOADING         = 6;
   public static final int KEEP                 = 7;

   private static final int SCREEN_DELAY         = 2 * 60 * 1000;

   private SharedPreferences mPreferences;

   private boolean mTranslucentBackground = true;
   private boolean isYuv420spPreviewFormat = false;

   private CameraIF mCameraDevice;
   private SurfaceHolder mSurfaceHolder = null;
   private GLSurfaceView mGLSurfaceView;
   private ModelRenderer mRenderer;
   private GameManager _gameManager;

   private boolean mFirstTimeInitialized;

   private PreviewCallback mPreviewCallback = new JpegPreviewCallback();

   private ARToolkitDrawer arToolkit     = null;

   private Handler mHandler             = new MainHandler(); 

   private boolean isUseSerface         = false;



   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       Log.d(TAG, "onCreate");
       requestWindowFeature(Window.FEATURE_PROGRESS);

       Window win = getWindow();
       win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
       win.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

       init();
   }


       private void init() {

       Log.d(TAG, ""+this);

       _gameManager = GameManager.getInstance();
       _gameManager.setContext(this);
       _gameManager.loadGame();

       mRenderer = new ModelRenderer(mTranslucentBackground);
       mRenderer.setMainHandler(mHandler);

       // init Camera.
       if(getString(R.string.camera_name).equals("jp.androidgroup.nyartoolkit.hardware.SocketCamera")) {
           mCameraDevice = new SocketCamera(getString(R.string.server_addr),
                   Integer.valueOf(getString(R.string.server_port)));
           setContentView(R.layout.camera);
           mGLSurfaceView = (GLSurfaceView) findViewById(R.id.GL_view);
           // OpenGL Verw
           mGLSurfaceView.setRenderer(mRenderer);
           mGLSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);

       } else if(getString(R.string.camera_name).equals("jp.androidgroup.nyartoolkit.hardware.StaticCamera")) {
           mCameraDevice = new StaticCamera(getAssets());
           setContentView(R.layout.camera);
           mGLSurfaceView = (GLSurfaceView) findViewById(R.id.GL_view);
           // OpenGL Verw
           mGLSurfaceView.setRenderer(mRenderer);
           mGLSurfaceView.getHolder().setFormat(PixelFormat.RGBA_8888);

       } else if(getString(R.string.camera_name).equals("jp.androidgroup.nyartoolkit.hardware.HT03ACamera")) {
           isUseSerface = true;
           isYuv420spPreviewFormat = true;

           if (mTranslucentBackground) {
               mGLSurfaceView = new GLSurfaceView(this);
               mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
               mGLSurfaceView.setRenderer(mRenderer);
               mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

               SurfaceView mSurfaceView = new SurfaceView(this);
               mCameraDevice = new HT03ACamera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               setContentView(mGLSurfaceView);
               addContentView(mSurfaceView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
           } else {
               setContentView(R.layout.ht03acamera);
               SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.HT03A_camera_preview);
               mCameraDevice = new HT03ACamera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               mGLSurfaceView = (GLSurfaceView) findViewById(R.id.HT03A_GL_view);
               mGLSurfaceView.setRenderer(mRenderer);
           }
       } else if(getString(R.string.camera_name).equals("jp.androidgroup.nyartoolkit.hardware.UVCCamera")) {
           isUseSerface = true;

           if (mTranslucentBackground) {
               mGLSurfaceView = new GLSurfaceView(this);
               mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
               mGLSurfaceView.setRenderer(mRenderer);
               mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

               SurfaceView mSurfaceView = new SurfaceView(this);
               mCameraDevice = new UVCCamera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               setContentView(mGLSurfaceView);
               addContentView(mSurfaceView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
           } else {
               setContentView(R.layout.uvccamera);
               SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.UVC_camera_preview);
               mCameraDevice = new UVCCamera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               mGLSurfaceView = (GLSurfaceView) findViewById(R.id.UVC_GL_view);
               mGLSurfaceView.setRenderer(mRenderer);
           }
       } else if (getString(R.string.camera_name).equals("jp.androidgroup.nyartoolkit.hardware.N1Camera")) {
           isUseSerface = true;
           isYuv420spPreviewFormat = true;

           if (mTranslucentBackground) {
               mGLSurfaceView = new GLSurfaceView(this);
               mGLSurfaceView.setEGLConfigChooser(8, 8, 8, 8, 16, 0); 
               mGLSurfaceView.setRenderer(mRenderer);
               mGLSurfaceView.getHolder().setFormat(PixelFormat.TRANSLUCENT);

               SurfaceView mSurfaceView = new SurfaceView(this);
               mCameraDevice = new N1Camera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               setContentView(mGLSurfaceView);
               addContentView(mSurfaceView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
           } else {
               setContentView(R.layout.n1camera);
               SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.N1_camera_preview);
               mCameraDevice = new N1Camera(this, mSurfaceView);
               mPreferences = PreferenceManager.getDefaultSharedPreferences(this);

               mGLSurfaceView = (GLSurfaceView) findViewById(R.id.N1_GL_view);
               mGLSurfaceView.setRenderer(mRenderer);
           }
       }

       mCameraDevice.setPreviewCallback(mPreviewCallback);

       // init ARToolkit.
       InputStream camePara = getResources().openRawResource(R.raw.camera_para);
       ArrayList patt = new ArrayList();
       patt.add(getResources().openRawResource(R.raw.pattperso));
       patt.add(getResources().openRawResource(R.raw.pattperso2));
       patt.add(getResources().openRawResource(R.raw.pattperso3));
       patt.add(getResources().openRawResource(R.raw.pattperso4));
       arToolkit = new ARToolkitDrawer(camePara, patt, mRenderer, mTranslucentBackground, isYuv420spPreviewFormat);
   }

   @Override
   public void onStart() {
       Log.d(TAG, "onStart()");
       super.onStart();
       mCameraDevice.onStart();
   }

   @Override
   public void onResume() {
       Log.d(TAG, "onResume()");
       super.onResume();
       mGLSurfaceView.onResume();
       mCameraDevice.onResume();

       if (mSurfaceHolder != null) {
           // If first time initialization is not finished, put it in the
           // message queue.
           if (!mFirstTimeInitialized) {
               mHandler.sendEmptyMessage(FIRST_TIME_INIT);
           } else {
               initializeSecondTime();
           }
       }

       mHandler.sendEmptyMessageDelayed(CLEAR_SCREEN_DELAY, SCREEN_DELAY);
   }

   @Override
   public void onStop() {
       Log.d(TAG, "onStop()");
       mCameraDevice.onStop();
       super.onStop();
   }

   @Override
   protected void onPause() {
       Log.d(TAG, "onPause()");
       mCameraDevice.onPause();
       mGLSurfaceView.onPause();
       super.onPause();
   }

   @Override  
   protected void onDestroy() {
       Log.d(TAG, "onDestroy()");
       mCameraDevice.onDestroy();
       GameManager.getInstance().onDestroy();
       finish();
       super.onDestroy();
   }

   @Override
   public void onClick(View v) {
       // TODO Auto-generated method stub

   }


   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent data) {
       switch (requestCode) {
           case CROP_MSG: {
               Intent intent = new Intent();
               if (data != null) {
                   Bundle extras = data.getExtras();
                   if (extras != null) {
                       intent.putExtras(extras);
                   }
               }
               setResult(resultCode, intent);
               finish();
               break;
           }
       }
   }

   @Override
   public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
       //Log.d(TAG, "surfaceChanged");
       // Make sure we have a surface in the holder before proceeding.
       if (holder.getSurface() == null) {
           Log.d(TAG, "holder.getSurface() == null");
           return;
       }

       // We need to save the holder for later use, even when the mCameraDevice
       // is null. This could happen if onResume() is invoked after this
       // function.
       mSurfaceHolder = holder;

       if(!isUseSerface) {
           return;
       }

       if(mCameraDevice instanceof HT03ACamera) {
           HT03ACamera cam = (HT03ACamera)mCameraDevice;
           cam.surfaceChanged(holder, format, w, h);
       }
       else if(mCameraDevice instanceof UVCCamera) {
           UVCCamera cam = (UVCCamera)mCameraDevice;
           cam.surfaceChanged(holder, format, w, h);
       }
       else if (mCameraDevice instanceof N1Camera) {
           N1Camera cam = (N1Camera)mCameraDevice;
           cam.surfaceChanged(holder, format, w, h);
       }
       //Camera.Parameters p = mCameraDevice.getParameters();

       // If first time initialization is not finished, send a message to do
       // it later. We want to finish surfaceChanged as soon as possible to let
       // user see preview first.
       if (!mFirstTimeInitialized) {
           mHandler.sendEmptyMessage(FIRST_TIME_INIT);
       } else {
           initializeSecondTime();
       }
   }

   @Override
   public void surfaceCreated(SurfaceHolder holder) {
       if(!isUseSerface) {
           return;
       }
       if(mCameraDevice instanceof HT03ACamera) {
           HT03ACamera cam = (HT03ACamera)mCameraDevice;
           cam.surfaceCreated(holder);
       }
       else if(mCameraDevice instanceof UVCCamera) {
           UVCCamera cam = (UVCCamera)mCameraDevice;
           cam.surfaceCreated(holder);
       }
       else if (mCameraDevice instanceof N1Camera) {
           N1Camera cam = (N1Camera)mCameraDevice;
           cam.surfaceCreated(holder);
       }

   }

   @Override
   public void surfaceDestroyed(SurfaceHolder holder) {
       if(!isUseSerface) {
           return;
       }
       if(mCameraDevice instanceof HT03ACamera) {
           HT03ACamera cam = (HT03ACamera)mCameraDevice;
           cam.surfaceDestroyed(holder);
       }
       else if(mCameraDevice instanceof UVCCamera) {
           UVCCamera cam = (UVCCamera)mCameraDevice;
           cam.surfaceDestroyed(holder);
       }
       else if (mCameraDevice instanceof N1Camera) {
           N1Camera cam = (N1Camera)mCameraDevice;
           cam.surfaceDestroyed(holder);
       }

       mSurfaceHolder = null;
   }


// ---------------------------- Callback classes ---------------------------------    


   private final class JpegPreviewCallback implements PreviewCallback {

       @Override
       public void onPreviewFrame(byte [] jpegData, Camera camera) {
           //Log.d(TAG, "JpegPictureCallback.onPreviewFrame");

           if(jpegData != null) {
               //Log.d(TAG, "data exist");
               arToolkit.draw(jpegData);
           } else {
               try {
                   // The measure against over load. 
                   Thread.sleep(500);
               } catch (InterruptedException e) {
                   ;
               }
           }
       }

   };    


// ---------------------------- Handler classes ---------------------------------    

   /** This Handler is used to post message back onto the main thread of the application */
   private class MainHandler extends Handler {
       @Override
       public void handleMessage(Message msg) {
           mCameraDevice.handleMessage(msg);
           switch (msg.what) {
               case KEEP: {
                   if (msg.obj != null) {
                       mHandler.post((Runnable)msg.obj);
                   }
                   break;
               }

               case CLEAR_SCREEN_DELAY: {
                   getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
                   break;
               }

               case FIRST_TIME_INIT: {
                   initializeFirstTime();
                   break;
               }

               case SHOW_LOADING: {
                   showDialog(DIALOG_LOADING);
                   break;
               }
               case HIDE_LOADING: {
                   try {
                       dismissDialog(DIALOG_LOADING);
                       removeDialog(DIALOG_LOADING);
                   } catch (IllegalArgumentException e) {
                   }
                   break;
               }
           }
       }
   }

   public Handler getMessageHandler() {
       return this.mHandler;
   }

   private static final int DIALOG_LOADING             = 0;

   @Override
   protected Dialog onCreateDialog(int id) {
       switch (id) {
       case DIALOG_LOADING: {
           ProgressDialog dialog = new ProgressDialog(this);
           dialog.setMessage("Loading ...");
           // dialog.setIndeterminate(true);
           dialog.setCancelable(false);
           dialog.getWindow().setFlags
               (WindowManager.LayoutParams.FLAG_BLUR_BEHIND,
                WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
           return dialog;
       }
       default:
           return super.onCreateDialog(id);
       }
   }

}


Partager ce message


Lien à poster
Partager sur d’autres sites

bon et bien en fait c'est bien un problème de Layout

en mettant l'image de ma camera sur seulement la moitié de l'ecran je vois mon OpenGL derriere...

questions maintenant :

pourquoi passe-t-il derrière en Activity secondaire et pas en activity principale ?

comment forcer mon GLSurfaceView a être au premier plan ?

merci d'avance

edit:

c'est bon pour le mettre au premier plan, il faut tout simplement l'appeler après -___-'

Partager ce message


Lien à poster
Partager sur d’autres sites





×
×
  • Créer...