⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 printimageclient.java

📁 一个利用手机上的bluetooth来开发的小程序 也是很经典的例子
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
            while (en.hasMoreElements()) {
                Integer reqHandle = (Integer) en.nextElement();
                da.cancelServiceSearch(reqHandle.intValue());
            }
        }
    }
    
    private void findServices() throws BluetoothStateException {
        RemoteDevice[] devs = null;

        synchronized (initLock) {
            if (initStarted) {
                throw new BluetoothStateException(
                        "The previous device discovery is running...");
            }
            initStarted = true;
            devDisStarted = true;
            this.foundDevs = new Hashtable();
            this.startedReqs = new Hashtable();
        }
        
        da = LocalDevice.getLocalDevice().getDiscoveryAgent();
        devs = da.retrieveDevices(DiscoveryAgent.PREKNOWN);

        if (devs != null) {
            for (int i = 0; i < devs.length; i++) {
                findService(devs[i], foundDevs, startedReqs);
            }
        }

        devs = da.retrieveDevices(DiscoveryAgent.CACHED);

        if (devs != null) {
            for (int i = 0; i < devs.length; i++) {
                findService(devs[i], foundDevs, startedReqs);
            }
        }
        
        try {
            da.startInquiry(DiscoveryAgent.GIAC, this);
        } catch (BluetoothStateException btse) {
            synchronized (initLock) {
                initStarted = false;
                devDisStarted = false;
                this.foundDevs = null;
                this.startedReqs = null;
            }
            throw btse;
        }
    }

    private void findService(RemoteDevice dev, Hashtable devs,
            Hashtable reqs) throws BluetoothStateException {
        /* if this bloototh device was found in preknown or
         * cached devices skips it now. */
        synchronized (devs) {
            if (devs.put(dev,dev) != null) {
                return;
            }
        }
        
        UUID[] uuidSet = new UUID[] {PICTURE_PRINT_UUID};
        int transID = da.searchServices(null, uuidSet, dev, this);
        Integer transHandle = new Integer(transID);
        
        synchronized (reqs) {
            reqs.put( transHandle, transHandle);
        }
    }
    
    public void deviceDiscovered(RemoteDevice device, DeviceClass cod) {
        try {
            findService(device, foundDevs, startedReqs);
        } catch (BluetoothStateException bse) {
            bse.printStackTrace();
        }
    }

    public void inquiryCompleted(int discType) {
        synchronized (initLock) {
            devDisStarted = false;
            
            if ((startedReqs == null) || (startedReqs.isEmpty())) {
                initStarted = false;
                this.foundDevs = null;
                this.startedReqs = null;
            }
        }
    }

    public void servicesDiscovered(int transID, ServiceRecord[] servRecord) {
        for (int i = 0; i < servRecord.length; i++) {
            gui.updatePrinterList(servRecord[i]);
        }
    }

    public void serviceSearchCompleted(int transID, int respCode) {
        synchronized (startedReqs) {
            startedReqs.remove(new Integer(transID));
        }
        
        synchronized (initLock) {
            if ((devDisStarted == false) && (startedReqs.isEmpty())) {
                initStarted = false;
                this.foundDevs = null;
                this.startedReqs = null;
            }
        }
    }
}

final class BTSPPImageSender implements Runnable {

    /** Shows if debug prints should be done. */
    private static final boolean DEBUG = false;

    /** DEBUG only: keeps the class name for debug. */
    private static final String cn = "ObexImageSender";

    /** Indicate that uploading should be stopped */
    //private boolean stop = true;

    /** Stream  with image data */
    private InputStream imageSource = null;

    /** Special stream to load image data to byte array */
    private ByteArrayOutputStream baos = null;

    /** Output stream of obex */
    private OutputStream outputStream = null;

    /** Array with image data */
    private byte[] imageData = null;

    /** Contains name of uploading image */
    private String pictureName = null;
    private ServiceRecord printerRecord = null;

    /** Reference to GUI part of sender */
    private PrintImageClient gui = null;
    
    private boolean stop = false;

    BTSPPImageSender(PrintImageClient gui) {
        this.gui = gui;
    }

    void start(String pictureName, ServiceRecord printerRecord) {
        this.pictureName = pictureName;
        this.printerRecord = printerRecord;
        (new Thread(this)).start();
    }
    
    void stop() {
        stop = true;
        close();
    }

    /**
     * Used to send an image
     */
    public void run() {
        boolean loaded = false;
        boolean connected = false;
        stop = false;

        try {
            loadImageData(pictureName);
            loaded = true;
            connect();
            connected = true;
            uploadImage(pictureName);
        } catch (IOException e) {
            if (DEBUG) {
                e.printStackTrace();
            }

            /*
            if (!stop) {
                if (connected) {
                    gui.stopMessage();
                } else if (loaded) {
                    gui.notReadyMessage();
                } else {
                    gui.errorMessage();
                }
                closeAll();
                return;
            }
            */
        } catch (Throwable e) {
            e.printStackTrace();
        }
        close();
        gui.showPictureList();
    }

    /** load image data to array */
    private void loadImageData(String pictureName) throws IOException {
        imageSource = getClass().getResourceAsStream(pictureName);

        // read image data and create a byte array
        byte[] buff = new byte[1024];
        baos = new ByteArrayOutputStream(1024);

        while (true) {

            // check stop signal
            if (stop) {
                throw new IOException();
            }
            int length = imageSource.read(buff);

            if (length == -1) {
                break;
            }
            baos.write(buff, 0, length);
        }
        imageData = baos.toByteArray();
    }

    /** Connects with image receiver */
    private void connect() throws IOException {

        String url = printerRecord.getConnectionURL(
                ServiceRecord.NOAUTHENTICATE_NOENCRYPT, false);

        // update the Gauge message before connecting
        gui.showProgress("Connecting ...", imageData.length);
        StreamConnection streamConnection;

        synchronized (this) {
            streamConnection = (StreamConnection) Connector.open(url);
        }

        // update the Gauge message after connecting
        gui.showProgress("Uploading Image ...", imageData.length);
        
        // start put operation
        outputStream = streamConnection.openOutputStream();
        streamConnection.close();
    }

    /** Uploads image to receiver */
    private void uploadImage(String pictureName) throws IOException {
        int position = 0;
        
        OutputStream outputStream = this.outputStream;
        byte[] imageData = this.imageData;
        
        if (outputStream == null) {
            throw new IOException();
        }
            
        while (position != imageData.length) {
            int sendLength = imageData.length - position >
                    256 ? 256 : imageData.length - position;
            outputStream.write(imageData, position, sendLength);
            position += sendLength;
            gui.updateProgress(position);
        }
        outputStream.close();
    }
    
    private void close() {
        if (outputStream != null) {
            try {
                outputStream.close();
            } catch (IOException ioe) {}
            outputStream = null;
        }
        imageData = null;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -