Pregunta

Tengo una aplicación BlackBerry que necesita para tomar fotografías de la cámara y enviarlos a un servidor. Con el fin de hacer esto invoco la aplicación de la cámara nativa y escucho el sistema de archivos. Una vez que se captura una imagen y se guarda como un nuevo archivo JPEG me notifican, retomar el control de primer plano y seguir con mi negocio. El problema comienza ocurra después de la primera vez que este ciclo se completa porque ahora cuando decido llamar a la aplicación de la cámara de nuevo, ya está abierto, y ahora el usuario está viendo una miniatura de la última imagen que fue tomada y varios botones que le permite manipular /administrarlo. naturalmente, lo que quiero que el usuario vea una vista previa de lo que la cámara está "viendo" antes de que encaje otra foto como lo hizo antes.

He pensado en varias maneras de resolver este incluyendo matar a la aplicación de la cámara cada vez (entiendo que esto no se puede hacer mediante programación?), El envío de CameraArguments al invocar la aplicación (que parece ser inútil), y ahora estaba pensando en una solución podría ser tan simple generación de un " Volver " evento clave antes de volver a mi aplicación que teóricamente descartar la pantalla de edición molesto. Podría esto realmente puede hacer? y si no hay otra solución posible es posible pensar?

¿Fue útil?

Solución

Una especie de truco ...

  • iniciar la cámara Aplicación
  • TimerTask en comprobar si la cámara Aplicación comenzó y si tiene que estar cerrado (algunos bandera)
  • En caso afirmativo, invocarlo (por lo que se convirtió en activo) y empuje ESC inyección de pulsación de tecla para cerrarla

Tome un vistazo a esto:

class Scr extends MainScreen {
    boolean killCameraApp = false;
    final String mCameraModuleName = "net_rim_bb_camera";
    final CameraArguments args = new CameraArguments();

    public Scr() {
        super();

        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                if (isCameraRunning() && killCameraApp) {
                    getApplication().invokeAndWait(callCamera);
                    getApplication().invokeAndWait(killCamera);
                }
            }
        }, 0, 100);
    }

    Runnable callCamera = new Runnable() {
        public void run() {
            callCamera();
        }

    };

    Runnable killCamera = new Runnable() {
        public void run() {
            injectKey(Characters.ESCAPE);
            killCameraApp = false;
        }
    };

    private boolean isCameraRunning() {
        boolean result = false;
        ApplicationManager appMan = 
                ApplicationManager.getApplicationManager();
        ApplicationDescriptor[] appDes = appMan.getVisibleApplications();
        for (int i = 0; i < appDes.length; i++) {
            result = mCameraModuleName.equalsIgnoreCase(appDes[i]
                    .getModuleName());
            if (result)
                break;
        }
        return result;
    }

    private void callCamera() {
        Invoke.invokeApplication(Invoke.APP_TYPE_CAMERA, 
                new CameraArguments());
    }

    private void injectKey(char key) {
        KeyEvent inject = new KeyEvent(KeyEvent.KEY_DOWN, key, 0);
        inject.post();
    }

    protected void makeMenu(Menu menu, int instance) {
        menu.add(new MenuItem("start camera", 0, 0) {
            public void run() {
                callCamera();
                killCameraApp = false;
            }
        });
        menu.add(new MenuItem("kill app", 0, 0) {
            public void run() {
                killCameraApp = true;
            }
        });
        super.makeMenu(menu, instance);
    }
}

EDIT: No se olvide de establecer permisos para la liberación del dispositivo:
Opciones => Opciones avanzadas => Aplicaciones => [Su Aplicación] => Editar permisos predeterminados => Interacciones => pulsar una tecla de inyección

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top