Android Studio开发蓝牙应用

Posted 梦见笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);
        activity一、简介

       作为一个纯粹的硬件开发人员,迫不得已开发安卓。前面也花了3天的时候,搭建好了环境,也算是明白了安卓开发的流程。写这个文章的目的也算是做一个小结,给自己一个鞭策,边学习边总结,希望自己能坚持下去。同时也算是通过网络获取资料,然后回报网络的一种方式

       我学习安卓开发的目的主要的,做蓝牙BLE或者WIFI之类的应用。因为我本身是做蓝牙芯片程序开发的,所以不可避免需要开发APP,由于外包,达不到我们的要求同时也不灵活。招人开发成本又巨高,所以不得已而为之

硬件:BT201蓝牙BLE音频模块,芯片选的是KT1025A

二、开发环境的选择

1、开发环境我选的是android studio http://www.android-studio.org/官网下载ide。也就是Android Studio。只用这一个足矣,其他的不需要

 技术图片

2、网上很多各种各样的说法,最后我选择android studio 。唯一的原因,就是这个是google自己的亲儿子,并且会持续的更新,很多的开发者也已经转到这个平台上面来了。所以选择这个没错

3、我这里用的win764的。安装的教程,很多大神都写了很多,这里就不需要多说了。唯一需要说明的是,早期的android studio环境安装,还要单独安装SDK。目前我的用Version3.3.1已经把这些都集成进去了,所以一顺的安装就可以了

4、这里我看过比较好的大神的资料,我都放在这里,详细的,可以去看一下。基本都是关于蓝牙BLE

(1)、基础教程 -- 必看优先看

https://www.cnblogs.com/abao0/archive/2017/06/02/6934023.html--基础教程 -- 必看优先看。包含:环境的搭建、IDE的字体设置、打包APK等等基础类容

(2)Android BLE 蓝牙开发入门 -- 焉工推荐的“android studio蓝牙入门比较好的文章---源码编译不通过,淘汰

https://www.jianshu.com/p/3a372af38103

(3)、简书上面找到的,Android BLE 蓝牙开发入门 --- 编译能过 -- 值得学习20190213

https://www.jianshu.com/p/d991f0fdec63  

三、开发过程中遇到的一些问题

1android studio的工程目录,很多人打开别人的工程的时候,一头雾水,其实网上的大神都有介绍很清楚的文章

https://blog.csdn.net/xhbxhbsq/article/details/54615663 

总之,只用关注“app”这个目录下面的所有文件即可,其他暂时不用看

技术图片
 

2Android studio 如何连接手机进行真机调试

https://blog.csdn.net/qq_41916089/article/details/81044989--使用电脑的模拟器,不能模拟蓝牙

https://blog.csdn.net/qq_35251502/article/details/80770448--使用实际的手机实物模拟

实测我的“VIVO”小米6”都可以

3Android studio 使用windowsPC编译缓慢的解决办法

https://blog.csdn.net/zane_xiao/article/details/72652081   

4、有空录个视频,再详细的总结一下

四、总结

1、虽然在高手看来,这些东西都是不值得一提的,但是我还是想写出来,尤其是初学者,网上的资料又多又杂,再加上安卓确实很复杂

如果没有java基础,基本想动手写程序,没可能

2、我花了三天,才明确这些东西

(1)、选定最终的开发环境

(2)、弄清楚整个的开发流程,以及搜索到我需要的相关的例程。网上的资源太多,需要分辨出适合自己的,真的花很多时间

(3)、网络上下载的很多BLE的源码,都是老版本开发的,基本上编译都编译不过,很多错误,对于新手就很致命了 

 

以上是关于Android Studio开发蓝牙应用的主要内容,如果未能解决你的问题,请参考以下文章

androidstudio没有蓝牙模块

android studio蓝牙传送mp3文件

Android 12 蓝牙适配

开发手机与单片机通过蓝牙模块

Android Studio第三十三期 - 蓝牙开发初识~

android studio 开发蓝牙BLE芯片的APP学习总结第一集