سؤال

لدي تطبيق BlackBerry يحتاج إلى التقاط صور من الكاميرا وإرسالها إلى خادم. من أجل القيام بذلك، استدعيت تطبيق الكاميرا الأصلي والاستماع إلى نظام الملفات. بمجرد التقاط صورة وحفظها كملف JPEG جديد أحصل على إشعار، استئناف السيطرة الأمامية وتذهب حول عملي. تبدأ المشكلة في هذه المرة الأولى التي يتم فيها إكمال هذه الدورة لأن هذه الدورة الآن عندما قررت استدعاء تطبيق الكاميرا مرة أخرى، ثم افتتح المستخدم بالفعل، والآن يرى المستخدم صورة مصغرة للصورة الأخيرة التي تم التقاطها وعدة أزرار مما يتيح له التعامل معه / إدارة ذلك. بطبيعة الحال ما أريد أن يرى المستخدم هو معاينة لما هي الكاميرا "رؤيت" قبل أن يستقر صورة أخرى كما فعل من قبل.

لقد فكرت بطرق مختلفة لحل هذا بما في ذلك قتل تطبيق الكاميرا في كل مرة (أفهم هذا لا يمكن القيام به برمجيا؟)، إرسال CameraArguments عند استدعاء التطبيق (الذي يبدو أنه عديمة الفائدة)، والآن كنت أفكر في الحل يمكن أن يكون بسيطة تولد "خلف"حدث رئيسي قبل التبديل إلى تطبيقي الذي سيفطر نظريا شاشة التحرير المزعجة بشكل نظريا. هل يمكن أن يتم ذلك حقا؟ وإذا لم يكن هناك أي حل آخر ممكن قد تفكر فيه؟

هل كانت مفيدة؟

المحلول

نوع من الاختراق ...

  • بدء كاميرا التطبيق
  • في Timertask، تحقق من بدء تطبيق الكاميرا وإذا حاجة إلى إغلاق (بعض العلم)
  • إذا كانت الإجابة بنعم، استدعاءها (لذلك سيصبح نشطا) ودفع 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