Android之蓝牙连接打印机

android 蓝牙打印 首先需要的权限: android.permission.BLUETOOTH//允许程序连接到已配对的蓝牙设备 android.permission.BLUETOOTH_ADMIN//允许程序发现和配对蓝牙设备 代码: package har.bluetooth.ui; public interface BlueToothListener { void onFail(Stri 阅读详情

一:效果图

二:实现步骤:

1.封装了一个工具类,用于调取相应的方法、

package net.XPrinter.Example4bluetooth;

import android.annotation.SuppressLint;
import android.text.TextUtils;

import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;

public class PrintUtils {

    /**
     * 打印纸一行最大的字节
     */
    private static final int LINE_BYTE_SIZE = 32;

    private static final int LEFT_LENGTH = 20;

    private static final int RIGHT_LENGTH = 12;

    /**
     * 左侧汉字最多显示几个文字
     */
    private static final int LEFT_TEXT_MAX_LENGTH = 8;

    /**
     * 小票打印菜品的名称,上限调到8个字
     */
    public static final int MEAL_NAME_MAX_LENGTH = 8;

    private static OutputStream outputStream = null;

    public static OutputStream getOutputStream() {
        return outputStream;
    }

    public static void setOutputStream(OutputStream outputStream) {
        PrintUtils.outputStream = outputStream;
    }


    /**
     * 打印文字
     *
     * @param text 要打印的文字
     */
    public static void printText(String text) {
        try {
            byte[] data = text.getBytes("gbk");
            outputStream.write(data, 0, data.length);
            outputStream.flush();
        } catch (IOException e) {
            //Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }

    /**
     * 设置打印格式
     *
     * @param command 格式指令
     */
    public static void selectCommand(byte[] command) {
        try {
            outputStream.write(command);
            outputStream.flush();
        } catch (IOException e) {
            //Toast.makeText(this.context, "发送失败!", Toast.LENGTH_SHORT).show();
            e.printStackTrace();
        }
    }

    /**
     * 复位打印机
     */
    public static final byte[] RESET = {0x1b, 0x40};

    /**
     * 左对齐
     */
    public static final byte[] ALIGN_LEFT = {0x1b, 0x61, 0x00};

    /**
     * 中间对齐
     */
    public static final byte[] ALIGN_CENTER = {0x1b, 0x61, 0x01};

    /**
     * 右对齐
     */
    public static final byte[] ALIGN_RIGHT = {0x1b, 0x61, 0x02};

    /**
     * 选择加粗模式
     */
    public static final byte[] BOLD = {0x1b, 0x45, 0x01};
    public static final byte[] BOLD1 = {0x1c, 0x21, 4};

    /**
     * 取消加粗模式
     */
    public static final byte[] BOLD_CANCEL = {0x1b, 0x45, 0x00};

    /**
     * 宽高加倍
     */
    public static final byte[] DOUBLE_HEIGHT_WIDTH = {0x1d, 0x21, 0x11};

    /**
     * 宽加倍
     */
    public static final byte[] DOUBLE_WIDTH = {0x1d, 0x21, 0x10};

    /**
     * 高加倍
     */
    public static final byte[] DOUBLE_HEIGHT = {0x1d, 0x21, 0x01};

    /**
     * 字体不放大
     */
    public static final byte[] NORMAL = {0x1d, 0x21, 0x00};

    /**
     * 设置默认行间距
     */
    public static final byte[] LINE_SPACING_DEFAULT = {0x1b, 0x32};

    /**
     * 设置行间距
     */
// public static final byte[] LINE_SPACING = {0x1b, 0x32};//{0x1b, 0x33, 0x14};  // 20的行间距(0,255)


// final byte[][] byteCommands = {
//       { 0x1b, 0x61, 0x00 }, // 左对齐
//       { 0x1b, 0x61, 0x01 }, // 中间对齐
//       { 0x1b, 0x61, 0x02 }, // 右对齐
//       { 0x1b, 0x40 },// 复位打印机
//       { 0x1b, 0x4d, 0x00 },// 标准ASCII字体
//       { 0x1b, 0x4d, 0x01 },// 压缩ASCII字体
//       { 0x1d, 0x21, 0x00 },// 字体不放大
//       { 0x1d, 0x21, 0x11 },// 宽高加倍
//       { 0x1b, 0x45, 0x00 },// 取消加粗模式
//       { 0x1b, 0x45, 0x01 },// 选择加粗模式
//       { 0x1b, 0x7b, 0x00 },// 取消倒置打印
//       { 0x1b, 0x7b, 0x01 },// 选择倒置打印
//       { 0x1d, 0x42, 0x00 },// 取消黑白反显
//       { 0x1d, 0x42, 0x01 },// 选择黑白反显
//       { 0x1b, 0x56, 0x00 },// 取消顺时针旋转90°
//       { 0x1b, 0x56, 0x01 },// 选择顺时针旋转90°
// };

    /**
     * 打印两列
     *
     * @param leftText  左侧文字
     * @param rightText 右侧文字
     * @return
     */
    @SuppressLint("NewApi")
    public static String printTwoData(String leftText, String rightText) {
        StringBuilder sb = new StringBuilder();
        int leftTextLength = getBytesLength(leftText);
        int rightTextLength = getBytesLength(rightText);
        sb.append(leftText);

        // 计算两侧文字中间的空格
        int marginBetweenMiddleAndRight = LINE_BYTE_SIZE - leftTextLength - rightTextLength;

        for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
            sb.append(" ");
        }
        sb.append(rightText);
        return sb.toString();
    }

    /**
     * 打印三列
     *
     * @param leftText   左侧文字
     * @param middleText 中间文字
     * @param rightText  右侧文字
     * @return
     */
    @SuppressLint("NewApi")
    public static String printThreeData(String leftText, String middleText, String rightText) {
        StringBuilder sb = new StringBuilder();
        // 左边最多显示 LEFT_TEXT_MAX_LENGTH 个汉字 + 两个点
        if (leftText.length() > LEFT_TEXT_MAX_LENGTH) {
            leftText = leftText.substring(0, LEFT_TEXT_MAX_LENGTH) + "..";
        }
        int leftTextLength = getBytesLength(leftText);
        int middleTextLength = getBytesLength(middleText);
        int rightTextLength = getBytesLength(rightText);

        sb.append(leftText);
        // 计算左侧文字和中间文字的空格长度
        int marginBetweenLeftAndMiddle = LEFT_LENGTH - leftTextLength - middleTextLength / 2;

        for (int i = 0; i < marginBetweenLeftAndMiddle; i++) {
            sb.append(" ");
        }
        sb.append(middleText);

        // 计算右侧文字和中间文字的空格长度
        int marginBetweenMiddleAndRight = RIGHT_LENGTH - middleTextLength / 2 - rightTextLength;

        for (int i = 0; i < marginBetweenMiddleAndRight; i++) {
            sb.append(" ");
        }

        // 打印的时候发现,最右边的文字总是偏右一个字符,所以需要删除一个空格
        sb.delete(sb.length() - 1, sb.length()).append(rightText);
        return sb.toString();
    }

    /**
     * 获取数据长度
     *
     * @param msg
     * @return
     */
    @SuppressLint("NewApi")
    private static int getBytesLength(String msg) {
        return msg.getBytes(Charset.forName("GB2312")).length;
    }

    /**
     * 格式化菜品名称,最多显示MEAL_NAME_MAX_LENGTH个数
     *
     * @param name
     * @return
     */
    public static String formatMealName(String name) {
        if (TextUtils.isEmpty(name)) {
            return name;
        }
        if (name.length() > MEAL_NAME_MAX_LENGTH) {
            return name.substring(0, 8) + "..";
        }
        return name;
    }

}

2.xml布局、

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#d4fbfb"
    android:paddingBottom="5dp"
    android:paddingLeft="5dp"
    android:paddingRight="5dp"
    android:paddingTop="5dp"
    tools:context=".MainActivitydemo">

    <TextView
        android:id="@+id/textTip"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/BkColor"
        android:text="@string/Tip"
        android:textSize="25sp" />

    <Spinner
        android:id="@+id/deviceSpinner"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textTip"
        android:layout_alignRight="@+id/InputText"
        android:layout_below="@+id/textTip" />

    <Button
        android:id="@+id/buttonConnect"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@+id/buttonPrintTest"
        android:layout_alignLeft="@+id/buttonPrintTest"
        android:layout_alignRight="@+id/textTip"
        android:text="@string/Disconnected" />


    <Button
        android:id="@+id/buttonPrintTest"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignRight="@+id/textTip"
        android:layout_below="@+id/deviceSpinner"
        android:text="@string/PrinterTest" />

    <EditText
        android:id="@+id/InputText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/textTip"
        android:layout_below="@+id/deviceSpinner"
        android:visibility="gone"
        android:layout_toLeftOf="@+id/buttonPrintTest"
        android:hint="@string/PrintContent"
        android:text="@string/Welcome" />

    <Button
        android:id="@+id/ButtonOpenCash"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/buttonPrintTest"
        android:visibility="gone"
        android:layout_alignRight="@+id/buttonPrintTest"
        android:layout_below="@+id/buttonPrintTest"
        android:text="@string/OpenCash" />

    <Button
        android:id="@+id/ButtonCutPaper"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/ButtonOpenCash"
        android:layout_alignRight="@+id/ButtonOpenCash"
        android:layout_below="@+id/ButtonOpenCash"
        android:text="@string/CutPaper" />

    <TextView
        android:id="@+id/textXPrinter"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignRight="@+id/textTip"
        android:layout_alignTop="@+id/TextLogs"
        android:background="#03bcbc"
        android:gravity="bottom"
        android:text="@string/Logs" />

    <TextView
        android:id="@+id/TextLogs"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/InputText"
        android:layout_alignParentBottom="true"
        android:layout_toLeftOf="@+id/textXPrinter"
        android:background="#03bcbc"
        android:text="@string/Logs" />


</RelativeLayout>

3.Activity实现、

package net.XPrinter.Example4bluetooth;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;

import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog.Builder;
import android.bluetooth.*;
import android.content.DialogInterface;
import android.content.Intent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;

import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.greenrobot.event.ThreadMode;

public class MainActivitydemo extends Activity {
    /**
     * Called when the activity is first created.
     */

    private Button buttonPf = null;
    private Button buttonCash = null;
    private Button buttonCut = null;
    private Button buttonConnect = null;
    private EditText mprintfData = null;
    private TextView mprintfLog = null;
    private TextView mTipTextView = null;
    private Spinner mSpinner = null;
    private List<String> mpairedDeviceList = new ArrayList<String>();
    private ArrayAdapter<String> mArrayAdapter;
    private BluetoothAdapter mBluetoothAdapter = null; //创建蓝牙适配器
    private BluetoothDevice mBluetoothDevice = null;
    private BluetoothSocket mBluetoothSocket = null;
    OutputStream mOutputStream = null;
    private static final UUID SPP_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
    private Builder dialog = null;
    Set<BluetoothDevice> pairedDevices = null;
    private String neirongcll;
    private String lym;

    private void PrintfLogs(String logs) {
        this.mprintfLog.setText(logs);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        this.setTitle(this.getTitle() + "(C)XPrinter.net");
        setContentView(R.layout.activity_maindemo);
        buttonPf = (Button) findViewById(R.id.buttonPrintTest);
        buttonCash = (Button) findViewById(R.id.ButtonOpenCash);
        buttonCut = (Button) findViewById(R.id.ButtonCutPaper);
        buttonConnect = (Button) findViewById(R.id.buttonConnect);
        mSpinner = (Spinner) findViewById(R.id.deviceSpinner);
        mprintfData = (EditText) findViewById(R.id.InputText);
        mprintfLog = (TextView) findViewById(R.id.TextLogs);
        mTipTextView = (TextView) findViewById(R.id.textTip);
        mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        ButtonListener buttonListener = new ButtonListener();
        buttonPf.setOnClickListener(buttonListener);
        buttonCash.setOnClickListener(buttonListener);
        buttonCut.setOnClickListener(buttonListener);
        buttonConnect.setOnClickListener(buttonListener);
        setButtonEnadle(false);
        dialog = new Builder(this);
        dialog.setTitle("XPrinter hint:");
        dialog.setMessage(getString(R.string.XPrinterhint));
        dialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                startActivity(new Intent(android.provider.Settings.ACTION_SETTINGS));
                //finish();
            }
        });

        dialog.setNeutralButton("No", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                // TODO Auto-generated method stub
                //finish();
            }
        });
        mpairedDeviceList.add(this.getString(R.string.PlsChoiceDevice));
        mArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, mpairedDeviceList);
        mSpinner.setAdapter(mArrayAdapter);
        mSpinner.setOnTouchListener(new Spinner.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // TODO Auto-generated method stub
                if (event.getAction() != MotionEvent.ACTION_UP) {
                    return false;
                }
                try {
                    if (mBluetoothAdapter == null) {
                        mTipTextView.setText(getString(R.string.NotBluetoothAdapter));
                        PrintfLogs(getString(R.string.NotBluetoothAdapter));
                    } else if (mBluetoothAdapter.isEnabled()) {
                        String getName = mBluetoothAdapter.getName();
                        pairedDevices = mBluetoothAdapter.getBondedDevices();
                        while (mpairedDeviceList.size() > 1) {
                            mpairedDeviceList.remove(1);
                        }
                        if (pairedDevices.size() == 0) {
                            dialog.create().show();
                        }
                        for (BluetoothDevice device : pairedDevices) {
                            // Add the name and address to an array adapter to show in a ListView
                            getName = device.getName() + "#" + device.getAddress();
                            lym=device.getName();
                            mpairedDeviceList.add(getName);//蓝牙名
                        }
                    } else {
                        PrintfLogs("BluetoothAdapter not open...");
                        dialog.create().show();
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    mprintfData.setText(e.toString());
                }
                return false;
            }
        });
    }

    private void setButtonEnadle(boolean state) {
        buttonPf.setEnabled(state);
        buttonCash.setEnabled(state);
        buttonCut.setEnabled(state);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //取消事件注册
        EventBus.getDefault().unregister(this);
    }


    class ButtonListener implements OnClickListener {
        @Override
        public void onClick(View v) {

            switch (v.getId()) {
                case R.id.buttonConnect: {
                    String temString = (String) mSpinner.getSelectedItem();
                    if (mSpinner.getSelectedItemId() != 0) {
                        if (buttonConnect.getText() != getString(R.string.Disconnected)) {
                            try {
                                mOutputStream.close();
                                mBluetoothSocket.close();
                                buttonConnect.setText(getString(R.string.Disconnected));
                                setButtonEnadle(false);
                            } catch (Exception e) {
                                // TODO: handle exception
                                PrintfLogs(e.toString());
                            }
                            return;
                        }
                        temString = temString.substring(temString.length() - 17);
                        try {
                            buttonConnect.setText(getString(R.string.Connecting));
                            mBluetoothDevice = mBluetoothAdapter.getRemoteDevice(temString);
                            mBluetoothSocket = mBluetoothDevice.createRfcommSocketToServiceRecord(SPP_UUID);
                            mBluetoothSocket.connect();
                            buttonConnect.setText(getString(R.string.Connected));
                            setButtonEnadle(true);
                        } catch (Exception e) {
                            // TODO: handle exception
                            PrintfLogs(getString(R.string.Disconnected));
                            buttonConnect.setText(getString(R.string.Disconnected));
                            setButtonEnadle(false);
                            PrintfLogs(getString(R.string.ConnectFailed) + e.toString());
                        }

                    } else {
                        PrintfLogs("Pls select a bluetooth device...");
                    }
                }
                break;
                case R.id.buttonPrintTest: {
                    try {
                        if (mprintfData.getTextSize() == 0) {
                            PrintfLogs("Pls input print data...");
                        }
                        mOutputStream = mBluetoothSocket.getOutputStream();
                        PrintUtils PrintUtils=new PrintUtils();
                        PrintUtils.setOutputStream(mOutputStream);
                        PrintUtils.selectCommand(PrintUtils.RESET);
                        PrintUtils.selectCommand(PrintUtils.LINE_SPACING_DEFAULT);
                        PrintUtils.selectCommand(PrintUtils.ALIGN_CENTER);
                        PrintUtils.selectCommand(PrintUtils.BOLD1);
                        PrintUtils.printText("--#28和易生活外卖--\n\n");
                        PrintUtils.printText("妈妈味道\n\n");
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.printText("备注:多放香菜多放辣多放葱\n\n");
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.selectCommand(PrintUtils.BOLD_CANCEL);
                        PrintUtils.selectCommand(PrintUtils.NORMAL);
                        PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
                        PrintUtils.printText(PrintUtils.printTwoData("订单编号", "201507161515\n"));
                        PrintUtils.printText(PrintUtils.printTwoData("下单时间", "2016-02-16 10:46\n"));
                        PrintUtils.printText(PrintUtils.printTwoData("人数:2人", "收银员:张三\n"));
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.selectCommand(PrintUtils.BOLD);
                        PrintUtils.printText(PrintUtils.printThreeData("项目", "数量", "金额\n"));
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.selectCommand(PrintUtils.BOLD_CANCEL);
                        PrintUtils.printText(PrintUtils.printThreeData("面", "1", "0.00\n"));
                        PrintUtils.printText(PrintUtils.printThreeData("米饭", "1", "6.00\n"));
                        PrintUtils.printText(PrintUtils.printThreeData("铁板烧", "1", "26.00\n"));
                        PrintUtils.printText(PrintUtils.printThreeData("一个测试", "1", "226.00\n"));
                        PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊", "1", "2226.00\n"));
                        PrintUtils.printText(PrintUtils.printThreeData("牛肉面啊啊啊牛肉面啊啊啊", "888", "98886.00\n"));
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.printText(PrintUtils.printTwoData("合计", "53.50\n"));
                        PrintUtils.printText(PrintUtils.printTwoData("抹零", "3.50\n"));
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.printText(PrintUtils.printTwoData("应收", "50.00\n"));
                        PrintUtils.printText("--------------------------------\n");
                        PrintUtils.selectCommand(PrintUtils.ALIGN_LEFT);
                        PrintUtils.selectCommand(PrintUtils.BOLD1);
                        PrintUtils.printText(PrintUtils.printTwoData("地址:", "霸州市中悦国际和易生活结算中心二楼技术部\n曹先生:18744892420\n"));
                        PrintUtils.printText("\n\n\n\n\n");

                        PrintfLogs("Data sent successfully...");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        PrintfLogs(getString(R.string.PrintFaild) + e.getMessage());
                    }


                }
                break;
                case R.id.ButtonOpenCash: {
//                    startActivity(new Intent(MainActivitydemo.this, QIDong.class));
//             try {
//                if (mprintfData.getTextSize()==0) {
//                   PrintfLogs("Pls input print data...");
//                }
//                mOutputStream=mBluetoothSocket.getOutputStream();
//                mOutputStream.write(new byte[]{0x1b,0x70,0x00,0x1e,(byte)0xff,0x00});
//                mOutputStream.flush();
//                PrintfLogs("Data sent successfully...");
//             } catch (IOException e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//                PrintfLogs(getString(R.string.OpenCashFaild)+e.getMessage());
//             }
                }
                break;
                case R.id.ButtonCutPaper: {
                    try {
                        if (mprintfData.getTextSize() == 0) {
                            PrintfLogs("Pls input print data...");
                        }
                        mOutputStream = mBluetoothSocket.getOutputStream();
                        mOutputStream.write(new byte[]{0x0a, 0x0a, 0x1d, 0x56, 0x01});
                        mOutputStream.flush();
                        PrintfLogs("Data sent successfully...");
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                        PrintfLogs(getString(R.string.CutPaperFaild) + e.getMessage());
                    }

                }
                break;
                default:
                    break;
            }

        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        //getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

-------------------上诉贴上的代码稍微有点难度的都有注释,在这我就不太过于详细、

-------------------附上源码:http://download.youkuaiyun.com/download/android_cll/9903236

Android打印机--蓝牙打印 关于Android蓝牙打印和网络打印,其实都是基于Socket通信机制实现的。但这两者在使用方式和实现细节上有所不同。 阅读详情

相关推荐

Android蓝牙打印机连接与实战

本文还有配套的精品资源,点击获取 简介:在Android平台上连接蓝牙打印机是移动打印和小型商业应用中的常见任务。本文深入探讨Android蓝牙API,指导开发者完成设备发现、连接建立、数据传输等步骤。通过提供的源码示例 bluetoothprinter ,开发者可以了解具体实现细节,掌握蓝牙打印机的连接与应用。 1. Android蓝牙API简介 ...

weixin_42527665的博客 2653

Android蓝牙打印机功能开发(提供完整Demo)

Android连接打印机、蓝牙打印、ESC指令集、CPCL指令集,TES指令、佳博打印sdk示例

落雨敏 1万+

Android平台蓝牙打印机连接与应用指南

通用唯一识别码(UUID)是软件开发中用于唯一标识信息的128位数字。在蓝牙SPP服务中,UUID用于唯一标识服务,确保设备之间能够正确地通信。在Android平台,可以使用来生成一个随机的UUID,或者使用特定的UUID字符串来匹配标准的蓝牙服务。// 生成一个随机的UUID// 打印生成的UUIDLog.d("TAG", "随机生成的UUID是:" + uuid);// 使用特定的UUID字符串// 打印特定的UUID。

weixin_35756637的博客 1175

Android连接蓝牙打印机

前言 在之前写过一篇文章Android操作蓝牙打印机(上),当时也是因为自己在工作中确实走了许多弯路,所以计划着用两篇文章详细阐述蓝牙打印的整个流程,后来由于接近年底,任务比较多,所以就暂且搁置了。再后来发现当时的设计仍有许多不足,最头疼的就是与业务代码参杂在一起,不够解耦。由于上一篇文章描述了当时自己在工作中的经历与思考,所以有好几个同学私信我,能不能发一份代码参考一下,介于种种原因,于是决定将蓝牙部分抽离出来,与业务代码分离,做成了lib形式。 git仓库 https://github.com/zhuh

zhuhuitao 6200

Android蓝牙连接打印机实战指南

htmltable {th, td {th {pre {简介:在Android平台上实现蓝牙连接打印机是移动办公和物联网应用中的常见需求。本文详细讲解如何使用Android蓝牙API(如BluetoothAdapter、BluetoothDevice和BluetoothSocket)完成蓝牙设备的开启、扫描、配对与连接,并通过输出流发送基于ESC/POS等协议的打印指令,实现文本打印、图形绘制、切纸等操作。

weixin_42575109的博客 1219

android app连接蓝牙打印机打印

最近公司项目需要android手机连接蓝牙打印机打印app页面中的数据,大家有需要的话可以看一下这个demo

android 蓝牙打印 js,Native.js 安卓连接蓝牙打印机【可连续打印】

自己摸索了一下,并参考其他人的代码,并修复了原来代码存在的问题,问题1:字符串的getBytes函数,返回null【需要通过new的方式创建字符串】问题2:初始化打印一次,之后无法使用【不要重复调用device.createInsecureRfcommSocketToServiceRecord(uuid)或重复引入CLASS】代码如下,可正常运行【注意,蓝牙打印机必须先匹配,保证手机蓝牙打开】mu...

weixin_31207855的博客 1083

Imatest-Dot Pattern

本文介绍了DotPattern模块测试方法,用于评估相机拍摄点阵图的表现。测试主要关注两点:色彩准确性(是否存在彩色噪点和杂边)和摩尔纹现象。测试步骤包括导入图片、选择分析区域、微调ROI、选择点状图类型和分析保存结果。测试结果包含横向色差、光学畸变和SMIATV畸变等数据,其中0.115%的色差值和0.004度的网格旋转角度表明相机表现良好,但-10.4%的SMIATV畸变显示存在明显桶形畸变。文章还提供了各项指标的具体解读标准。

weixin_64706696的博客 1351

android 蓝牙连接热敏打印机打印

我整理的一些关于【java】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/f2PFnNAndroid 蓝牙连接热敏打印机打印指南 在这篇文章中,我们将介绍如何在 Android 平台上通过蓝牙连接热敏打印机并进行打印操作。我们会一步一步地解析整个流程,使你能够顺利上手。 流...

weixin_42509868的博客 896

前端宝典之七:React性能优化实战精华篇

本文主要讲解实战项目中React性能优化的方法,主要分为三个大的方面:减少不必要的组件更新、组件优化以及tree-shaking,共11个方法

franktaoge的博客 1902

手把手教你用示波器搞定PCIe 5.0 REFCLK时钟信号测量(附完整参数解读)

本文详细介绍了如何使用示波器进行PCIe 5.0 REFCLK时钟信号测量,包括示波器与探头的选择、关键参数的测量方法及解读,以及实战中的常见问题与解决方案。通过手把手教学和完整参数解读,帮助硬件工程师高效完成时钟信号测量,确保系统稳定性。

weixin_28704565的博客 359

【Android -- 蓝牙】蓝牙连接打印机

蓝牙连接打印机

Kevin Learn Android 2055

高温环境下(100℃以上)相机的几种保障方案

高温环境下相机保障措施摘要:针对120℃以上高温环境,相机需采取多重防护:1.散热设计采用金属机身、散热鳍片或风扇;2.关键部件选用耐高温材料(铝合金、特种玻璃);3.电子元件需军规级芯片并做三防处理;4.建议外接电源或耐高温电池。工业相机(如FLIR A655sc、Basler ace)及特种机型(Ximea xiQ)具备高温适应性,普通相机可加装隔热套件配合冷却系统。选择时需关注传感器信噪比和全局快门性能,并设置温度监控保护机制。注意高温会加速设备老化,需定期检测维护。(149字)

start_up_go的博客 1586

安卓手机连接蓝牙打印机实现打印功能

最近在做一个安卓应用,其中有一个需求是要求用蓝牙连接打印机实现打印功能。一开始没有一点头绪,网上找了很多资料也找不到有用的数据。所以自己就去研究,最终,功夫不负有心人,顺利的完成了这个功能。下边贴出我写的代码,共有需要的IT哥们参考学习。 我们先看看运行效果图吧。。。 1.这是主界面的效果图 贴上布局文件的代码:bluetooth_layout.xml

reality_jie的专栏 5万+

Python 爬虫实战:龙虎榜机构买卖数据爬取与代码详解(附数据分析)

龙虎榜是证券市场中重要的市场信息之一,记录了当日大宗交易及机构买卖情况,包括机构名称、买卖方向、成交金额、成交股数、买入卖出价格等信息。通过分析龙虎榜数据,投资者可以更好地了解市场动向和机构投资者的行为,从而做出更准确的决策。本文将详细介绍如何使用 Python 编写爬虫程序,高效地抓取龙虎榜机构买卖数据,并进行数据分析。我们将从环境搭建、数据抓取、数据存储到数据分析等关键步骤逐一展开,帮助读者掌握完整的爬虫实战流程。

u014481728的博客 702

黑猫带你学eMMC协议第4篇:eMMC概述

1 前言 声明: 本文依据eMMC JEDEC5.1协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 本文大约3000字,从emmc的内部结构框架、供电、总线、寄存器等各方面进行框架性的介绍,本章节内容不需要深入研究,读完本篇文章,只要能对emmc有个框架下的了解,就可以了。 2 内部结构框架 由图可以看出,emmc内部由两块组成:控制器 + 存储介质。emmc内部存储介质绝大部分为nand flash。 众所周知,我们需要存储数据到nand flash中,并

黑猫奥利奥的博客 3341

android 蓝牙地址连接打印机,android 连接蓝牙打印机 BluetoothAdapter

android 连接蓝牙打印机 BluetoothAdapter源码下载地址:https://github.com/yylxy/BluetoothText.gitpublic class PrintActivity extends AppCompatActivity {//设备列表private ListView listView;private ArrayList mBluetoothDevic...

weixin_34237703的博客 312

微信小程序 - 详细解决web-view公众号文章或第三方网站分享转发后打开失败,页面显示“无法打开该页面,不支持打开“、“页面不存在“报错提示,苹果IOS系统手机打开是空白页,安卓手机系统会有提示!

微信小程序,公众号文章,第三方H5网页,内嵌网站分享后打不开,web-view,页面分享,小程序里公众号文章转发后无法打开,白屏,页面空白什么都没有,不支持打开,无法打开该页面,页面不存在,业务域名配置好了还是不行,公众号和小程序已经关联,iOS端苹果真机打开空白页,安卓手机,页面分享后,用户打不开提示错误,提示页面不存在,如何解决页面提示无法打开该页面,微信小程序web-view无法打开该页面不支持打开的解决方法,无法打开该页面不支持打开,最新详细解决方案,分享之后无法打开页面,提示无法打开该页面,不支持

🏆 前端领域优质创作者 1万+

安卓手机连接IP100蓝牙打印机实现打印功能

最近要做两个Android demo 。第一个要求用手机蓝牙连接打印机实现手填报表打印功能,第二个是手机蓝牙连接的手持设备,需求同步里面的数据,同步成功后要删除设备里面的数据。 先开始玩的是佳能IP100的打印机, 发现这款打印机蓝牙只能实现打印图片功能,文档什么的要么接受了没反应,要么就乱码。 后来又玩了下佳能IP110的, 这款机型实现的是wifi无线打印 。 由于用户需求最后研究了IP...

Alien__Chao的博客 2万+

告别 DEFINE VIEW:CDS View Entity 迁移全景实战(报表迁移 + ADT 向导 + 避坑清单)

CDS迁移的关键要点与策略 CDS DDIC-based View已被标记为废弃,迁移到CDS View Entity成为必要。迁移面临的主要挑战包括激活成本、命名约束和依赖风险。ABAP 7.57及以上版本必须优先处理,否则将积累技术债务。 迁移方式主要有两种: 报表路线:适合渐进式迁移的On-Premise项目 ADT向导:适合云环境批量迁移 关键注意事项: 必须提前检查SQL View依赖关系 金额/数量字段需要显式引用单位/货币字段 建议按使用场景分批迁移 最佳实践是结合报表进行系统盘点,再通过AD

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

AndroidApp连接蓝牙打印机打印Demo:Android开发新利器

AndroidApp连接蓝牙打印机打印Demo:Android开发新利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 随着移动支付和物联网技术的发展,Android应用与硬件设备的联动变得愈发普遍。今天要介绍的开源项目——AndroidApp连接蓝牙打印机打印Demo,为广大开发者提供了一个实现Android应用与蓝牙打印机交互的实践指南。通过这个demo,开发者可...

gitblog_06797的博客 898

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Android手机连接蓝牙打印机连接不上的问题

目前碰到的情况(虽然可能是小情况,但是在解决的时候还是很费时间的): 1.在写Demo时,用测试机连接蓝牙打印机,发现P7可以连接,而其余的手机都连接失败,找了一上午资料也没解决这个问题。 接着我把P7的蓝牙断开,这样我用别的手机就连接上了。 说明:出现有一部手机能连上,其余手机连接不上的情况时,先断开连接,在用其他手机连接。

fouglelove的专栏 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android App 连接蓝牙打印机打印 Demo

Android App 连接蓝牙打印机打印 Demo 去发现同类优质开源项目:https://gitcode.com/ 介绍 在当今的移动开发场景中,Android 应用与硬件设备的交互需求日益增多。本仓库提供的资源文件是一个Android App连接蓝牙打印机进行打印的示例demo。如果您的工作或项目中需要实现Android设备与蓝牙打印机的连接并打印数据,这个demo将会是一个很好的学习起点。...

gitblog_06705的博客 382
上一篇: Android之仿美团和百度外卖选址控件
下一篇: Android之EditText禁止输入空格和回车符
叶已初秋
博客等级 码龄11年 2684粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶已初秋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值