基于android studio3.0编写的蓝牙串口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于android studio3.0编写的蓝牙串口相关的知识,希望对你有一定的参考价值。
基于android studio3.0编写的蓝牙串口
参考技术A ndroid是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改良Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。 2013年的第四季度,Android平台手机的全球市场份额已经达到78.1%。[1]2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经达到10亿台。Android Studio开发蓝牙应用
Android Studio开发蓝牙应用(一)
环境
- window 11
- 安卓12
- HC-06蓝牙模块
创建空project
-
选择Empty Activity,后点击Next
-
可修改项目名,自定义,后点击Finish即可。
-
首先设计布局,布局文件位于app/src/main/res/layout下
-
直接使用约束布局方式,这种方式布局代码大部分可自动生成,方便
- 项目实现的功能
- 查看手机是否支持蓝牙
- 查看当前蓝牙状态
- 蓝牙开关
- 使蓝牙可见
- 搜索可见蓝牙
- 查看已绑定的设备
- 项目实现的功能
- Acitivity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/button3"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="是否支持蓝牙"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button4"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="当前蓝牙状态"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toTopOf="parent" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintGuide_begin="205dp" />
<Button
android:id="@+id/button7"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="打开蓝牙"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button3" />
<Button
android:id="@+id/button8"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="关闭蓝牙"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toBottomOf="@+id/button4" />
<Button
android:id="@+id/button9"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="使蓝牙可见"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button7" />
<Button
android:id="@+id/button10"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="搜索可见蓝牙"
app:layout_constraintEnd_toStartOf="@+id/guideline2"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button9" />
<Button
android:id="@+id/button11"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="查看已绑定蓝牙"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="@+id/guideline2"
app:layout_constraintTop_toBottomOf="@+id/button9" />
<ListView
android:id="@+id/listview1"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="#00BCD4"
android:gravity="center"
android:text="蓝牙列表"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button10" />
</androidx.constraintlayout.widget.ConstraintLayout>
蓝牙权限问题
安卓12对蓝牙权限做了改动,且需要动态获取权限
- 首先在app/src/main/AndroidManifest.xml中添加权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.btapp">
<!-- 先前的蓝牙权限需求-->
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<!-- 安卓12新增的蓝牙权限-->
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<!-- 定位权限, 蓝牙搜索需要-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.BTapp">
<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>
- 在MainActivity.java中实现动态申请权限,在执行蓝牙相关函数时执行getPermission函数
public class MainActivity extends AppCompatActivity
private static final int REQ_PERMISSION_CODE = 1;
// 蓝牙权限列表
public ArrayList<String> requestList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 动态申请权限
*/
public void getPermision()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
requestList.add(Manifest.permission.BLUETOOTH_SCAN);
requestList.add(Manifest.permission.BLUETOOTH_ADVERTISE);
requestList.add(Manifest.permission.BLUETOOTH_CONNECT);
requestList.add(Manifest.permission.ACCESS_FINE_LOCATION);
requestList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
requestList.add(Manifest.permission.BLUETOOTH);
if(requestList.size() != 0)
ActivityCompat.requestPermissions(this, requestList.toArray(new String[0]), REQ_PERMISSION_CODE);
实机测试
实机测试时若提示安装包异常,则在项目的gradle.properties后添加
android.injected.testOnly=false
功能实现
- 在app/src/main/java/com.example.btapp内新建蓝牙控制器类BlueToothController.java
- 获取蓝牙适配器类BlueToothAdpter
public class BlueToothController
// 成员变量
private BluetoothAdapter mAdapter;
/**
* 构造函数
*/
public BlueToothController()
// 获取本地的蓝牙适配器
mAdapter = BluetoothAdapter.getDefaultAdapter();
- 查看是否支持蓝牙
public boolean isSupportBlueTooth()
// 若支持蓝牙,则本地适配器不为null
if(mAdapter != null)
return true;
// 否则不支持
else
return false;
在 MainActivity.java中绑定对应功能
package com.example.btapp;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity
private static final int REQ_PERMISSION_CODE = 1;
// 实例化蓝牙控制器
public BlueToothController btController = new BlueToothController();
// 实例化蓝牙控制器
public BlueToothController btController = new BlueToothController();
// 弹窗
private Toast mToast;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 通过id获取“是否支持蓝牙”按钮
Button button_1 = (Button) findViewById(R.id.button3);
// 绑定按钮点击事件处理函数
button_1.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
// 获取蓝牙权限
getPermision();
// 判断是否支持蓝牙
boolean ret = btController.isSupportBlueTooth();
// 弹窗显示结果
showToast("是否支持蓝牙" + ret);
);
/**
* 动态申请权限
*/
public void getPermision()
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
requestList.add(Manifest.permission.BLUETOOTH_SCAN);
requestList.add(Manifest.permission.BLUETOOTH_ADVERTISE);
requestList.add(Manifest.permission.BLUETOOTH_CONNECT);
requestList.add(Manifest.permission.ACCESS_FINE_LOCATION);
requestList.add(Manifest.permission.ACCESS_COARSE_LOCATION);
requestList.add(Manifest.permission.BLUETOOTH);
if(requestList.size() != 0)
ActivityCompat.requestPermissions(this, requestList.toArray(new String[0]), REQ_PERMISSION_CODE);
/**
* Toast弹窗显示
* @param text 显示文本
*/
public void showToast(String text)
// 若Toast控件未初始化
if( mToast == null)
// 则初始化
mToast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
// 否则
else
// 修改显示文本
mToast.setText(text);
// 显示
mToast.show();
- 判断当前蓝牙状态
/**
* 判断当前蓝牙状态
* @return true为打开,false为关闭
*/
public boolean getBlueToothStatus()
// 断言,为了避免mAdapter为null导致return出错
assert (mAdapter != null);
// 蓝牙状态
return mAdapter.isEnabled();
绑定功能
// 通过id获取“当前蓝牙状态”按钮
Button button_2 = (Button) findViewById(R.id.button4);
// 绑定按钮点击事件处理函数
button_2.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
// 获取蓝牙权限
getPermision();
// 判断当前蓝牙状态
boolean ret = btController.getBlueToothStatus();
// 弹窗显示结果
showToast("当前蓝牙状态:" + ret);
);
- 打开蓝牙
/**
* 打开蓝牙
*/
public boolean turnOnBlueTooth(Activity activity, int requestCode)
if(!mAdapter.isEnabled())
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
activityAndroid Studio3.0 配置ButterKnife出错的解决
Android Studio3.0 配置AndroidAnnotation注解框架
Android Studio3.0配置Butterknife8.8.1及大坑
android studio3.0.1 的build下没有generate signer apk 选项?
Android Studio3.0 flavorDimensions多维度理解(版本差异化打包) : flavorDimensions dimension
Android Studio3.0 flavorDimensions多维度理解(版本差异化打包) : flavorDimensions dimension