无法解析 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的测试用例类中是不是需要在公共接口中定义测试方法

无法解析“myAdapter”中的方法“getContext”[重复]

避免公共类中的代码重复