使用蓝牙的简单指南

时间:2018-04-28 18:44:13

标签: java android bluetooth

我有一个应用程序,需要使用蓝牙在设备之间发送4-5号码和2-3文本的数据,但我是java的新手,谷歌开发者页面的指南对我来说有点难以理解。

为了让任何愿意帮助我的人更容易,我会按照我迄今所做的步骤写下来。

1 即可。我在清单中要求权限:

public class LadderEntityBase : ICloneable
{
    public LadderEntityBase(Guid pk)
    {
        PK = pk;
    }

    public LadderEntityBase() : this(Guid.NewGuid())
    {
    }

    public Guid PK { get; set; }
    public string Name { get; set; }
    public string Comment { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();
    }
}

public class Order : LadderEntityBase
{
    public Order() : base()
    {
    }

    public Order(Guid guid) : base(guid)
    {
    }

    public string OrderFrom { get; set; }
}

public class Parcel : LadderEntityBase
{
    public Parcel() : base()
    {
    }

    public Parcel(Guid guid) : base(guid)
    {
    }

    public string SentTo { get; set; }
}

2 即可。我在我的活动中获得了默认适配器:

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

第3 即可。我创建了一个按钮,当单击该按钮时,设备会扫描其他设备:

 final BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();

4 即可。找到设备后,获取设备信息:

bt_scan.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //first checks if bluettoth is enabled
            if (!mBluetoothAdapter.isEnabled()) {
                //if not it enables it 
                Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
            }
             // Register for broadcasts when a device is discovered.
            IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            registerReceiver(mReceiver, filter);
        }
    });

5 即可。在销毁时取消注册ACTION_FOUND接收器:

// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Discovery has found a device. Get the BluetoothDevice
            // object and its info from the Intent.
            BluetoothDevice device = 
 intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            String deviceName = device.getName();
            String deviceHardwareAddress = device.getAddress(); // MAC address
        }
    }
};

6 即可。我创建了第二个按钮,单击该按钮可启用可发现性(必须首先从设备 A 单击,以便扫描按钮在设备 B 中,找到设备 A ):

@Override
protected void onDestroy() {
    super.onDestroy();
    // Don't forget to unregister the *ACTION_FOUND* receiver.
    unregisterReceiver(mReceiver);
}

问题:

A。在步骤 3 REQUEST_ENABLE_BT 是为了什么?

B。这是否需要在两台设备之间建立连接而没有任何问题?

C。如果我想连接两台以上的设备,还有什么我必须添加的吗?

2 个答案:

答案 0 :(得分:1)

问。什么是REQUEST_ENABLE_BT

让我尝试评论代码

// If bluetooth is not switched on
if ( ! mBluetoothAdapter.isEnabled() ) {
    // Create a system request to enable bluetooth
    Intent enableBtIntent = new Intent( BluetoothAdapter.ACTION_REQUEST_ENABLE );
    // Queue the request to pops the bluetooth dialogue
    startActivityForResult( enableBtIntent, REQUEST_ENABLE_BT );
}
// Standby for device found, Bluetooth may still be disabled at this point
IntentFilter filter = new IntentFilter( BluetoothDevice.ACTION_FOUND );
registerReceiver( mReceiver, filter );
// Now that we are done, bluetooth dialogue will popup
// When it's done Android calls our onActivityResult
// (because we queued it with startActivityForResult).

问。这就是我需要建立连接吗?

我认为还有两个步骤需要做:

一个。在步骤3和步骤4之间找到设备。

启用蓝牙并不意味着它会自动扫描附近的设备,因为扫描会耗费电池并降低现有连接的质量。 但是,通过BLUETOOTH_ADMIN权限,您的应用可以启动和停止扫描。 您也可以在不扫描的情况下获得以前配对的设备。

  • 开始扫描:BluetoothAdapter.startDiscovery()
    这将为找到的每个设备调用ACTION_FOUND,这符合您的代码。
  • 配对设备列表:BluetoothAdapter.getBondedDevices()
    以前配对的蓝牙可以在此Set中找到,无需扫描或BLUETOOTH_ADMIN,并且可以直接连接。
    但是,在成功或失败之前,设备是否实际在线是未知的。

B中。建立4到5之间的数据连接。

设备连接类似于连接网络电缆。 计算机与IP物理连接,但您的程序仍需要打开套接字以进行实际数据传输。

  

您似乎想制作一个M2M消息传递应用,因此我已经跳过低功耗蓝牙(BLE)。

问。如果我想连接两个以上的设备,那就是全部吗?

至于&#34;多重连接&#34;部分是关注,不,你不需要做任何特殊的事情来同时连接到多个设备。

&#34;管理&#34;但可以说是困难的部分。 例如,您通常希望保留设备列表,并且具有允许用户有选择地断开设备的UI,所有这些都必须响应意外断开连接或关闭蓝牙(由用户,其他应用程序或通过系统如低功耗模式)。

取决于您实际想要使用蓝牙设备做什么,您可能需要代码来记住每个人的状态。 再次进行错误处理。

所以,确实期望最终的代码会更加发达。

答案 1 :(得分:0)

我想回答问题A

:一种。在步骤3中REQUEST_ENABLE_BT用于什么?

private static final int REQUEST_ENABLE_BT = 1;

REQUEST_ENABLE_BT 只是一个标识您的请求的整数值。当您收到结果Intent时,回调onActivityResult(int requestCode, int resultCode, Intent data)会向您提供相同的请求代码。通过这种方式,您可以处理来自其他活动的结果

假设您已经请求启用蓝牙的活动A

Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);

当设备的蓝牙启用时,将在活动A 上调用方法onActivityResult(int requestCode, int resultCode, Intent data)。此方法onActivityResult()是一种回调方法。蓝牙启用后,此方法会将请求代码传递回调用活动(活动A )。您必须在活动A 中覆盖此方法才能处理结果。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
    if(requestCode == REQUEST_ENABLE_BT)
        Log.d("BLUETOOTH", "Successfully enabled");

}