记录android 8设置蓝牙名称的流程。



packages/apps/Settings/src/com/android/settings/bluetooth/BluetoothDeviceRenamePreferenceController.java
显示更改框
@Override
public boolean handlePreferenceTreeClick(Preference preference) {
if (PREF_KEY.equals(preference.getKey())) {
mMetricsFeatureProvider.action(mContext,
MetricsProto.MetricsEvent.ACTION_BLUETOOTH_RENAME);
LocalDeviceNameDialogFragment.newInstance()
.show(mFragment.getFragmentManager(), LocalDeviceNameDialogFragment.TAG);
return true;
} return false;
} packages/apps/Settings/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragment.java
public class LocalDeviceNameDialogFragment extends BluetoothNameDialogFragment {
public static final String TAG = "LocalAdapterName";
private LocalBluetoothAdapter mLocalAdapter; //对话框的title, Rename this device
@Override
protected int getDialogTitle() {
return R.string.bluetooth_rename_device;
} 更改确认按键在父类中实现。 abstract class BluetoothNameDialogFragment extends InstrumentedDialogFragment
implements TextWatcher { @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
String deviceName = getDeviceName();
if (savedInstanceState != null) {
deviceName = savedInstanceState.getString(KEY_NAME, deviceName);
mDeviceNameEdited = savedInstanceState.getBoolean(KEY_NAME_EDITED, false);
}
// 对话框的显示已经操作函数。
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
.setTitle(getDialogTitle())
.setView(createDialogView(deviceName))
.setPositiveButton(R.string.bluetooth_rename_button, (dialog, which) -> {
setDeviceName(mDeviceNameView.getText().toString().trim());
})
.setNegativeButton(android.R.string.cancel, null);
mAlertDialog = builder.create();
mAlertDialog.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); return mAlertDialog;
} 设置名称函数在子类中实现。
packages/apps/Settings/src/com/android/settings/bluetooth/LocalDeviceNameDialogFragment.java
protected void setDeviceName(String deviceName) {
mLocalAdapter.setName(deviceName);
} frameworks\base\packages\SettingsLib\src\com\android\settingslib\bluetooth\LocalBluetoothAdapter.java
public void setName(String name) {
mAdapter.setName(name);
} frameworks\base\core\java\android\bluetooth\BluetoothAdapter.java
@RequiresPermission(Manifest.permission.BLUETOOTH_ADMIN)
public boolean setName(String name) {
if (getState() != STATE_ON) return false;
try {
mServiceLock.readLock().lock();
if (mService != null) return mService.setName(name);
} catch (RemoteException e) {
Log.e(TAG, "", e);
} finally {
mServiceLock.readLock().unlock();
}
return false;
} frameworks\base\core\java\android\bluetooth\IBluetooth.aidl
interface IBluetooth
{
boolean isEnabled();
int getState();
boolean enable();
boolean enableNoAutoConnect();
boolean disable(); String getAddress();
ParcelUuid[] getUuids();
boolean setName(in String name); 对应的服务端程序如下。
frameworks\base\services\core\java\com\android\server\BluetoothManagerService.java case MESSAGE_BLUETOOTH_SERVICE_CONNECTED:
{
if (DBG) Slog.d(TAG,"MESSAGE_BLUETOOTH_SERVICE_CONNECTED: " + msg.arg1); IBinder service = (IBinder) msg.obj;
try {
mBluetoothLock.writeLock().lock();
if (msg.arg1 == SERVICE_IBLUETOOTHGATT) {
mBluetoothGatt = IBluetoothGatt.Stub
.asInterface(Binder.allowBlocking(service));
onBluetoothGattServiceUp();
break;
} // else must be SERVICE_IBLUETOOTH //Remove timeout
mHandler.removeMessages(MESSAGE_TIMEOUT_BIND); mBinding = false;
mBluetoothBinder = service;
// 服务端和客户端建立连接
mBluetooth = IBluetooth.Stub.asInterface(Binder.allowBlocking(service)); if (!isNameAndAddressSet()) {
Message getMsg = mHandler.obtainMessage(MESSAGE_GET_NAME_AND_ADDRESS);
mHandler.sendMessage(getMsg);
if (mGetNameAddressOnly) return;
} // 客户端程序继承IBluetooth.Stub
packages\apps\Bluetooth\src\com\android\bluetooth\btservice\AdapterService.java
private static class AdapterServiceBinder extends IBluetooth.Stub {
private AdapterService mService; public String getName() {
if ((Binder.getCallingUid() != Process.SYSTEM_UID) &&
(!Utils.checkCaller())) {
Log.w(TAG, "getName() - Not allowed for non-active user and non system user");
return null;
} AdapterService service = getService();
if (service == null) return null;
return service.getName();
}
// 设置名称
public boolean setName(String name) {
if (!Utils.checkCaller()) {
Log.w(TAG, "setName() - Not allowed for non-active user");
return false;
} AdapterService service = getService();
if (service == null) return false;
return service.setName(name);
} boolean setName(String name) {
enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH ADMIN permission"); return mAdapterProperties.setName(name);
} packages\apps\Bluetooth\src\com\android\bluetooth\btservice\AdapterProperties.java
boolean setName(String name) {
synchronized (mObject) {
if (name.length() > BLUETOOTH_NAME_MAX_LENGTH_BYTES)
name = name.substring(0, BLUETOOTH_NAME_MAX_LENGTH_BYTES);
return mService.setAdapterPropertyNative(
AbstractionLayer.BT_PROPERTY_BDNAME, name.getBytes());
}
} 调用JNI
packages\apps\Bluetooth\src\com\android\bluetooth\btservice\AdapterService.java
native boolean setAdapterPropertyNative(int type, byte[] val); packages\apps\Bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
static jboolean setAdapterPropertyNative(JNIEnv* env, jobject obj, jint type,
jbyteArray value) {
ALOGV("%s", __func__); if (!sBluetoothInterface) return JNI_FALSE; jbyte* val = env->GetByteArrayElements(value, NULL);
bt_property_t prop;
prop.type = (bt_property_type_t)type;
prop.len = env->GetArrayLength(value);
prop.val = val; int ret = sBluetoothInterface->set_adapter_property(&prop);
env->ReleaseByteArrayElements(value, val, 0); return (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
}

Liu Tao

2019-3-27

Android 8 设置蓝牙名称 流程的更多相关文章

  1. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址

    Android BLE与终端通信(一)--Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址 Hello,工作需要,也必须开始向BLE方向学习了,公司的核心技术就是BLE终端 ...

  2. android中通过代码来设置蓝牙永久可见性

    废话不多说,直接阐述: 前段时间在搞一个android项目,其中有一个功能要求需要蓝牙可见性永久打开,但是开发过android蓝牙的程序员应该都知道,goole提供的api中没有设置蓝牙永久可见性的接 ...

  3. Android -传统蓝牙通信聊天

    概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设备.蓝牙连接.通信等. 详细 代码下载:http://www.demodashi.com/demo/10676.html 原文地址: Andr ...

  4. 蓝牙inquiry流程之命令下发

    Android 上面的蓝牙inquiry 是在设置界面,打开蓝牙就会自动搜索周边的蓝牙设备,其最终调用到协议栈的start_discovery接口,此篇文章分析该接口的调用流程以及与controlle ...

  5. Android - 传统蓝牙通信聊天

    Android -传统蓝牙通信聊天 技术:java+Android4.4+jdk1.8 运行环境:Android4.4.Android7.0 概述 Android 传统蓝牙的使用,包括开关蓝牙.搜索设 ...

  6. Android -BLE蓝牙小DEMO

    代码地址如下:http://www.demodashi.com/demo/13890.html 原文地址: https://blog.csdn.net/vnanyesheshou/article/de ...

  7. 深入理解 Android 之 View 的绘制流程

    概述 本篇文章会从源码(基于Android 6.0)角度分析Android中View的绘制流程,侧重于对整体流程的分析,对一些难以理解的点加以重点阐述,目的是把View绘制的整个流程把握好,而对于特定 ...

  8. Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备

    一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 一.  清单文件AdroidManifest.xml: <uses-permission android:name="an ...

  9. Android 手机设置CMWAP 接入点

    Android 手机设置CMWAP 接入点 设置--- 无限控件---移动网络设置---接入点名称----再按菜单---选择新apn 第一步,设置CMNET 上网APN 新建 APN 1.名称:cmn ...

随机推荐

  1. docker 与启动后的镜像进行交互

    docker ps docker exec -t -i jenk /bin/bash 在启动时进行交互 docker run -i -t ubuntu:15.10 /bin/bash

  2. 考前停课集训 Day6 垒

    Day 6 今天在家里的 家里蹲 其实是day7的时候想到要写day6了 草率补充一下 NOIP考前棕名退不掉咯 你觉得我还会打洛谷的题目吗? 依然退步 没用心 T1 分火腿 数论题 我感觉挺难的 T ...

  3. C Windows控制台字符版本俄罗斯方块

    //一个可以工作在Windows控制台字符界面下的俄罗斯方块 //工作在非图形模式,无需其他库依赖,单个C文件代码即可运行 //支持最高纪录,并且对于纪录进行了加密 //By wrule 2015年1 ...

  4. Java API实现Hadoop文件系统增删改查

    Java API实现Hadoop文件系统增删改查 Hadoop文件系统可以通过shell命令hadoop fs -xx进行操作,同时也提供了Java编程接口 maven配置 <project x ...

  5. GDB快速入门

    GDB快速入门 GDB(GNU DeBugger)是Linux下强大的C/C++调试器,纯命令行操作 启动 以下为测试代码 #include <stdio.h> int nGlobalVa ...

  6. sqlserver触发器insert,delete,update

    Create Trigger [dbo].[upemployee_kefyu_sale] on [dbo].[employee] for update as if update(FullName) b ...

  7. PAT Basic 1011

    1011 A+B 和 C (15 分) 给定区间 [−2​31​​,2​31​​] 内的 3 个整数 A.B 和 C,请判断 A+B 是否大于 C. 输入格式: 输入第 1 行给出正整数 T (≤10 ...

  8. JS_高阶函数(sort)

    //javaScript sort()排序算法 //sort()方法默认把所有的元素转换成String再排序,字符串是根据ASCII进行排序的,所以会出现“10”排在“2”前面,或是小写字母“a”排在 ...

  9. CSS_级联和继承

    2016-11-06 <CSS入门经典>第七章 1.在HTML中使用CSS样式表的三种方式: (1)内联的样式表. eg:<em style="background-whi ...

  10. Docker技术快速精通指南

    doctor专业网站:http://www.dockerinfo.net/ Docker中文文档 csdn 的docker专栏: Docker技术快速精通指南