2012-09-18 47 views
6

Sé que esta pregunta se me hizo muchas veces, pero no creo que haya una solución para esto. Estoy desarrollando una aplicación que debe estar dirigida a todos los dispositivos con sistema android y cámara trasera. El problema es que puedo probar la aplicación solo en dos dispositivos y tengo que asegurarme de que funciona en todos los dispositivos. Creo que la única solución razonable sería encontrar un código de muestras para la cámara api que esté garantizado para funcionar en casi todos los dispositivos. ¿Alguien puede proporcionar esas fuentes ... pero las fuentes ... que realmente se prueban en dispositivos maaaaany (ALL)? He perdido todos los pelos de la cabeza ... y ... y estoy perdiendo la cabeza, creo ... Es todo porque he lanzado una aplicación (solo para las pruebas en mi compañía) que solo se probó en dos dispositivos, y que utiliza api de cámara de una manera que debería funcionar, pero parece que hay algunos teléfonos como HTC desire HD o HTC Evo 3d (con cámara 3d) donde la aplicación simplemente falla (debido a la cámara fu..ing) o se congela (también debido a la cámara fu..ing). Si hay alguien que tiene fuentes para api de cámara (tomando una imagen sin interacción gráfica de usuario, periódicamente) que realmente se prueban, sea tan amable y si puede, publique la fuente o redirigirme al lugar correcto.Hacer la aplicación de la cámara Android usando la API de la cámara que funcionará en todos los dispositivos

Hmm quizás La pregunta debería sonar así: "¿Es técnicamente posible utilizar la API de cámara en todos los dispositivos?"

Quizás describa cómo estoy usando api.

1) Inicializar leva:

public void initCam() 
{  
    LoggingFacility.debug("Attempting to initialize camera",this); 
    LoggingFacility.debug("Preview is enabled:"+isPreview,this); 
    try { 
     if (camera==null) 
     {    
      camera = Camera.open(); 
      camera.setPreviewDisplay(mHolder); 

      if (camera!=null) 
      { 
       Camera.Parameters parameters = camera.getParameters();    
       List<Size> sizes = parameters.getSupportedPictureSizes(); 
       if (sizes!=null) 
       { 
        Size min = sizes.get(0); 
        for (Size size : sizes)   
         if (size.width<min.width) min = size; 
         { 
          parameters.setPictureSize(min.width, min.height); 
         } 
       }   

       camera.setParameters(parameters);  
       setDisplayOrientation(90); 
      } 
     }    
     startPreview(aps); 
    } catch (Throwable e){ 
     if (exceptionsCallback!=null) 
      exceptionsCallback.onException(e);   
    } 
} 

2) Iniciar previsualización:

private void startPreview(AfterPreviewStarted after) 
{ 
    try { 
     if (!isPreview) 
     { 
      LoggingFacility.debug("Starting preview",this); 
      //camera.stopPreview();    
      camera.startPreview(); 
      isPreview = true; 
      LoggingFacility.debug("Preview is enabled:"+isPreview,this);     
     } 
     if (after!=null) after.doAfter(); 
    }catch(Throwable e) 
    { 
     if (exceptionsCallback!=null) 
      exceptionsCallback.onException(e); 
    } 
} 

3) Tomar foto:

public void takePicture(final PictureCallback callback) 
{ 
    LoggingFacility.debug("Attempting to take a picture",this); 
    if (camera!=null) 
    {  
     if (isPreview) 
     { 
      try 
      { 
       LoggingFacility.debug("preview is enabled jut before taking picture",this); 
       //AudioManager mgr = (AudioManager)ctx.getSystemService(Context.AUDIO_SERVICE); 
       //mgr.setStreamMute(AudioManager.STREAM_SYSTEM, true);  
       LoggingFacility.debug("Taking picture... preview will be stopped...",this); 
    isPreview = false;     
    camera.takePicture(null, new PictureCallback(){ 
     public void onPictureTaken(byte[] arg0, Camera arg1) 
     { 
      //LoggingFacility.debug("Picture has been taken - 1t callback",CameraPreview.this); 
     }    
    }, callback); 

       //mgr.setStreamMute(AudioManager.STREAM_SYSTEM, false);   
      } catch (Throwable e){ 
       if (exceptionsCallback!=null) 
        exceptionsCallback.onException(e);   
      } 
     } 
    } 

4) de la cámara de lanzamiento después del hecho, o después de superficie está dispuesto.

public void releaseCam() 
{ 
    LoggingFacility.debug("Attempting to release camera",this); 
    if (camera!=null) 
    { 
     isTakingPictures = false; 
     camera.stopPreview(); 
     isPreview = false; 
     camera.release(); 
     camera = null;   
     LoggingFacility.debug("A camera connection has been released...",this); 
    } 
} 

En tercera fragmento de código en el método de devolución de llamada Im invocando startPreview de nuevo ya que después de tomar la fotografía de una vista previa está desactivada, y algunos teléfonos inteligentes requieren de vista previa para iniciarse para hacer una foto. Todos los métodos anteriores son parte de la clase que se extiende SurfaceView e implementa SurfaceHolder.Callback y es una parte de la actividad.

SurfaceHolder.Callback se implementa de la siguiente manera:

public void surfaceCreated(SurfaceHolder holder) { 
    initCam(); 

} 

public void surfaceDestroyed(SurfaceHolder holder) {   
    releaseCam(); 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 

} 

Constructor de la clase

CameraPreview(Context context) { 
    super(context); 
    this.ctx = context;  
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

Yo también estaba pensando en otro enfoque - para superar la toma de fotografías, y en vez de esto para registrar onPreviewFrame devolución de llamada y por ejemplo, en esta devolución de llamada, marque la bandera si se ha solicitado una imagen, en caso afirmativo, conviértala a un mapa de bits y úsela en un procesamiento posterior. Estaba probando este enfoque, pero luego me quedé con otro problema, incluso si registro la devolución de llamada vacía, una interfaz gráfica de usuario responde mucho más lento.

Para cualquier persona que me gusta tiene problemas para usar la api de la cámara Android, consulte this link. Parece que el código de esta muestra funciona en la mayoría de los teléfonos inteligentes.

+0

¿Alguna vez resolvió esto? – rupinderjeet

Respuesta

0
final int PICTURE_TAKEN = 1; 

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(filename))); 
startActivityForResult(intent, PICTURE_TAKEN); 

Esto funciona para mí, no he tenido quejas sofar.

+1

Pero, ¿cómo funciona? Tengo que hacer clic en "tomar foto" en la actividad de la cámara, y esto es lo que quiero omitir. Quiero tomar la foto sin interacción del usuario, de manera automática e incluso periódicamente en algunos intervalos de tiempo. No creo que invocar la actividad de la cámara a través de intentos satisfaga mis necesidades. – voytech

+0

@voytech Tiene razón, para sus necesidades, la forma sugerida no será suficiente. – Ridcully

+0

Disculpe, no leí su publicación lo suficiente. – ePeace

Cuestiones relacionadas