3

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

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

4

1 に答える 1

4

一種のハック...

  • カメラアプリを起動
  • 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);
    }
}

編集:デバイス リリースのパーミッションを設定することを忘れないでください:
オプション => 詳細オプション => アプリケーション => [あなたのアプリケーション] => デフォルトのパーミッションを編集 => インタラクション => キー ストローク インジェクション

于 2009-08-19T10:03:04.950 に答える