蓝牙通信测试app之蓝牙配对(一)

蓝牙配对开发流程

流程是:开启蓝牙 —-》 获取蓝牙各种权限 —-》注册广播(广播的作用是用来接收扫描结果) —-》 扫描蓝牙 —-》广播接收 ——》 蓝牙配对 —-》 解除注册

开启蓝牙

  • 获取BluetoothAdapter对象
  • 判断设备是否支持蓝牙
  • 打开蓝牙
// 获取BluetoothAdapter对象
private BluetoothAdapter mBluetoothAdapter;
   
 private void checkBluetoohStatus() {
	mBluetoothAdapter =   BluetoothAdapter.getDefaultAdapter();
	// 判断设备是否支持蓝牙
	if (mBluetoothAdapter == null) {
		Toast.makeText(BluetoothShowActivity.this, "设备不支持蓝牙", Toast.LENGTH_SHORT).show();
		finish();
		return;
	}
    // 判读是否打开了蓝牙(蓝牙会弹出提示)
    if(!mBluetoothAdapter.isEnabled())
    {
        Intent turnOn=new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(turnOn,-1);
    }
//   // 判读是否打开了蓝牙(蓝牙不会弹出提示)
//    if (isSupportBlue()) {
//        mBluetoothAdapter.enable();
//    }

}

申请权限

  • 在 AndroidManifest.xml 里添加权限

    • 处理6.0以下版本的权限: 在AndroidManifest里面添加权限

      <!-- 使用蓝牙的权限 -->
      <uses-permission android:name="android.permission.BLUETOOTH" />
      <!-- 扫描蓝牙设备或者操作蓝牙设置 -->
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
      
    • 处理6.0以上版本的权限: 在AndroidManifest里面添加权限

      <!-- 使用蓝牙的权限 -->
      <uses-permission android:name="android.permission.BLUETOOTH" />
      <!-- 扫描蓝牙设备或者操作蓝牙设置 -->
      <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
      <!--模糊定位权限,仅作用于6.0+-->
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <!--精准定位权限,仅作用于6.0+-->
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      
  • 获取权限

// 申请请求许可权限
private void getBluePermission() {
    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);
        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.READ_CONTACTS)) {
            Toast.makeText(this, "shouldShowRequestPermissionRationale", Toast.LENGTH_SHORT).show();
        }
    }
}

/**
 * 解决:无法发现蓝牙设备的问题
 *
 * 对于发现新设备这个功能, 还需另外两个权限(Android M 以上版本需要显式获取授权,附授权代码):
 */
private final int ACCESS_LOCATION=1;
@SuppressLint("WrongConstant")
private void getPermission() {
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
        int permissionCheck = 0;
        permissionCheck = this.checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
        permissionCheck += this.checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION);

        if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            //未获得权限
            this.requestPermissions( // 请求授权
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION,
                            Manifest.permission.ACCESS_COARSE_LOCATION}, ACCESS_LOCATION);// 自定义常量,任意整型
        }
    }
}

/**
 * 请求权限的结果回调。每次调用 requestpermissions(string[],int)时都会调用此方法。
 * @param requestCode 传入的请求代码
 * @param permissions 传入permissions的要求
 * @param grantResults 相应权限的授予结果:PERMISSION_GRANTED 或 PERMISSION_DENIED
 */
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case ACCESS_LOCATION:
            if (hasAllPermissionGranted(grantResults)) {
                Log.i(TAG, "onRequestPermissionsResult: 用户允许权限");
            } else {
                Log.i(TAG, "onRequestPermissionsResult: 拒绝搜索设备权限");
            }
            break;
    }
}

private boolean hasAllPermissionGranted(int[] grantResults) {
    for (int grantResult : grantResults) {
        if (grantResult == PackageManager.PERMISSION_DENIED) {
            return false;
        }
    }
    return true;
}

注册广播和接收广播

注册 :蓝牙状态改变的广播 和 蓝牙扫描设备时的广播。

/**
 * 注册蓝牙广播
 */
private void registerBroadcast(){
    //监听蓝牙状态改变的广播
    IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
    registerReceiver(receiver, filter);
    //监听蓝牙设备扫描的广播
    mBlueToothReceiver = new BluetoothReceiver();
    IntentFilter mIntentFilter = new IntentFilter();
        // 扫描到设备的广播
    mIntentFilter.addAction(BluetoothDevice.ACTION_FOUND);
    	// 扫描结束的广播
    mIntentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    mIntentFilter.setPriority(Integer.MAX_VALUE);
        // 注册广播
    registerReceiver(mBlueToothReceiver,mIntentFilter);
}

接收:蓝牙状态改变的广播:

// 这个当蓝牙状态改变时,就会进入
private BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, 1);
        switch (state) {
            case BluetoothAdapter.STATE_OFF:
                // 吐丝弹窗
                Toast.makeText(BluetoothShowActivity.this, "蓝牙已关闭", Toast.LENGTH_SHORT).show();
                break;
            case BluetoothAdapter.STATE_ON:
                Toast.makeText(BluetoothShowActivity.this, "蓝牙已打开", Toast.LENGTH_SHORT).show();
                break;
        }
    }
};

接收:蓝牙扫描设备时的广播:

public class BluetoothReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent ) {
        String action = intent.getAction();
        // 判断是扫描的哪个状态
        if(BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra( BluetoothDevice.EXTRA_DEVICE );
            // 这是listview视图,添加适配器
            listView.setAdapter(mBluetoothDeviceAdapter);
            // 将设备放到添加到适配器中
            mBluetoothDeviceAdapter.addDevice(device);
            // 数据改变并更新列表
            mBluetoothDeviceAdapter.notifyDataSetChanged();
        }else if(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){
            // 关闭进度条
            progressDialog.dismiss();
            Toast.makeText(BluetoothShowActivity.this, "搜索完成", Toast.LENGTH_SHORT).show();
        }
    }
}

扫描蓝牙

/**
 * 搜索蓝牙
 */
private void searchBluetooth() {
    mBluetoothAdapter =   BluetoothAdapter.getDefaultAdapter();
    //清除适配器的内容,以便从新搜索
    mBluetoothDeviceAdapter.clear();
    mBluetoothDeviceAdapter.notifyDataSetChanged();
    // 如果已经在搜索了,那么取消搜索(主要)
    if(mBluetoothAdapter.isDiscovering()){
        mBluetoothAdapter.cancelDiscovery();
    }
    // 寻找所有蓝牙设备(主要)
    mBluetoothAdapter.startDiscovery();
    //开启进度条
    if (progressDialog == null) {
        progressDialog = new ProgressDialog(BluetoothShowActivity.this);
    }
//        progressDialog.setCanceledOnTouchOutside(false); //实现点击外部不消失。
    progressDialog.setMessage("正在搜索中,请稍候...");
    progressDialog.show();
}

蓝牙配对

// listview视图里的单个对象点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        // 是否在扫描
        if (mBluetoothAdapter.isDiscovering()) {
            // 取消扫描
            mBluetoothAdapter.cancelDiscovery();
        }
        try {
            // 通过点击对象的位置,获取蓝牙设备
            BluetoothDevice device = mBluetoothDeviceAdapter.getDevice(position);
            Method createBondMethod;
            Boolean returnValue = false;
            // 还没有配对的进入该方法
            if(device.getBondState() == BluetoothDevice.BOND_NONE) {
                // 反射方法调用;
                createBondMethod = BluetoothDevice.class .getMethod("createBond");
                // 与设备建立连接
                returnValue = (Boolean) createBondMethod.invoke(device);
                // 更新当前被选中的位置
                Constant.CURREN_POSITION = position;
                // 刷新 ListView
                mBluetoothDeviceAdapter.notifyDataSetChanged();
            }
            // 如果和该蓝牙设备已经配对
            else if(device.getBondState() == BluetoothDevice.BOND_BONDED){
                // 获取蓝牙设备的地址
                String address= device.getAddress();
                Intent intent =new Intent(BluetoothShowActivity.this,MainActivity.class);
                intent.putExtra(EXTRA_DEVICE_ADDRESS,address);
                // 将蓝牙设备地址返回到 MainActivity.class
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});

解除注册广播

@Override
protected void onDestroy() {
    super.onDestroy();//解除注册
    unregisterReceiver(receiver);
    unregisterReceiver(mBlueToothReceiver);
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android蓝牙通信APP是一种用于在Android手机上实现蓝牙通信的应用程序。通过该应用程序,用户可以方便地与其他支持蓝牙功能的设备进行数据传输和通信。 Android蓝牙通信APP可以用于多种场景,比如蓝牙耳机、蓝牙音箱、蓝牙打印机等设备的连接和控制。用户可以通过该应用程序连接并配对这些蓝牙设备,并实现数据的传输和通话功能。此外,用户还可以通过该应用程序与其他手机或平板电脑进行蓝牙文件传输,快速共享照片、音乐、视频等多媒体文件。 Android蓝牙通信APP具有简单易用的用户界面,用户可以通过该界面进行设备的搜索和选择、配对、连接和断开连接等操作。同时,该应用程序还提供了简单的设置选项,用户可以根据自己的需求调整连接方式和传输速度等参数。 此外,Android蓝牙通信APP还支持多种蓝牙通信协议,比如串行端口协议(SPP)、对象交换协议(OBEX)等,用户可以根据实际需要选择合适的协议进行通信。同时,该应用程序还支持多种数据格式的传输,包括文本、图片、音频、视频等,用户可以根据实际需求选择合适的数据格式进行传输。 总之,Android蓝牙通信APP是一种方便实用的应用程序,通过它,用户可以轻松地实现与其他蓝牙设备的连接和通信,满足各种数据传输和通话的需求。 ### 回答2: Android蓝牙通信app是一种用于Android设备的应用程序,用于在不同设备之间进行蓝牙通信。通过蓝牙通信,用户可以实现文件传输、语音通话、数据同步等功能。 该app的主要功能包括: 1. 设备搜索和配对:用户可以使用该app搜索附近的蓝牙设备,并与选定的设备进行配对配对后,设备之间可以建立蓝牙连接。 2. 文件传输:用户可以使用该app从一个设备向另一个设备发送文件。通过选择要发送的文件,并选择接收设备,用户可以快速实现文件共享。 3. 语音通话:用户可以使用该app配对设备进行蓝牙语音通话。这对于在没有手机网络信号的地方或需要保持静音的环境中进行通话非常有用。 4. 数据同步:用户可以使用该app将设备之间的数据进行同步。例如,可以将联系人、日历等信息从一个设备传输到另一个设备。 该app还可以通过添加更多功能来扩展其功能,例如蓝牙打印、蓝牙键盘控制等。 总结来说,Android蓝牙通信app可以使用户在Android设备之间实现快速、便捷、安全的蓝牙通信,从而满足用户的不同需求。 ### 回答3: Android蓝牙通信app是一款在Android操作系统上运行的应用程序,用于实现设备间的蓝牙通信蓝牙通信是一种无线通信技术,可以用于设备之间的数据传输和交互。 Android蓝牙通信app可以通过蓝牙模块与其他支持蓝牙协议的设备进行通信,如蓝牙耳机、蓝牙音箱、蓝牙打印机等。它具有以下功能和特点: 1. 连接设备:通过蓝牙搜索功能,找到附近的蓝牙设备并与其建立连接。这样,用户可以在Android设备上与其他设备进行数据传输和控制。 2. 发送和接收数据:Android蓝牙通信app可以发送任意类型的数据,如文本、图片、音乐等。同时,它也可以接收其他设备发送的数据,并进行处理和展示。 3. 文件传输:通过蓝牙通信app,用户可以将本地的文件发送给其他设备,也可以接收其他设备发送的文件。这样,用户可以方便地在设备间共享数据和文件。 4. 远程控制:Android蓝牙通信app还可以实现蓝牙设备的远程控制。例如,用户可以通过连接蓝牙耳机来控制音乐播放,或者通过连接蓝牙游戏手柄来进行游戏操作。 5. 简单易用:Android蓝牙通信app通常具有简洁直观的用户界面,用户可以轻松地完成各种操作,如连接设备、发送数据和文件,以及远程控制设备等。 总结来说,Android蓝牙通信app为用户提供了一种便捷的方式来实现设备间的蓝牙通信。通过它,用户可以方便地进行数据传输、文件共享和远程控制等操作,丰富了手机和其他蓝牙设备之间的互动方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值