手机必须支持蓝牙4.0(BLE)
完整代码:
package com.example.gemall.myapplication; import android.app.Activity; import android.bluetooth.BluetoothManager; import android.bluetooth.le.AdvertiseCallback; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertiseSettings; import android.bluetooth.le.BluetoothLeAdvertiser; import android.content.Context; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.Toast; public class MainActivity extends Activity { AdvertiseCallback mAdvertiseCallback; BluetoothLeAdvertiser mLeAdvertiser; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText( this , "设备不支持蓝牙4.0" , Toast.LENGTH_SHORT).show(); finish(); } startAdvertising("E2C56DB5-DFFB-48D2-B060-D0F5A71096E0",123,456); } private void startAdvertising(String uuid, int major, int minor) { mLeAdvertiser = ((BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE)).getAdapter().getBluetoothLeAdvertiser(); if(mLeAdvertiser == null) { Toast.makeText(this,"不支持广播",Toast.LENGTH_LONG).show(); return; } AdvertiseSettings.Builder mLeAdvSettingsBuilder = new AdvertiseSettings.Builder().setTxPowerLevel(0x3); mLeAdvSettingsBuilder.setAdvertiseMode(0x0); mLeAdvSettingsBuilder.setConnectable(true); AdvertiseData.Builder mLeAdvDataBuilder = new AdvertiseData.Builder(); String[] uuidstr = uuid.replaceAll("-", "").toLowerCase().split(""); byte[] uuidBytes = new byte[16]; for (int i = 1,x=0; i < uuidstr.length;x++) { uuidBytes[x] = (byte) ((Integer.parseInt(uuidstr[i++], 16)<<4) | Integer.parseInt(uuidstr[i++], 16)); } byte[] majorBytes = {(byte) (major>>8), (byte) (major&0xff)}; byte[] minorBytes = {(byte) (minor>>8), (byte) (minor&0xff)}; byte[] mPowerBytes = {-0x41}; byte[] mServiceData = new byte[0x17]; byte[] flagibeacon = {0x02, 0x15};
System.arraycopy(flagibeacon, 0x0, mServiceData, 0x0, 0x2); System.arraycopy(uuidBytes, 0x0, mServiceData, 0x2, 0x10); System.arraycopy(majorBytes, 0x0, mServiceData, 0x12, 0x2); System.arraycopy(minorBytes, 0x0, mServiceData, 0x14, 0x2); System.arraycopy(mPowerBytes, 0x0, mServiceData, 0x16, 0x1); mLeAdvDataBuilder.addManufacturerData(0x4c, mServiceData); mAdvertiseCallback = createAdvertiseCallback(); mLeAdvertiser.startAdvertising(mLeAdvSettingsBuilder.build(), mLeAdvDataBuilder.build(), mAdvertiseCallback); } private AdvertiseCallback createAdvertiseCallback() { return new AdvertiseCallback() { public void onStartSuccess(AdvertiseSettings settingsInEffect) { System.out.print( settingsInEffect); } public void onStartFailure(int errorCode) { String description = ""; if(errorCode == 0x5) { } else if(errorCode == 0x2) { } else if(errorCode == 0x3) { } else if(errorCode == 0x1) { } else if(errorCode == 0x4) { } else { } System.out.print("onFailure error:" + errorCode + " " + description); } }; } }