Android 蓝牙本地名称获取流程

一、蓝牙名称获取

AdapterService.java (packages\apps\bluetooth\src\com\android\bluetooth\btservice)

static final int BT_PROPERTY_BDNAME = 0x01;
    static final int BT_PROPERTY_BDADDR = 0x02;
    public void onCreate() {
    
    
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDADDR);
        getAdapterPropertyNative(AbstractionLayer.BT_PROPERTY_BDNAME);
        	int ret = sBluetoothInterface->get_adapter_property((bt_property_type_t) type);
			    bluetoothInterface,
			    	get_adapter_property,
			    		 btif_get_adapter_property(type);
			    		 btif_transfer_context(execute_storage_request,
				                 BTIF_CORE_STORAGE_ADAPTER_READ,  (char*)&req, sizeof(btif_storage_req_t), NULL);  // call execute_storage_request
				            case BTIF_CORE_STORAGE_ADAPTER_READ:
				                btif_storage_get_adapter_property(&prop);
				                	btif_dm_get_adapter_property(property);
				                	case BT_PROPERTY_BDNAME:
								         bt_bdname_t *bd_name = (bt_bdname_t*)prop->val;
								         strcpy((char *)bd_name->name, btif_get_default_local_name()); // 获取名字
				                HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop); //回到到应用层

下面我们主要看下名字代码的获取:
btif_dm.c (external\bluetooth\bluedroid\btif\src)

static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {
    
    '\0'};
static char* btif_get_default_local_name() {
    
    
    if (btif_default_local_name[0] == '\0')
    {
    
    
        int max_len = sizeof(btif_default_local_name) - 1;
        if (BTM_DEF_LOCAL_NAME[0] != '\0')
        {
    
    
            strncpy(btif_default_local_name, BTM_DEF_LOCAL_NAME, max_len);
        }
        else
        {
    
    
            char prop_model[PROPERTY_VALUE_MAX];
            property_get(PROPERTY_PRODUCT_MODEL, prop_model, "");
            strncpy(btif_default_local_name, prop_model, max_len);
        }
        btif_default_local_name[max_len] = '\0';
    }
    return btif_default_local_name;
}

二、蓝牙名称显示设置

HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop); 
	static bt_callbacks_t sBluetoothCallbacks
	    adapter_properties_callback,
	    	 callbackEnv->CallVoidMethod(sJniCallbacksObj,   method_adapterPropertyChangedCallback, types,                          props);
	    	 mAdapterProperties.adapterPropertyChangedCallback(types, val);
	    	 case AbstractionLayer.BT_PROPERTY_BDNAME:
	              mName = new String(val);
	              intent = new Intent(BluetoothAdapter.ACTION_LOCAL_NAME_CHANGED);
	              intent.putExtra(BluetoothAdapter.EXTRA_LOCAL_NAME, mName);
	              intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
	              mService.sendbroadcastAsUser(intent, UserHandle.ALL, mService.BLUetoOTH_PERM);

三、蓝牙名称修改方案

//修改蓝牙默认名称的3种方法
 
//方法一:
//system/bt/btif/src/btif_dm.c文件中,btif_default_local_name []数组的默认定义为空,如下:
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {
    
    '\0'};

//修改为需要客制化的名称,例如:Bluetooth
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = "Bluetooth";

 
//方法二:
//前提条件:
btif_default_local_name [] 数组的默认定义为空
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {
    
    '\0'};

 
//修改方法(1):修改/device/generic/common/bluetooth/bdroid_buildcfg.h文件中的蓝牙名称宏定义BTM_DEF_LOCAL_NAME  
#ifndef _BDROID_BUILDCFG_H
#define _BDROID_BUILDCFG_H
#define BTM_DEF_LOCAL_NAME   "Android Bluedroid" //修改此处为自己需要的蓝牙默认名称
#endif


//方法三:
//前提条件:
(1) btif_default_local_name [] 数组的默认定义为空
static char btif_default_local_name[DEFAULT_LOCAL_NAME_MAX+1] = {
    
    '\0'};
(2) /system/bt/include/bt_target.h文件中的蓝牙名称宏定义BTM_DEF_LOCAL_NAME为空
#ifndef BTM_DEF_LOCAL_NAME
#define BTM_DEF_LOCAL_NAME      "" //修改此处为空
#endif
(3) /device/generic/common/bluetooth/bdroid_buildcfg.h文件中的蓝牙名称宏定义BTM_DEF_LOCAL_NAME为空
#ifndef _BDROID_BUILDCFG_H
#define _BDROID_BUILDCFG_H
#define BTM_DEF_LOCAL_NAME   "" //修改此处为空
#endif

//修改方法:
//满足上面的前置条件,此时默认的蓝牙名称会读取 ro.product.model 属性值作为蓝牙默认名称;
//在文件/system/bt/btif/src/btif_dm.c中已经定义:

#define PROPERTY_PRODUCT_MODEL "ro.product.model"

//在custom.conf文件通过bluetooth.HostName [email protected]@ 来指定默认的蓝牙;
//该property值的设置在:/device/mediatek/k35v1_64_op09_6m/custom.conf //k35v1_64_op09_6m为项目的名称
//bluetooth.HostName = @ro.product.model@
//原理分析:/system/bt/btif/src/btif_dm.c
static char* btif_get_default_local_name() {
    
    
    if (btif_default_local_name[0] == '\0')  // 方法一
    {
    
    
        int max_len = sizeof(btif_default_local_name) - 1;
        if (BTM_DEF_LOCAL_NAME[0] != '\0')  //  方法二
        {
    
    
            strncpy(btif_default_local_name, BTM_DEF_LOCAL_NAME, max_len);
        }
        else
        {
    
    
            char prop_model[PROPERTY_VALUE_MAX]; // 方法三
            property_get(PROPERTY_PRODUCT_MODEL, prop_model, "");
            strncpy(btif_default_local_name, prop_model, max_len);
        }
        btif_default_local_name[max_len] = '\0';
    }
    return btif_default_local_name;
}

猜你喜欢

转载自blog.csdn.net/franc521/article/details/130136651