문제

카메라에서 사진을 찍어 서버로 보내야하는 BlackBerry 응용 프로그램이 있습니다. 이를 위해 기본 카메라 응용 프로그램을 호출하고 파일 시스템을 듣습니다. 이미지가 캡처되어 새로운 JPEG 파일로 저장되고 저장되면 알림을 받고 전경 제어를 재개하고 내 비즈니스를 진행합니다. 카메라 애플리케이션을 다시 호출하기로 결정했을 때 이미 열렸을 때 이미 열렸고 이제 사용자는 마지막 사진의 썸네일과 몇 개의 버튼이 조작 할 수있게 되었기 때문에이주기가 처음 완료된 후 문제가 발생하기 시작합니다. /관리. 당연히 사용자가보고 싶은 것은 이전과 같이 다른 사진을 찍기 전에 카메라가 "보고있는"미리보기입니다.

나는 매번 카메라 앱을 죽이는 것을 포함하여 이것을 해결하는 다양한 방법을 생각했습니다 (프로그램적으로 할 수 없다는 것을 이해합니까?) CameraArguments 앱을 호출 할 때 (쓸모없는 것으로 보임), 이제 솔루션이 단순한 생성을 할 수 있다고 생각했습니다. ""이론적으로 성가신 편집 화면을 무시할 내 앱으로 전환하기 전에 키 이벤트가 실제로 완료 될 수 있습니까? 그렇지 않다면 생각할 수있는 다른 해결책이 없습니까?

도움이 되었습니까?

해결책

일종의 해킹 ...

  • 카메라 앱을 시작하십시오
  • 타이머스크에서 카메라 앱이 시작되었는지 확인하고 닫아야하는지 확인하십시오 (일부 플래그)
  • 그렇다면, 그것을 호출하고 (그래서 활성화 될 것입니다) ESC Keypress 이벤트 주입을 밀어 닫습니다.

이것을 살펴보십시오 :

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);
    }
}

편집하다: 장치 릴리스에 대한 권한을 설정하는 것을 잊지 마십시오.
옵션 => 고급 옵션 => 응용 프로그램 => [응용 프로그램] => 기본 권한 편집 => 상호 작용 => 키 스트로크 주입

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top