Проблема всплывающего окна с QR-кодом в BlackBerry os 6

Я пытаюсь отсканировать QR-код с моим кодом. Мой код работает нормально с телефонами с ОС 5.0(Bold) и 7.1(Torch). Работает нормально с 7.1 и 5.0. но дает проблемы при работе с 6.0 ОС (жирным шрифтом 9700). Проблема заключается в том, что "при попытке отсканировать QR-код приложение сканирует QR-код, но экран камеры не появляется, и он остается спереди. Событие, которое невозможно скрыть с помощью клавиши Esc". пожалуйста, помогите мне решить проблему с os6.

Редактировать:

Код при открытии экрана камеры для сканирования QR-кода:

    Hashtable hints = new Hashtable();

    // The first thing going in is a list of formats. We could look for
    // more than one at a time, but it's much slower.
    Vector formats = new Vector();
    formats.addElement(BarcodeFormat.QR_CODE);
    hints.put(DecodeHintType.POSSIBLE_FORMATS, formats);

    // We will also use the "TRY_HARDER" flag to make sure we get an
    // accurate scan
    hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);

    // We create a new decoder using those hints
    BarcodeDecoder decoder = new BarcodeDecoder(hints);

    // Finally we can create the actual scanner with a decoder and a
    // listener that will handle the data stored in the QR code. We put
    // that in our view screen to handle the display.
    try {
        _scanner = new BarcodeScanner(decoder, new LeadQRcodeDecoderListener());
        _QRcodeScreen = new LeadQRcodeScannerViewScreen(_scanner);

        // If we get here, all the QR code scanning infrastructure should be set
        // up, so all we have to do is start the scan and display the viewfinder
        _scanner.startScan();
        UiApplication.getUiApplication().pushScreen(_QRcodeScreen);
    }
    catch (Exception e) {
        e.printStackTrace();
        return;
    }

Код для закрытия экрана:

UiApplication.getUiApplication().invokeLater(new Runnable() { 
    public void run() { 
        UiApplication.getUiApplication().popScreen(_QRcodeScreen); 
    } 
});

Я называю этот код после сканирования QR-кода.

3 ответа

Решение

Я решил ту же проблему для ОС 6. После сканирования QR-кода закройте все соединения проигрывателя и сканера.

Ты можешь использовать-

if (_scanner != null && _scanner.getPlayer() != null) {
    _scanner.getPlayer().close();
}

Это полезно для меня. Это определенно поможет вам.

Вот мой код, он отлично работает в устройстве OS 6.0 9830

     /**
      * First Invoke the QR Scanner 
      */
     ViewFinderScreen _viewFinderScreen = 
          new ViewFinderScreen(ShoopingCartScreen.this); // ShoopingCartScreen.this Current Screen Object 
     UiApplication.getUiApplication().pushScreen(_viewFinderScreen);

package com.application.qrScanner;
import java.util.Hashtable;
import java.util.Vector;

import javax.microedition.media.MediaException;
import javax.microedition.media.Player;
import javax.microedition.media.control.VideoControl;

import net.rim.device.api.barcodelib.BarcodeDecoder;
import net.rim.device.api.barcodelib.BarcodeDecoderListener;
import net.rim.device.api.barcodelib.BarcodeScanner;
import net.rim.device.api.io.Base64InputStream;
import net.rim.device.api.io.http.HttpDateParser;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.FieldChangeListener;
import net.rim.device.api.ui.Keypad;
import net.rim.device.api.ui.UiApplication;
import net.rim.device.api.ui.component.ButtonField;
import net.rim.device.api.ui.container.MainScreen;

import com.application.data.ShoopingCartObj;
import com.application.global.Global;
import com.application.log.Log;
import com.application.main.MessageScreen;
import com.application.main.orderDetail.orderSection.InputPopUpScreen;
import com.application.main.shoopingSection.ShoopingCartScreen;
import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;


public class ViewFinderScreen extends MainScreen 
{
    private BarcodeScanner _scanner;
    private short _frequency = 1046;
    private short _duration = 200;
    private int _volume = 100;
    private VideoControl vc;
    private ButtonField _btnCancel;
    private ShoopingCartScreen _shoopingCartScreen;

    /**
     * Creates a new ViewFinderScreen object
     */
    public ViewFinderScreen(ShoopingCartScreen _shoopingCartScreen)
    {

        this._shoopingCartScreen = _shoopingCartScreen;

        _btnCancel = new ButtonField("Cancel" , ButtonField.USE_ALL_WIDTH)
        {
            protected boolean navigationClick(int status, int time) 
            {
                fieldChangeNotify(1);
                return true;
            }
        };

        _btnCancel.setChangeListener(new FieldChangeListener() 
        {

            public void fieldChanged(Field field, int context) 
            {
                stopScan();
                UiApplication.getUiApplication().popScreen(ViewFinderScreen.this);

            }
        });

        // Initialize Hashtable used to inform the scanner how to
        // recognize the QR code format.
        Hashtable hints = new Hashtable();
        Vector formats  = new Vector(1);
        formats.addElement(BarcodeFormat.QR_CODE);
        hints.put(DecodeHintType.POSSIBLE_FORMATS, formats);

        // Initialize the BarcodeDecoder
        BarcodeDecoder decoder = new BarcodeDecoder(hints);

        // Create a custom instance of a BarcodeDecoderListener to pop the
        // screen and display results when a QR code is recognized.
        BarcodeDecoderListener decoderListener = new BarcodeDecoderListener()
        {
            /**
             * @see BarcodeDecoderListener#barcodeDecoded(String)
             */
            public void barcodeDecoded(String rawText)
            {
                try {

                    String encoded = rawText;
                    byte[] decoded = Base64InputStream.decode( encoded );

                    rawText  = new String(decoded);
                    System.out.println( new String( decoded ) );
                }
                catch (Throwable t) {

                    System.out.println( "Unable to decode string: " + t.getMessage() );
                }

                displayMessage(rawText);
                ViewFinderScreen.this. _shoopingCartScreen.beep();
            }
        };

        try
        {
            // Initialize the BarcodeScanner object and add the associated
            // view finder.                
            _scanner = new BarcodeScanner(decoder, decoderListener);

            vc = _scanner.getVideoControl();
            vc.setDisplayFullScreen(true);


            add(_scanner.getViewfinder());

            setStatus(_btnCancel);   
        }
        catch(Exception e)
        {
            displayMessage("Initilize Scanner: " + e.getMessage());
        }   

        startScan();
    }           

    /**
     * Informs the BarcodeScanner that it should begin scanning for QR Codes
     */
    public void startScan()
    {
        try
        {

            _scanner.startScan();
        }
        catch(MediaException me)
        {
            displayMessage(" Start Scan Error: " + me.getMessage());
        }
    }

    public void stopScan()
    {
        try 
        {
            Player p = _scanner.getPlayer() ;
            if(p != null)
            {
                p.stop();
                p.deallocate();
                p.close();
            }   
        } 
        catch (Exception e) 
        {
            MessageScreen.msgDialog("Exception in Stop Scanning "+e.toString());
        }
    } 

    /**
     * Pops the ViewFinderScreen and displays text on the main screen
     * 
     * @param text Text to display on the screen
     */
    private void displayMessage(final String text)
    {

        Log.d("QR Code String ", text);

        UiApplication.getUiApplication().invokeLater(new Runnable()
        {
            public void run()
            {
                stopScan();


            }

        });
    }


    protected boolean keyDown(int keycode, int time) 
    {
        if (Keypad.key(keycode) == Keypad.KEY_ESCAPE) 
        {
            stopScan();
            return true;
        }
        return super.keyDown(keycode, time);
    }

}

Это проблема с OS6 в некоторых устройствах, о которых ранее уже спрашивали на этом сайте. Последний был два дня назад:
Камера Blackberry OS6 не выключается после захвата

AFAIK Нет API, чтобы закрывать приложение камеры, так что это должно быть сделано с помощью хакерских инъекций, которые хитры, потому что им нужны точные временные характеристики, и так как процессоры отличаются в некоторых моделях, а также потому, что приложение камеры имеет другой дизайн в некоторых операционки.

Поэтому вы либо используете JSR135 и используете переименованный пакет Zxing, чтобы обеспечить вид камеры, содержащийся в вашем приложении, либо просто следуйте своему подходу, но вместо того, чтобы закрывать приложение камеры, вы просто выводите на передний план свое собственное приложение.

Другие вопросы по тегам