无法解析 WifiManager 类中的公共方法 setFrequencyBand
Posted
技术标签:
【中文标题】无法解析 WifiManager 类中的公共方法 setFrequencyBand【英文标题】:Cannot resolve public method setFrequencyBand in WifiManager class 【发布时间】:2016-06-09 16:36:14 【问题描述】:大家好
简而言之,WifiManager.java 是 Google API 为 Wifi 相关功能提供的一个源模块。
它的类声明:
public class WifiManager
显然包含许多功能,其中一些我可以访问,不,它们不是私有功能
来自类描述:
此类提供用于管理 Wi-Fi 各个方面的主要 API 连接性。通过调用获取该类的实例
@link android.content.Context#getSystemService(String) Context.getSystemService(Context.WIFI_SERVICE).
此调用此获取此 WiFi_Service 上下文,转换为类型 WiFiManager 对象:
Context context = this;
WifiManager wifiManager = (WifiManager) context.getSystemService(context.WIFI_SERVICE);
并尝试使用所需的方法
来自WiFiManager
班级:
public static final int WIFI_FREQUENCY_BAND_5GHZ = 1;
因此,调用:
wifiManager.setFrequencyBand(1, true);
导致错误:
无法解析方法'setFrequencyBand(int, boolean)'
这是我可以从 WifiManager
类访问的方法
public boolean setWifiEnabled(boolean enabled)
try
return mService.setWifiEnabled(enabled);
catch (RemoteException e)
return false;
但不是这个(还有更多):
public void setFrequencyBand(int band, boolean persist)
try
mService.setFrequencyBand(band, persist);
catch (RemoteException e)
【问题讨论】:
你在哪里发现WifiManager
中有一个setFrequencyBand
? doc 没有提到它
【参考方案1】:
看一下WifiManager
类的源码:
/**
* Set the operational frequency band.
* @param band One of
* @link #WIFI_FREQUENCY_BAND_AUTO,
* @link #WIFI_FREQUENCY_BAND_5GHZ,
* @link #WIFI_FREQUENCY_BAND_2GHZ,
* @param persist @code true if this needs to be remembered
* @hide
*/
public void setFrequencyBand(int band, boolean persist)
try
mService.setFrequencyBand(band, persist);
catch (RemoteException e)
这个方法有@hide
注解,这意味着它是隐藏API的一部分。
你不能直接调用它。
您可以通过反射或修改android.jar
来使用隐藏的 API,但强烈建议不要这样做。他们被隐藏是有原因的。它们不能保证是稳定的,它们可以随时更改,并且您的应用在未来的版本中可能很容易出现问题。
【讨论】:
【参考方案2】:看一下setFrequencyBand反射方法的源码。
强烈建议不要这样做。他们被隐藏是有原因的。它们不能保证是稳定的,它们可以随时更改,并且您的应用在未来的版本中可能很容易出现问题。
/**
* Auto settings in the driver. The driver could choose to operate on both
* 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band.
* @hide
*/
public static final int WIFI_FREQUENCY_BAND_AUTO = 0;
/**
* Operation on 5 GHz alone
* @hide
*/
public static final int WIFI_FREQUENCY_BAND_5GHZ = 1;
/**
* Operation on 2.4 GHz alone
* @hide
*/
public static final int WIFI_FREQUENCY_BAND_2GHZ = 2;
private void setFrequencyBand(WifiManager wm, int freq, boolean persist)
try
Class cls = Class.forName("android.net.wifi.WifiManager");
Method method = cls.getDeclaredMethod("setFrequencyBand", int.class, boolean.class);
method.invoke(wm, new Integer(freq), new Boolean(persist));
catch (Exception e)
e.printStackTrace();
【讨论】:
以上是关于无法解析 WifiManager 类中的公共方法 setFrequencyBand的主要内容,如果未能解决你的问题,请参考以下文章
从 javascript 类中的“私有”方法访问“公共”方法
OCUnit的测试用例类中是不是需要在公共接口中定义测试方法