有问题的方法和类是BluetoothGattCharacteristic类的setInstanceId方法。 该方法声明为:
public void setInstanceId(int instanceId) {
mInstance = instanceId;
}
出于超出此问题范围但可以解释的原因,here,我正在尝试制作BluetoothGattCharacteristic对象的副本。我正在使用以下代码创建新实例:
mTxCharacteristic2 = new BluetoothGattCharacteristic(mTxCharacteristic.getUuid(),mTxCharacteristic.getProperties(), mTxCharacteristic.getPermissions());
因此,基本上,我有一个称为mTxCharacteristic的特征实例,我想复制一个mTxCharacteristic2。然后,我要打以下电话:
mTxCharacteristic2.setInstanceId(mTxCharacteristic.getInstanceId());
这将导致编译错误“错误:找不到符号方法setInstanceId(int)”。
我不了解的部分是setInstanceId被声明为该类的公共对象。那我为什么不能打电话呢?
我也试图用反射来称呼它。但是,当我打电话时:
Method setInstanceIdMethod = BluetoothGattCharacteristic.class.getDeclaredMethod("setInstanceId", int.class);
调用此方法将引发NoSuchMethodException异常。即使问题是由于SDK 24 vs. SDK 28问题造成的,我在运行时遇到异常的电话仍在运行Android9。
一个可能的解释是,可能是Android Studio实际上使用的是BluetoothGattCharacteristic类的某些旧版本,而不是在右键单击该类名称时打开的BluetoothGattCharacteristic.java类中显示的版本。我的build.gradle文件中将minSdkVersion设置为24,将targetSdkVersion设置为28。当我为BluetoothGattCharacteristic.java文件选择“在Finder中显示”时,它将在以下路径显示: 〜/ Library / Android / sdk / sources / android-28 / android / bluetooth / BluetoothGattCharacteristic.java
或者也许有某种方法可以在SDK 24中声明此方法不可用?无论哪种方式,我显然都不明白它在做什么。我对Java有点陌生,并且具有C ++背景。
答案 0 :(得分:3)
根据BluetoothGattCharacteristic
documentation,setInstanceId()
不属于公共API。
按照source code:
/**
* Force the instance ID.
*
* @hide
*/
public void setInstanceId(int instanceId) {
mInstance = instanceId;
}
此方法被标记为@hide
,因此是公开Android SDK的 not 部分,并且不保证任何单独设备上都存在该兼容性(制造商可以删除,重命名,或以其他方式更改不属于公共API表面的API。