利用蓝牙广播数据

一个Activity搞定.

在自定义一个myAppliction继承系统的Appliction,我在onCreate()里进行自动开启蓝牙.

public class MyApplication extends Application {
@Override
public void onCreate() {
    super.onCreate();
    BluetoothAdapter blueadapter = BluetoothAdapter.getDefaultAdapter();
    if(blueadapter!=null) {  //Device support Bluetooth
        //确认开启蓝牙
        if (!blueadapter.isEnabled()) {
            //直接开启,不经过提示
            blueadapter.enable();
        }
    }

MainActivity 里面的代码.

public class MainActivityextends AppCompatActivity{
private BluetoothAdapter mBluetoothAdapter;
private static final String TAG = "bleperipheral";
private static final String HEART_RATE_SERVICE = "0000180d-0000-1000-8000-00805f9b34fb"; 
private BluetoothLeAdvertiser mBluetoothLeAdvertiser;
//回调
private AdvertiseCallback mAdvertiseCallback = new AdvertiseCallback() {
    @Override
    //成功
    public void onStartSuccess(AdvertiseSettings settingsInEffect) {
        super.onStartSuccess(settingsInEffect);
        if (settingsInEffect != null) {
            Log.d(TAG, "onStartSuccess TxPowerLv=" + settingsInEffect.getTxPowerLevel() + " mode=" + settingsInEffect.getMode()
                    + " timeout=" + settingsInEffect.getTimeout());
        } else {
            Log.e(TAG, "onStartSuccess, settingInEffect is null");
        }
        Log.e(TAG, "onStartSuccess settingsInEffect" + settingsInEffect);
    }
    //失败
    @Override
    public void onStartFailure(int errorCode) {
        super.onStartFailure(errorCode);
        Log.e(TAG, "onStartFailure errorCode" + errorCode);//返回的错误码
        if (errorCode == ADVERTISE_FAILED_DATA_TOO_LARGE) {
            Toast.makeText(Utils.getContext(), "广播开启错误,数据大于31个字节", Toast.LENGTH_LONG).show();
            Log.e(TAG, "广播开启错误,数据大于31个字节");
        } else if (errorCode == ADVERTISE_FAILED_TOO_MANY_ADVERTISERS) {

            Toast.makeText(Utils.getContext(), "未能开始广播,没有广播实例", Toast.LENGTH_LONG).show();
            Log.e(TAG, "未能开始广播,没有广播实例");

        } else if (errorCode == ADVERTISE_FAILED_ALREADY_STARTED) {

            Toast.makeText(Utils.getContext(), "正在连接的,无法再次连接", Toast.LENGTH_LONG).show();
            Log.e(TAG, "正在连接的,无法再次连接");

        } else if (errorCode == ADVERTISE_FAILED_INTERNAL_ERROR) {

            Toast.makeText(Utils.getContext(), "由于内部错误操作失败", Toast.LENGTH_LONG).show();
            Log.e(TAG, "由于内部错误操作失败");

        } else if (errorCode == ADVERTISE_FAILED_FEATURE_UNSUPPORTED) {

            Toast.makeText(Utils.getContext(), "在这个平台上不支持此功能", Toast.LENGTH_LONG).show();
            Log.e(TAG, "在这个平台上不支持此功能");
        }
    }
};@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    init();
 }
 //初始化数据
    private void init() {
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) {
            Toast.makeText(this, "不支持", Toast.LENGTH_LONG).show();
            finish();
        }
        final BluetoothManager mBluetoothManager = (BluetoothManager) getSystemService(BLUETOOTH_SERVICE);
        mBluetoothAdapter = mBluetoothManager.getAdapter();

        if (mBluetoothAdapter == null) {
            Toast.makeText(this, "未配对蓝牙", Toast.LENGTH_LONG).show();
            finish();
        }
        mBluetoothLeAdvertiser = mBluetoothAdapter.getBluetoothLeAdvertiser();//判断你的设备到底支持不支持BLE Peripheral。假如此返回值非空,你才可以继续有机会开发
        if (mBluetoothLeAdvertiser == null) {
            Toast.makeText(this, "不支持BLE Peripheral", Toast.LENGTH_SHORT).show();
            Log.e(TAG, "不支持BLE Peripheral");
            finish();
        }

        //开启蓝牙广播  一个是广播设置参数,一个是广播数据,还有一个是Callback
        mBluetoothLeAdvertiser.startAdvertising(createAdvSettings(true, 0), createAdvertiseData(), mAdvertiseCallback);
        Toast.makeText(Utils.getContext(), "开启广播", Toast.LENGTH_LONG).show();
        Log.e(TAG, "开启广播");
    }

    /**
     * 初始化蓝牙类
     * AdvertisingSettings.Builder 用于创建AdvertiseSettings
     * AdvertiseSettings中包含三种数据:AdvertiseMode, Advertise TxPowerLevel和AdvertiseType,其测试结果如下:
     * AdvertiseMode:
     * Advertise Mode                           Logcat频率                   检测到的频率
     * ADVERTISE_MODE_LOW_LATENCY          1/1600 milliseconds                1/1068 milliseconds
     * ADVERTISE_MODE_BALANCED             1/400 milliseconds                 1/295 milliseconds
     * ADVERTISE_MODE_LOW_POWER            1/160 milliseconds                 1/142 milliseconds
     */
    public static AdvertiseSettings createAdvSettings(boolean connectable, int timeoutMillis) {
        //设置广播的模式,应该是跟功耗相关
        AdvertiseSettings.Builder mSettingsbuilder = new AdvertiseSettings.Builder();
        mSettingsbuilder.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED);
        mSettingsbuilder.setConnectable(connectable);
        mSettingsbuilder.setTimeout(timeoutMillis);
        mSettingsbuilder.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH);
        AdvertiseSettings mAdvertiseSettings = mSettingsbuilder.build();
        if (mAdvertiseSettings == null) {
            Toast.makeText(Utils.getContext(), "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();
            Log.e(TAG, "mAdvertiseSettings == null");
        }
        return mAdvertiseSettings;
    }

    //设置一下FMP广播数据
    public static AdvertiseData createAdvertiseData() {
        AdvertiseData.Builder mDataBuilder = new AdvertiseData.Builder();
        // mDataBuilder.addServiceUuid(ParcelUuid.fromString(HEART_RATE_SERVICE));
        //添加的数据
        mDataBuilder.addServiceData(ParcelUuid.fromString(HEART_RATE_SERVICE), "eeeeeeeeee".getBytes());
        AdvertiseData mAdvertiseData = mDataBuilder.build();
        if (mAdvertiseData == null) {
            Toast.makeText(Utils.getContext(), "mAdvertiseSettings == null", Toast.LENGTH_LONG).show();
            Log.e(TAG, "mAdvertiseSettings == null");
        }
        return mAdvertiseData;
    }

   //注销
  @Override
    protected void onDestroy() {
    super.onDestroy();
    Toast.makeText(Utils.getContext(), "停止广播", Toast.LENGTH_LONG).show();
    Log.e(TAG, "停止广播");
    //停止蓝牙广播
    stopAdvertise();
}
private void stopAdvertise() {
if (mBluetoothLeAdvertiser != null) { 
mBluetoothLeAdvertiser.stopAdvertising(mAdvertiseCallback);  
 mBluetoothLeAdvertiser = null; 
Log.e(TAG, "停止广播");
}}
//添加权限
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

//收工

demo下载地址      https://download.csdn.net/download/qq_36665856/10396723

猜你喜欢

转载自blog.csdn.net/qq_36665856/article/details/64919431