Android Q 預覽版剛出來的時候,就出現一大波文章說,Google將於Android Q摒棄Android Beam,說其效率低,用戶使用率不高等等。。。
那麼到了Android Q , Android beam如果要開呢?
怎麼辦?
從AOSP Framework中可以看出,其實還是開了一個API給道OEM來自己定製化這個功能。
frameworks/base/core/java/android/content/pm/PackageManager.java
/**
* Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The Beam API is enabled on the device.
*/
@SdkConstant(SdkConstantType.FEATURE)
public static final String FEATURE_NFC_BEAM = "android.sofware.nfc.beam";
可以看出,到了Android Q 版本,beam需要像HCE那樣通過feature的方式來開啓功能。
這就意味着,需要在手機中生成相應的feature xml文件來開啓。
那麼Nfc模塊裏邊是怎麼處理的呢?
packages/apps/Nfc/src/com/android/nfc/NfcService.java
PackageManager pm = mContext.getPackageManager();
mIsBeamCapable = pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM);//判斷
mIsNdefPushEnabled =
mPrefs.getBoolean(PREF_NDEF_PUSH_ON, NDEF_PUSH_ON_DEFAULT) &&
mIsBeamCapable;
if (mIsBeamCapable) {
mP2pLinkManager = new P2pLinkManager(
mContext, mHandoverDataParser, mDeviceHost.getDefaultLlcpMiu(),
mDeviceHost.getDefaultLlcpRwSize());
}
enforceBeamShareActivityPolicy(mContext, new UserHandle(mUserId));
Settings中Android Beam菜單怎麼處理的?
/packages/apps/MtkSettings/src/com/android/settings/nfc/AndroidBeamPreferenceController.java
@Override
@AvailabilityStatus
public int getAvailabilityStatus() {
PackageManager pm = mContext.getPackageManager();
if (!pm.hasSystemFeature(PackageManager.FEATURE_NFC_BEAM)) {
return UNSUPPORTED_ON_DEVICE;
}
return mNfcAdapter != null
? AVAILABLE
: UNSUPPORTED_ON_DEVICE;
}
都是隻需要通過這個feature來判斷,接下來就是怎麼來加這feature。
1.首先,建立個android.sofware.nfc.beam.xml文件,裏邊內容如下:
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2013 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!-- This feature indicates that the device supports Android Beam -->
<permissions>
<feature name="android.sofware.nfc.beam" />
</permissions>
注意是sofware,而不是software單詞,這個要跟PackageManager提供的API一致,其餘的都是使用software單詞,例如:midi.
不知這是故意爲之,還是個美麗小失誤。
見手機目錄內容如下:
注意,
這個文件需要自己創建,AOSP默認已經不提供此文件了。
原來像HCE這些,都在framework目錄中有提供。
看效果:
添加android.sofware.nfc.beam.xml後。
到這裏,就成功地將Android Beam恢復了。
說Android Q移除Andriod beam, 無非就是在原來默認添加的基礎上,加了一層判斷障礙,一旦不滿足,就默認移除P2p模式。