質問

カメラから写真を撮ってサーバーに送信する必要がある BlackBerry アプリケーションがあります。これを行うために、ネイティブのカメラ アプリケーションを呼び出し、ファイルシステムをリッスンします。画像がキャプチャされ、新しい JPEG ファイルとして保存されると、通知が届き、フォアグラウンド制御が再開され、通常の作業が開始されます。この問題は、このサイクルが初めて完了した後に発生し始めます。これは、カメラ アプリケーションを再度呼び出すことにしたとき、カメラ アプリケーションがすでに開かれており、ユーザーには最後に撮影された写真のサムネイルと、操作を許可するいくつかのボタンが表示されるためです。 /管理してください。当然のことながら、ユーザーに見てもらいたいのは、以前と同じように別の写真を撮る前に、カメラが「見ている」もののプレビューです。

これを解決するために、毎回カメラアプリを強制終了する(これはプログラム的に実行できないことは理解していますか?)、送信するなど、さまざまな方法を考えてきました。 CameraArguments アプリを呼び出すとき(役に立たないように見えます)、今私は解決策が「」を生成するのと同じくらい簡単であると考えていました。戻るアプリに戻る前に「」キー イベントを実行すると、理論的には煩わしい編集画面が表示されなくなります。本当にそんなことができるのでしょうか?そうでない場合、他に考えられる解決策はありますか?

役に立ちましたか?

解決

一種のハック...

  • カメラアプリを起動する
  • TimerTask で、カメラ アプリが開始したかどうか、および閉じる必要があるかどうか (何らかのフラグ) をチェックします。
  • 「はい」の場合は、それを呼び出し(アクティブになり)、ESC キープレス イベント挿入を押して閉じます。

これをみて:

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