首页 > 其他分享 >蓝牙打印开发代码示例(日拱一卒,有点进步,UUID仍报错)

蓝牙打印开发代码示例(日拱一卒,有点进步,UUID仍报错)

时间:2024-04-22 17:13:38浏览次数:18  
标签:UUID 示例 蓝牙 报错 debug import android 设备 Log

 

package com.lingrui.btprint;

import android.Manifest;
import android.app.AlertDialog;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static String MY_UUID = "DC:0D:30:D6:0F:50";
    /**
     * 代表本地蓝牙适配器(蓝牙无线电)。BluetoothAdapter是所有蓝牙交互的入口。
     * 使用这个你可以发现其他蓝牙设备,查询已配对的设备列表,
     * 使用一个已知的MAC地址来实例化一个BluetoothDevice,
     * 以及创建一个BluetoothServerSocket来为监听与其他设备的通信。
     */
    private BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    /**
     * 代表一个远程蓝牙设备,使用这个来请求一个与远程设备的BluetoothSocket连接,
     * 或者查询关于设备名称、地址、类和连接状态等设备信息。
     */
    private BluetoothDevice mBluetoothDevice = null;
    /**
     * 代表一个蓝牙socket的接口(和TCP Socket类似)。这是一个连接点,
     * 它允许一个应用与其他蓝牙设备通过InputStream和OutputStream交换数据。
     */
    private BluetoothSocket mBluetoothSocket = null;


    BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

    public ActivityResultLauncher<Intent> register;
    ActivityResultLauncher<Intent> startBlueTooth = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result)
        {
            if (result==null)
            {
                Log.e("error:","打开失败");
            }
            else
            {
                Log.e("DEBUG:","6666666666666666666666666666666");
                if (result.getResultCode() == RESULT_CANCELED)
                {
                    Log.d("debug", "用户取消");
                }
            }
        }
    });

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        //点击蓝牙按钮
        Button btBlt = findViewById(R.id.bt_blt);
        btBlt.setOnClickListener(this);

        CheckBox ck_1 = findViewById(R.id.ck_1);



    }

    @Override

    public void onClick(View v) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            checkConnectPermission();
        }
        Toast.makeText(getApplicationContext(), "蓝牙TEST", Toast.LENGTH_SHORT).show();

        try {
            Log.d("debug", "点击打开蓝牙按钮");
            mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

            // 如果设备不支持蓝牙
            if (mBluetoothAdapter == null) {
                Log.d("debug", "设备不支持蓝牙");
                return;
            }
            // 设备支持蓝牙功能,启动蓝牙
            if (!mBluetoothAdapter.isEnabled()) {

                register.launch(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));
                Log.d("debug", "启动蓝牙");
            }

            //打开蓝牙
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                return;
            }
            boolean enable = mBluetoothAdapter.enable();
            Log.d("debug", "蓝牙开启状态:"+String.valueOf(enable));
            //取得蓝牙开启状态

            //一旦蓝牙已经打开,我们可以使用蓝牙适配器来搜索附近的蓝牙设备

            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_CONNECT) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions

                return;
            }
            Set<BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
            //getBondedDevices 方法返回已经配对的蓝牙设备的集合。通过遍历集合,可以获取设备的名称和地址等信息
            for (BluetoothDevice device : pairedDevices) {
                String deviceName = device.getName();
                String deviceAddress = device.getAddress();
                // 处理找到的设备信息
                Log.d("debug", deviceName);
                Log.d("debug", deviceAddress);
                mBluetoothDevice = device;
            }
            Log.d("debug", "步骤四:连接蓝牙设备");
            Toast.makeText(getApplicationContext(), "蓝牙TEST", Toast.LENGTH_SHORT).show();
            /*步骤四:连接蓝牙设备
            在搜索到蓝牙设备后,我们需要选择一个设备进行连接*/
            BluetoothSocket socket = mBluetoothDevice.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));
            Log.d("debug", MY_UUID);
            socket.connect();

            //连接成功后,我们可以通过蓝牙连接发送打印指令给蓝牙标签打印机。
            OutputStream outputStream = socket.getOutputStream();

        }catch (IllegalStateException | IOException e) {
            Log.d("debug", e.getMessage());
            Toast.makeText(getApplicationContext(), "蓝牙打开失败:"+"\n"+e.getMessage(), Toast.LENGTH_SHORT).show();
        }




    }

    public void showPermissionDialog() {
        AlertDialog.Builder builder = new AlertDialog.Builder(this, android.R.style.Theme_DeviceDefault_Light_Dialog_NoActionBar_MinWidth);
        builder.setMessage("需要读SD卡权限,用来获取照片\n需要获取手机状态权限,用来获取设备号\n需要获取联系人权限,用来...");
        builder.setTitle("权限说明");
        builder.setCancelable(true);
        builder.setPositiveButton("申请", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                ;
            }
        });
        builder.show();
    }

    @RequiresApi(api = Build.VERSION_CODES.S)
    private void checkConnectPermission() {

        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED) {
            Log.i("MES", "SUCCESS");
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {android.Manifest.permission.BLUETOOTH_CONNECT} ,2);
        }
        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_DENIED) {
            Log.i("MES", "SUCCESS");
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {android.Manifest.permission.ACCESS_FINE_LOCATION} ,2);

        }
        if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.BLUETOOTH_SCAN) == PackageManager.PERMISSION_DENIED) {
            Log.i("MES", "SUCCESS");
            ActivityCompat.requestPermissions(MainActivity.this, new String[] {android.Manifest.permission.BLUETOOTH_SCAN} ,2);
        }
    }


}

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="#E8E8E8">
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/tv_1"
            android:text="物料名称"
            android:textColor="@color/black"
            />
        <EditText
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/et_1"
            android:text="物料名称"
            android:textColor="@color/black"
            />


    </LinearLayout>
    <Button
        android:id="@+id/bt_blt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="打开蓝牙"/>
    <Button
        android:id="@+id/bt_blt2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="关闭蓝牙"/>

    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:id="@+id/tv_2"
        android:text="物料名称"
        android:textColor="@color/black"
        />
    <CheckBox
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/ck_1"
        android:text="测试"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /><!--this的检查项-->
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 以上两行必须同时添加,不然报错 -->

    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.BtPrint"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

标签:UUID,示例,蓝牙,报错,debug,import,android,设备,Log
From: https://www.cnblogs.com/lrzy/p/18151000

相关文章

  • 使用pyppeteer 下载chromium 报错 python pyppeteer 调用谷歌翻译api
    https://registry.npmmirror.com/binary.html?path=chromium-browser-snapshots/Win_x64/手动下载安装包 修改文件C:\Users\luyan\AppData\Local\Programs\Python\Python312\Lib\site-packages\pyppeteer\chromium_downloader.py #修改这段代码defdownload_chromium()-......
  • Python实现批量下载文件的示例代码
    前言下载文件是我们在日常工作中常常要做的一件事情。当我们需要从互联网上批量下载大量文件时,手动一个一个去下载显然不够高效。为了解决这个问题,我们可以使用Python编写一个批量下载文件的脚本,让它自动帮我们下载文件。同时,为了避免下载过程中被网站禁止访问,我们也可以运用代理......
  • DDD领域驱动设计总结和C#代码示例
    DDD(领域驱动设计)是一种软件设计方法,它强调以业务领域为核心来驱动软件的设计和开发。DDD的设计初衷是为了解决复杂业务领域的设计和开发问题,它提供了一套丰富的概念和模式,帮助开发者更好地理解和建模业务领域,从而提高软件的质量和可维护性。一、DDD主要组成DDD的主要模式包......
  • Node.js数电票、全电票查验接口示例、发票查验、票据OCR API
    何为数电票:数电票全称为全面数字化的电子发票,是一种全新的发票形式,与传统的纸质发票具有同等的法律效力,以数字形式存在,不依赖于纸质介质,而数电票的推行旨在提高发票管理效率,降低企业成本,推动税收征管的现代化进程。发票查验的自动化和智能化管理,可以显著减少人工核对发票......
  • mysql添加数据报错
    1452-Cannotaddorupdateachildrow:aforeignkeyconstraintfails('db_student_manager_web'.'s_student',CONSTRAINT'student_clazz_id_foreign'FOREIGNKEY('clazz_id)REFERENCES's_clazz'('id')......
  • k8s node节点报错 dial tcp 127.0.0.1:8080: connect: connection refused
    前言在搭建好kubernetes环境后,master节点拥有control-plane权限,可以正常使用kubectl。但其他node节点无法使用kubectl命令,即使同步过去/root/.kube/config文件到各个node节点上,也不行。解决检查KUBECONFIG变量:确保KUBECONFIG环境变量正确设置。KUBECONFIG......
  • calico配置报错 kubelet.go:2855] "Container runtime network not ready"
    前言配置calico网络插件时,kubectlgetnode报错:NoReadykubectldescribenodenodeName:nodeRoles:<none>Labels:beta.kubernetes.io/arch=amd64beta.kubernetes.io/os=linuxkub......
  • DDD-领域驱动设计示例
    一、DDD概述DDD,即领域驱动设计,核心是不断提炼通用语言并用于与领域专家等团队所有成员交流,并用代码来表达出一个与通用语言一致的领域模型。通用语言:通过团队交流达成共识的能够简单清晰准确传递业务规则的语言(可以是文字、图片等)领域:软件系统要解决的问题域,是有边界的......
  • 5种搭建LLM服务的方法和代码示例
    在不断发展的大型语言模型(LLMs)领域中,用于支持这些模型的工具和技术正以与模型本身一样快的速度进步。在这篇文章中,我们将总结5种搭建开源大语言模型服务的方法,每种都附带详细的操作步骤,以及各自的优缺点。 https://avoid.overfit.cn/post/efad539d0969474987a7ff652f632d8e......
  • DDD领域驱动设计总结和C#代码示例
    DDD(领域驱动设计)是一种软件设计方法,它强调以业务领域为核心来驱动软件的设计和开发。DDD的设计初衷是为了解决复杂业务领域的设计和开发问题,它提供了一套丰富的概念和模式,帮助开发者更好地理解和建模业务领域,从而提高软件的质量和可维护性。一、DDP主要组成DDD的主要模式包括......