Android蓝牙Settings之界面

本文详细解析了Android蓝牙设置界面的构成,包括ActionBar中的Switch控制、PreferenceScreen的各个部分,如本机名称、已配对设备、可用设备和搜索设备的展示逻辑。重点介绍了BluetoothSettingsActivity、BluetoothSettings、BluetoothEnabler以及如何根据BroadcastReceiver响应蓝牙设备状态变化。

布局图如下:

 

1.ActionBar:Switch

在Android4.0中,在主界面Settings中定义了很多内部子空类,例如:

public static class BluetoothSettingsActivity extends Settings
在Mainifest.xml中,配置了一些对应的fragment。例如:

<activityandroid:name="Settings$BluetoothSettingsActivity"

               android:label="@string/bluetooth_settings_title"

               android:clearTaskOnLaunch="true">

           <intent-filter>

                <actionandroid:name="android.intent.action.MAIN" />

               <action android:name="android.settings.BLUETOOTH_SETTINGS"/>

               <categoryandroid:name="android.intent.category.VOICE_LAUNCH" />

               <category android:name="com.android.settings.SHORTCUT"/>

               <category android:name="android.intent.category.DEFAULT"/>

           </intent-filter>

           <meta-dataandroid:name="com.android.settings.FRAGMENT_CLASS"

                android:value="com.android.settings.bluetooth.BluetoothSettings"/>

           <meta-dataandroid:name="com.android.settings.TOP_LEVEL_HEADER_ID"

               android:resource="@id/bluetooth_settings" />

       </activity>


 

可以看到他对应的fragment是

com.android.settings.bluetooth.BluetoothSettings

所以说我们从一级界面Settings点击相应的header跳转到BT的设置的界面的时候,实际上是启动相应的Activity加上fragment。

这 里当然是BluetoothSettingsActivity加上BluetoothSettings,对于ActionBar这部分,我们可以看到是由两部分主城,其中一部分是由icon和文字来表示当前的界面,其中icon始终没有变,而文字是要相应的 变化的,而这个文字的设置就在 Mainfest中配置的: android:label="@string/bluetooth_settings_title"。 另一部分是一个Switcher来控制蓝牙的关闭。这个switch就是一个widget,他的基本关系:public class Switch extendsCompoundButton。 Switch是在BluetoothSettings代码中添加的:

 activity.getActionBar().setCustomView(actionBarSwitch,new ActionBar.LayoutParams(

                       ActionBar.LayoutParams.WRAP_CONTENT,

                       ActionBar.LayoutParams.WRAP_CONTENT,

                       Gravity.CENTER_VERTICAL | Gravity.RIGHT));

 

后面又将actionBarSwitch传入到BluetoothEnabler,通过BluetoothEnable

Android 9.0 (Pie) 系统中,若需要隐藏Settings应用中的蓝牙选项,可以通过修改系统设置或使用系统权限来实现,通常需要以下方法之一: 1. **通过系统属性或全局设置隐藏**: 可以修改系统配置文件或使用`Settings.Global`、`Settings.Secure`或`Settings.System`中的相关设置项,但Android默认没有直接提供隐藏蓝牙选项的公开API。 2. **修改Settings应用资源文件**: 如果是自定义ROM开发,可以直接修改Settings应用的布局文件(如`res/xml/settings_headers.xml`或其他相关文件),移除或注释掉蓝牙相关的菜单项。 3. **使用Device Policy Manager (DPM)**: 如果是企业设备管理或家长控制场景,可以通过`DevicePolicyManager`设置策略来限制用户访问蓝牙设置。例如: ```java DevicePolicyManager dpm = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE); ComponentName adminComponent = new ComponentName(context, MyDeviceAdminReceiver.class); if (dpm.isAdminActive(adminComponent)) { dpm.setGlobalSetting(adminComponent, Settings.Global.AIRPLANE_MODE_ON, "1"); // 示例:间接限制蓝牙 } ``` 但这种方法通常不能直接隐藏蓝牙选项,而是通过禁用蓝牙功能来间接实现。 4. **通过Overlay方式修改界面**: 可以创建一个自定义的`ResourceOverlay`,覆盖Settings应用的蓝牙相关布局文件,将其可见性设置为`GONE`。 5. **修改系统权限或SELinux策略**(需系统级权限): 如果是系统应用或具有系统签名,可以通过修改SELinux策略或限制`android.permission.BLUETOOTH_ADMIN`权限的访问来间接控制蓝牙选项的显示。 ### 示例代码(通过Overlay隐藏蓝牙选项): 在`res/values/bools.xml`中定义: ```xml <bool name="config_show_bluetooth_settings">false</bool> ``` 然后在代码中动态加载: ```java Resources resources = getResources(); int id = resources.getIdentifier("config_show_bluetooth_settings", "bool", "android"); if (id != 0) { boolean showBluetooth = resources.getBoolean(id); if (!showBluetooth) { // 隐藏蓝牙相关UI } } ``` ### 注意事项: - 上述方法大多需要系统级权限或修改系统框架代码,普通应用无法直接实现。 - 隐藏系统设置选项可能违反Google的兼容性要求(CTS),导致应用无法通过Google Play上架。 - 推荐通过用户权限管理(如`DevicePolicyManager`)或自定义Launcher来限制用户操作,而非直接隐藏系统设置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值