{"id":4824,"date":"2021-09-13T11:39:36","date_gmt":"2021-09-13T03:39:36","guid":{"rendered":"http:\/\/122.152.205.50\/wordpress\/?p=4824"},"modified":"2021-11-23T11:46:29","modified_gmt":"2021-11-23T03:46:29","slug":"android6-0-%e8%93%9d%e7%89%99","status":"publish","type":"post","link":"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824","title":{"rendered":"Android6.0\u8bbe\u7f6e\u84dd\u7259\u5e94\u7528\u5c42\u6e90\u7801\u5206\u6790"},"content":{"rendered":"<p><a class=\"wp-editor-md-post-content-link\" href=\"https:\/\/blog.csdn.net\/zrf1335348191\/article\/details\/51734102\">https:\/\/blog.csdn.net\/zrf1335348191\/article\/details\/51734102<\/a><\/p>\n<p>\u5728\u4e86\u89e3\u84dd\u7259\u6e90\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u63d0\u524d\u719f\u6089Preference\u76f8\u5173\u7684\u7c7b<a class=\"wp-editor-md-post-content-link\" href=\"http:\/\/122.152.205.50\/wordpress\/?p=4870\">http:\/\/122.152.205.50\/wordpress\/?p=4870<\/a><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_16 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">\u76ee\u5f55<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824\/#%E4%B8%80%E3%80%81%E8%93%9D%E7%89%99%E7%9A%84%E5%85%A5%E5%8F%A3%E7%95%8C%E9%9D%A2\" title=\"\u4e00\u3001\u84dd\u7259\u7684\u5165\u53e3\u754c\u9762\">\u4e00\u3001\u84dd\u7259\u7684\u5165\u53e3\u754c\u9762<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824\/#%E4%BA%8C%E3%80%81%E6%A0%B8%E5%BF%83%E7%B1%BB\" title=\"\u4e8c\u3001\u6838\u5fc3\u7c7b\">\u4e8c\u3001\u6838\u5fc3\u7c7b<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824\/#%E4%B8%89%E3%80%81%E5%B7%B2%E9%85%8D%E5%AF%B9%E4%B8%8E%E5%8F%AF%E9%85%8D%E5%AF%B9%E5%88%97%E8%A1%A8%E6%98%AF%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%E7%9A%84%EF%BC%9F\" title=\"\u4e09\u3001\u5df2\u914d\u5bf9\u4e0e\u53ef\u914d\u5bf9\u5217\u8868\u662f\u5982\u4f55\u66f4\u65b0\u7684\uff1f\">\u4e09\u3001\u5df2\u914d\u5bf9\u4e0e\u53ef\u914d\u5bf9\u5217\u8868\u662f\u5982\u4f55\u66f4\u65b0\u7684\uff1f<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824\/#%E5%9B%9B%E3%80%81%E8%A7%84%E5%BE%8B\" title=\"\u56db\u3001\u89c4\u5f8b\">\u56db\u3001\u89c4\u5f8b<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-3\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"http:\/\/xinyiworld.top\/wordpress_it\/?p=4824\/#%E4%BA%94%E3%80%81%E6%99%AE%E9%80%9A%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91\" title=\"\u4e94\u3001\u666e\u901a\u5e94\u7528\u5f00\u53d1\">\u4e94\u3001\u666e\u901a\u5e94\u7528\u5f00\u53d1<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"%E4%B8%80%E3%80%81%E8%93%9D%E7%89%99%E7%9A%84%E5%85%A5%E5%8F%A3%E7%95%8C%E9%9D%A2\"><\/span>\u4e00\u3001\u84dd\u7259\u7684\u5165\u53e3\u754c\u9762<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><code>\/packages\/apps\/Settings\/src\/com\/android\/settings\/bluetooth\/BluetoothSettings.java<\/code><\/p>\n<ul>\n<li>BluetoothDeviceFilter<br \/>\n\u8bbe\u5907\u8fc7\u6ee4\u5668\uff0c\u7528\u6765\u5339\u914d\u67d0\u79cd\u7c7b\u578b\u7684\u8bbe\u5907\u3002<\/p>\n<\/li>\n<li>\n<p>BluetoothEnabler.java<br \/>\n\u5bf9\u84dd\u7259\u7684\u5f00\u5173\u903b\u8f91\u4f5c\u4e00\u5c42\u5c01\u88c5<\/p>\n<\/li>\n<li>\n<p>DeviceListPreferenceFragment<br \/>\n\u5728onCreate\u65b9\u6cd5\u91cc\u83b7\u53d6LocalBluetoothManager\u7684\u5355\u4f8b<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">mLocalManager = Utils.getLocalBtManager(getActivity());\n<\/code><\/pre>\n<p>\u8bbe\u5907\u5217\u8868\uff0c\u8c03\u7528BluetoothDevicePreference\u7c7b\u8fdb\u884c\u8bbe\u5907\u7684\u914d\u5bf9\u3001\u8fde\u63a5\u4e0e\u65ad\u5f00\u7b49\u64cd\u4f5c\u3002<br \/>\nBluetoothSettings\u7ee7\u627f\u81ea\u8fd9\u4e2a\u7c7b\u3002<\/p>\n<pre><code>\u4e00\u4e2aCachedBluetoothDevice\u521b\u5efa\u4e00\u4e2aBluetoothDevicePreference\uff0c\u4e5f\u5c31\u662f\u8bbe\u5907\u5217\u8868\u7684Item\uff0c\u5e76\u7528Map\u5efa\u7acb\u4e4b\u95f4\u7684\u6620\u5c04\uff0c\u65b9\u4fbf\u7ef4\u62a4\u3002\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">    public void onDeviceAdded(CachedBluetoothDevice cachedDevice) {\n        ...\n        createDevicePreference(cachedDevice);\n    }\n\n    void createDevicePreference(CachedBluetoothDevice cachedDevice) {\n        if (mDeviceListGroup == null) {\n            Log.w(TAG, \"Trying to create a device preference before the list group\/category \"\n                    + \"exists!\");\n            return;\n        }\n\n        BluetoothDevicePreference preference = new BluetoothDevicePreference(\n                getActivity(), cachedDevice);\n\n        initDevicePreference(preference);\n        mDeviceListGroup.addPreference(preference);\n        mDevicePreferenceMap.put(cachedDevice, preference);\n    }\n<\/code><\/pre>\n<ul>\n<li>BluetoothDevicePreference.java<br \/>\n\u8c03\u7528CachedBluetoothDevice\u7684\u65b9\u6cd5\uff0c\u8fdb\u884c\u914d\u5bf9\u3001\u8fde\u63a5\u3001\u53d6\u6d88\u8fde\u63a5\u3001\u8bbe\u5907\u4fe1\u606f\u5c55\u793a\u7b49\u64cd\u4f5c\u3002<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\"> void onClicked() {\n        int bondState = mCachedDevice.getBondState();\n\n        if (mCachedDevice.isConnected()) {\n            \/\/\u53d6\u6d88\u8fde\u63a5\n            askDisconnect();\n        } else if (bondState == BluetoothDevice.BOND_BONDED) {\n            \/\/\u8fde\u63a5\n            mCachedDevice.connect(true);\n        } else if (bondState == BluetoothDevice.BOND_NONE) {\n            \/\/\u914d\u5bf9\n            pair();\n        }\n }\n<\/code><\/pre>\n<p>\u83b7\u53d6\u8bbe\u5907\u4fe1\u606f\u7ed1\u5b9aPreference<\/p>\n<pre><code class=\"language-java line-numbers\">public void onDeviceAttributesChanged() {\n        \/*\n         * The preference framework takes care of making sure the value has\n         * changed before proceeding. It will also call notifyChanged() if\n         * any preference info has changed from the previous value.\n         *\/\n        \/\/Preference\u6807\u9898\uff0c\u4e5f\u5c31\u662f\u8bbe\u5907\u7684\u540d\u79f0\u3002\n        setTitle(mCachedDevice.getName());\n\n        \/\/Preference\u526f\u6807\u9898\uff0c\u4e5f\u5c31\u662f\u8bbe\u5907\u7684\u8fde\u63a5\u72b6\u6001\u3002\n        int summaryResId = mCachedDevice.getConnectionSummary();\n        if (summaryResId != 0) {\n            setSummary(summaryResId);\n        } else {\n            setSummary(null);   \/\/ empty summary for unpaired devices\n        }\n\n        \/\/Preference\u56fe\u6807\uff0c\u4e5f\u5c31\u662f\u8bbe\u5907\u7c7b\u578b\u3002\n        int iconResId = getBtClassDrawable();\n        if (iconResId != 0) {\n            setIcon(iconResId);\n        }\n\n        \/\/ Used to gray out the item\n        setEnabled(!mCachedDevice.isBusy());\n\n        \/\/ This could affect ordering, so notify that\n        notifyHierarchyChanged();\n    }\n\n<\/code><\/pre>\n<p><strong>\u6253\u5f00\u8bbe\u5907\u8be6\u60c5\u5f39\u6846<\/strong><br \/>\n<img src=\"http:\/\/xinyiworld.top\/wordpress\/wp-content\/uploads\/2021\/09\/bluetooth_device-detail.png\" alt=\"\" \/><\/p>\n<p>\u6e90\u7801\u8ffd\u8e2a\uff1a<br \/>\n<img src=\"http:\/\/xinyiworld.top\/wordpress\/wp-content\/uploads\/2021\/09\/d1.png\" alt=\"\" \/><\/p>\n<ul>\n<li>CachedBluetoothDevice<br \/>\n\u5b98\u65b9\u8bf4\u660e\uff1a<code>CachedBluetoothDevice represents a remote Bluetooth device. It contains<br \/>\nattributes of the device (such as the address, name, RSSI, etc.) and<br \/>\nfunctionality that can be performed on the device (connect, pair, disconnect,<br \/>\netc.).<\/code><br \/>\n\u4e00\u4e2aCachedBluetoothDevice\u5bf9\u5e94\u591a\u79cd\u534f\u8bae<br \/>\n\u5b58\u50a8\u7684\u5404\u4e2a\u534f\u8bae\u53ca\u534f\u8bae\u7684\u8fde\u63a5\u72b6\u6001\u7b49\u4fe1\u606f<\/p>\n<blockquote><p>\n  <strong>\u8bbe\u5907\u7684\u8fde\u63a5\u72b6\u6001\uff1agetConnectionSummary()<\/strong>\n<\/p><\/blockquote>\n<p>\u901a\u8fc7\u7814\u7a76\u8fd9\u4e2a\u65b9\u6cd5\u53ef\u4ee5\u53d1\u73b0\uff0c\u5224\u65ad\u8bbe\u5907\u662f\u5426\u8fde\u63a5\u5b9e\u9645\u662f\u5224\u65ad\u8bbe\u5907\u652f\u6301\u7684\u534f\u8bae\u7684\u8fde\u63a5\u72b6\u6001\uff0c\u81f3\u5c11\u6709\u4e00\u79cd\u534f\u8bae\u662f\u8fde\u63a5\u7684\uff0c\u8bbe\u5907\u5c31\u662f\u5904\u4e8e\u8fde\u63a5\u72b6\u6001\u3002<\/p>\n<\/li>\n<li>\n<p>BluetoothEventManager<br \/>\n\u6e90\u7801\u4f4d\u7f6e\uff1a<br \/>\n<code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/BluetoothEventManager.java<\/code><br \/>\n\u6b64\u7c7b\u4e3b\u8981\u662f\u5c01\u88c5\u4e86\u84dd\u7259\u76f8\u5173\u7684\u5e7f\u64ad\u6ce8\u518c\u4e0e\u76d1\u542c\uff0c\u7136\u540e\u5c06\u76f8\u5173\u72b6\u6001\u7ed1\u5b9a\u5230CachedBluetoothDevice\u4e0a\u3002<\/p>\n<p>\u91cd\u8981\u52a8\u4f5c1 \uff1a\u901a\u8fc7\u76d1\u542c<code>BluetoothDevice.ACTION_FOUND<\/code>\u5e7f\u64ad\u53d1\u73b0\u8bbe\u5907\uff0c\u901a\u8fc7CachedBluetoothDeviceManager\u5c06\u8bbe\u5907\u4fdd\u5b58\u8d77\u6765\u5e76\u8c03\u7528BluetoothEventManager\u7684dispatchDeviceAdded\u56de\u8c03\u4e8b\u4ef6\u3002<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\"> public CachedBluetoothDevice addDevice(LocalBluetoothAdapter adapter,\n                                           LocalBluetoothProfileManager profileManager,\n                                           BluetoothDevice device) {\n        CachedBluetoothDevice newDevice = new CachedBluetoothDevice(mContext, adapter,\n                profileManager, device);\n        synchronized (mCachedDevices) {\n            mCachedDevices.add(newDevice);\n            mBtManager.getEventManager().dispatchDeviceAdded(newDevice);\n        }\n        return newDevice;\n    }\n<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"%E4%BA%8C%E3%80%81%E6%A0%B8%E5%BF%83%E7%B1%BB\"><\/span>\u4e8c\u3001\u6838\u5fc3\u7c7b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li>LocalBluetoothManager<br \/>\n\u6e90\u7801\u4f4d\u7f6e\uff1a<br \/>\n<code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/LocalBluetoothManager.java<\/code><br \/>\n\u5b98\u65b9\u8bf4\u660e\uff1a<br \/>\n<code>LocalBluetoothManager provides a simplified interface on top of a subset of the Bluetooth API.<\/code><br \/>\n\u6b64\u7c7b\u4f1a\u521b\u5efa\u51e0\u4e2a\u5341\u5206\u91cd\u8981\u7684\u7c7b\u7684\u5b9e\u4f8b\uff1aLocalBluetoothAdapter\u3001CachedBluetoothDeviceManager\u3001LocalBluetoothProfileManager<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\"> private final LocalBluetoothAdapter mLocalAdapter;\n private final CachedBluetoothDeviceManager mCachedDeviceManager;\n \/** The Bluetooth profile manager. *\/\n private final LocalBluetoothProfileManager mProfileManager;\n<\/code><\/pre>\n<pre><code class=\"language-java line-numbers\">private LocalBluetoothManager(LocalBluetoothAdapter adapter, Context context) {\n        mContext = context;\n        mLocalAdapter = adapter;\n\n        mCachedDeviceManager = new CachedBluetoothDeviceManager(context, this);\n        mEventManager = new BluetoothEventManager(mLocalAdapter,\n                mCachedDeviceManager, context);\n        mProfileManager = new LocalBluetoothProfileManager(context,\n                mLocalAdapter, mCachedDeviceManager, mEventManager);\n    }\n<\/code><\/pre>\n<ul>\n<li>\n<p>LocalBluetoothAdapter<br \/>\n\u6e90\u7801\u4f4d\u7f6e\uff1a<br \/>\n<code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/LocalBluetoothAdapter.java<\/code><br \/>\n\u5b98\u65b9\u91ca\u4e49\uff1a<br \/>\n<code>LocalBluetoothAdapter provides an interface between the Settings app and the functionality of the local {@link BluetoothAdapter}, specifically those related to state transitions of the adapter itself.<\/code><br \/>\n\u4e3b\u8981\u662f\u5bf9BluetoothAdapter\u505a\u4e86\u5c01\u88c5<\/p>\n<\/li>\n<li>\n<p>CachedBluetoothDeviceManager<br \/>\n\u6e90\u7801\u4f4d\u7f6e\uff1a<br \/>\n<code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/CachedBluetoothDeviceManager.java<\/code><br \/>\n\u5b98\u65b9\u91ca\u4e49\uff1a<br \/>\n<code>CachedBluetoothDeviceManager manages the set of remote Bluetooth devices<\/code><br \/>\n\u4e3b\u8981\u662f\u5bf9\u8fdc\u7a0b\u7684\u84dd\u7259\u8bbe\u5907\u8fdb\u884c\u7ba1\u7406<\/p>\n<\/li>\n<li>\n<p>LocalBluetoothProfileManager<br \/>\n\u6e90\u7801\u4f4d\u7f6e\uff1a<br \/>\n<code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/LocalBluetoothProfileManager.java<\/code><br \/>\n\u5b98\u65b9\u91ca\u4e49\uff1a<br \/>\n<code>LocalBluetoothProfileManager provides access to the LocalBluetoothProfile objects for the available Bluetooth profiles.<\/code><\/p>\n<\/li>\n<\/ul>\n<p>\u4f9d\u8d56\u4e8eLocalBluetoothAdapter\u3001CachedBluetoothDeviceManager\u3001BluetoothEventManager\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">LocalBluetoothProfileManager(Context context,\n            LocalBluetoothAdapter adapter,\n            CachedBluetoothDeviceManager deviceManager,\n            BluetoothEventManager eventManager)\n<\/code><\/pre>\n<p>\u6839\u636euuids\u89e3\u6790\u51fa\u5bf9\u5e94\u7684\u534f\u8bae\uff08\u6bcf\u79cd\u534f\u8bae\u7684ACTION\u90fd\u662f\u552f\u4e00\u7684\uff09\uff0c\u7136\u540e\u901a\u8fc7BluetoothEventManager\u6ce8\u518c\u76d1\u542c\u5404\u4e2a\u534f\u8bae\u7684\u8fde\u63a5\u72b6\u6001\u7684\u53d8\u5316\uff0c\u6700\u540e\u628a\u7ed3\u679c\u7ed1\u5b9a\u5230CachedBluetoothDevice\u4e0a\u3002<\/p>\n<pre><code class=\"language-java line-numbers\">void updateLocalProfiles(ParcelUuid[] uuids) {\n...\n}\n<\/code><\/pre>\n<h3><span class=\"ez-toc-section\" id=\"%E4%B8%89%E3%80%81%E5%B7%B2%E9%85%8D%E5%AF%B9%E4%B8%8E%E5%8F%AF%E9%85%8D%E5%AF%B9%E5%88%97%E8%A1%A8%E6%98%AF%E5%A6%82%E4%BD%95%E6%9B%B4%E6%96%B0%E7%9A%84%EF%BC%9F\"><\/span>\u4e09\u3001\u5df2\u914d\u5bf9\u4e0e\u53ef\u914d\u5bf9\u5217\u8868\u662f\u5982\u4f55\u66f4\u65b0\u7684\uff1f<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u4f1a\u5728\u591a\u5904\u89e6\u53d1\uff1aonResume\u3001\u84dd\u7259\u5f00\u5173\u72b6\u6001\u53d8\u5316\u3001\u8bbe\u5907\u7ed1\u5b9a\u72b6\u6001\u53d8\u5316\u3002<\/p>\n<p>BluetoothSettings.java<\/p>\n<pre><code class=\"language-java line-numbers\"> private void updateContent(int bluetoothState) {\n        final PreferenceScreen preferenceScreen = getPreferenceScreen();\n        int messageId = 0;\n\n        switch (bluetoothState) {\n            case BluetoothAdapter.STATE_ON:\n                ...\n                \/\/ Paired devices category\n                if (mPairedDevicesCategory == null) {\n                    mPairedDevicesCategory = new PreferenceCategory(getActivity());\n                } else {\n                    mPairedDevicesCategory.removeAll();\n                }\n                addDeviceCategory(mPairedDevicesCategory,\n                        R.string.bluetooth_preference_paired_devices,\n                        BluetoothDeviceFilter.BONDED_DEVICE_FILTER, true);\n                ...\n\n                \/\/ Available devices category\n                if (mAvailableDevicesCategory == null) {\n                    mAvailableDevicesCategory = new BluetoothProgressCategory(getActivity());\n                    mAvailableDevicesCategory.setSelectable(false);\n                } else {\n                    mAvailableDevicesCategory.removeAll();\n                }\n                addDeviceCategory(mAvailableDevicesCategory,\n                        R.string.bluetooth_preference_found_devices,\n                        BluetoothDeviceFilter.UNBONDED_DEVICE_FILTER, mInitialScanStarted);\n\n                if (!mInitialScanStarted) {\n                    startScanning();\n                }\n\n                if (mMyDevicePreference == null) {\n                    mMyDevicePreference = new Preference(getActivity());\n                }\n\n                mMyDevicePreference.setSummary(getResources().getString(\n                        R.string.bluetooth_is_visible_message, mLocalAdapter.getName()));\n                mMyDevicePreference.setSelectable(false);\n                preferenceScreen.addPreference(mMyDevicePreference);\n\n                return; \/\/ not break\n                ...\n        }\n    }\n<\/code><\/pre>\n<blockquote><p>\n  <strong>\u754c\u9762\u662f\u5982\u4f55\u76d1\u542c\u201c\u84dd\u7259\u5f00\u5173\u72b6\u6001\u53d8\u5316\u201d\u3001\u201c\u8bbe\u5907\u7ed1\u5b9a\u72b6\u6001\u53d8\u5316\u201d\u7684\uff1f<\/strong>\n<\/p><\/blockquote>\n<p>DeviceListPreferenceFragment\u7684onResume\u65b9\u6cd5\u4f1a\u8c03\u7528BluetoothEventManager\u7684registerCallback\u65b9\u6cd5\u6ce8\u518c\u76d1\u542c\u3002<\/p>\n<pre><code class=\"language-java line-numbers\"> @Override\n    public void onResume() {\n        ...\n        mLocalManager.getEventManager().registerCallback(this);\n        ...\n    }\n<\/code><\/pre>\n<p>\u800c\u524d\u9762\u5df2\u7ecf\u8bf4\u5230\uff0cBluetoothEventManager\u5c01\u88c5\u4e86\u84dd\u7259\u7684\u5404\u79cd\u5e7f\u64ad\u3002<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%E5%9B%9B%E3%80%81%E8%A7%84%E5%BE%8B\"><\/span>\u56db\u3001\u89c4\u5f8b<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u8bbe\u7f6e\u5e94\u7528\u84dd\u7259\u76f8\u5173\u7684\u7c7b\uff0c\u57fa\u672c\u90fd\u662fLocal\u5f00\u5934\u7684\uff0c\u8fd9\u4e2a\u4e0e\u5e94\u7528\u5f00\u53d1\u5341\u5206\u4e0d\u540c\uff0c\u5b83\u4eec\u4f4d\u4e8e <code>\/frameworks\/base\/packages\/SettingsLib\/src\/com\/android\/settingslib\/bluetooth\/<\/code>\u4e0b\uff0c\u901a\u8fc7\u5206\u6790SettingsLib\u4e0b\u7684mk\u6587\u4ef6\u53ef\u77e5\uff0c\u6574\u4e2aSettingsLib\u4e0b\u7684\u7c7b\u6700\u7ec8\u4f1a\u6253\u5305\u6210SettingsLib.jar\uff0c\u800c\u8fd9\u4e2ajar\u5305\u5e94\u7528\u5c42\u662f\u65e0\u6cd5\u8bbf\u95ee\u5230\u7684\uff0c\u56e0\u4e3aandroid sdk\u91cc\u5e76\u4e0d\u4f1a\u5c06\u8fd9\u4e2ajar\u6253\u5305\u8fdb\u53bb\u3002<\/p>\n<h3><span class=\"ez-toc-section\" id=\"%E4%BA%94%E3%80%81%E6%99%AE%E9%80%9A%E5%BA%94%E7%94%A8%E5%BC%80%E5%8F%91\"><\/span>\u4e94\u3001\u666e\u901a\u5e94\u7528\u5f00\u53d1<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u7531\u4e8eSDK\u91cc\u6ca1\u6709SettingsLib.jar\uff0c\u65e0\u6cd5\u4f7f\u7528CachedBluetoothDevice\u90a3\u4e9b\u7b80\u4fbf\u7684\u65b9\u6cd5\u6765\u64cd\u4f5c\u8fdc\u7a0b\u8bbe\u5907\uff0c\u53ea\u80fd\u901a\u8fc7\u5e7f\u64ad\u548cBluetoothDevice\u7c7b\u53caBluetoothProfile\u76f8\u5173\u7684\u534f\u8bae\u7c7b\u6765\u64cd\u4f5c\u8bbe\u5907\uff0c\u800c\u4e14BluetoothDevice\u7c7b\u7684\u5f88\u591a\u65b9\u6cd5\u90fd\u662f\u7cfb\u7edf\u65b9\u6cd5\u6216\u8005hide\u65b9\u6cd5\uff0c\u9700\u8981\u8fdb\u884c\u53cd\u5c04\u3002<\/p>\n<ul>\n<li>\u914d\u5bf9<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">  @RequiresApi(api = Build.VERSION_CODES.KITKAT)\n    @Override\n    public void pair(Context context, BluetoothDevice device) {\n        BtUtil.cancelDiscovery();\n        device.createBond();\n    }\n<\/code><\/pre>\n<ul>\n<li>\u53d6\u6d88\u914d\u5bf9<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">@Override\n    public void unpair(Context context, BluetoothDevice device) {\n        int state = device.getBondState();\n\n        if (state == BluetoothDevice.BOND_BONDING) {\n\/\/            device.cancelBondProcess();\n            ReflectManger.invokeMethod(BluetoothDevice.class, device, \"cancelBondProcess\", null, null);\n        }\n\n        if (state != BluetoothDevice.BOND_NONE) {\n            boolean successful = (boolean) ReflectManger.invokeMethod(BluetoothDevice.class, device, \"removeBond\", null, null);\n            if (successful) {\n                Log.d(TAG, \"unpair: removeBond success \");\n            } else {\n                Log.d(TAG, \"unpair: removeBond failure \");\n            }\n        }\n    }\n<\/code><\/pre>\n<ul>\n<li>\u8fde\u63a5\u3001\u53d6\u6d88\u8fde\u63a5\u3001\u662f\u5426\u8fde\u63a5<br \/>\n\u8fde\u63a5\u3001\u53d6\u6d88\u8fde\u63a5\u3001\u662f\u5426\u8fde\u63a5\u7b49\u9700\u8981\u7ed3\u5408\u5177\u4f53\u7684\u534f\u8bae\uff0c\u6240\u4ee5\u9700\u8981\u81ea\u884c\u5c01\u88c5\u3002\u901a\u8fc7BluetoothAdapter\u7684getProfileProxy\u65b9\u6cd5\u83b7\u53d6\u5bf9\u5e94\u534f\u8bae\u7684BluetoothProfile\uff0c\u7136\u540e\u53cd\u5c04\u5176\u76f8\u5173\u65b9\u6cd5\u5b9e\u73b0\u5bf9\u8bbe\u5907\u7684\u64cd\u4f5c\u3002<\/p>\n<\/li>\n<li>\n<p>\u83b7\u53d6\u548c\u8bbe\u7f6e\u8fdc\u7a0b\u8bbe\u5907\u7684\u522b\u540d<br \/>\n\u8bbe\u7f6e\u522b\u540d\uff1a<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"language-java line-numbers\">Method method = device.getClass().getMethod(\"setAlias\", String.class);\n    if(method != null) {\n        method.invoke(device, \"new_device_name\");\n    }\n<\/code><\/pre>\n<p>\u83b7\u53d6\u522b\u540d\uff1a<\/p>\n<pre><code class=\"language-java line-numbers\"> Method method = device.getClass().getMethod(\"getAlias\");\n    if(method != null) {\n        deviceAlias = (String)method.invoke(device);\n    }\n<\/code><\/pre>\n<p>\u6709\u7684\u8bbe\u5907\u83b7\u53d6\u522b\u540d\u4e3anull,\u4e3a\u4ec0\u4e48\uff1f<\/p>\n<button class=\"simplefavorite-button\" data-postid=\"4824\" data-siteid=\"1\" data-groupid=\"1\" data-favoritecount=\"0\" style=\"\">\u6536\u85cf <i class=\"sf-icon-star-empty\"><\/i><\/button>","protected":false},"excerpt":{"rendered":"<p>https:\/\/blog.csdn.net\/zrf1335348191\/article\/detail [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[251],"tags":[],"_links":{"self":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4824"}],"collection":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4824"}],"version-history":[{"count":30,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4824\/revisions"}],"predecessor-version":[{"id":5534,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=\/wp\/v2\/posts\/4824\/revisions\/5534"}],"wp:attachment":[{"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4824"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4824"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/xinyiworld.top\/wordpress_it\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4824"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}