保持Wifi-Direct打开AOSP设备

时间:2013-06-11 18:57:04

标签: android reflection wifi android-source wifi-direct

我的朋友和我正在开发一个应用程序,使用wifi-direct在Android设备之间传输同步音乐。我们的问题是,虽然连接手机后应用程序工作得相当好,但需要做一些工作才能连接手机,因为在所有AOSP设备上看来wifi直接只在进入wifi直接菜单时打开(并在退出后立即关闭) )。这使得应用程序内连接相当困难。我们想知道是否有任何方法可以直接从代码中打开wifi并保持开启(如果有人可以使用反射来详细描述如何使用反射这将是非常棒的。)

谢谢!这是我们目前的代码:

public class Reflector {
static Method turnOnICS;
static Method turnOnJB;
static Method turnOffICS;

public static void turnOnP2P(WifiP2pManager m, Channel c) {
    //Log.v("button", "turnOnP2P");
    if (android.os.Build.VERSION.SDK_INT == 14 || android.os.Build.VERSION.SDK_INT == 15) {
        //Log.v("version", "Version is ICS");
        try {
            turnOnICS = WifiP2pManager.class.getDeclaredMethod("enableP2p",WifiP2pManager.Channel.class);
            turnOnICS.setAccessible(true);
            turnOnICS.invoke(m, c);
        } catch (NoSuchMethodException e) {
            Log.v("ics_error", "ICS enableP2p() not found");
        } catch (Exception e) {
            Log.v("ics_error", "turnOnICS invocation failure");
        }
    } else if (android.os.Build.VERSION.SDK_INT == 16 || android.os.Build.VERSION.SDK_INT == 17) {
        //Log.v("version", "Version is JB");
        try {
            turnOnJB = NsdManager.class.getDeclaredMethod("setEnabled", boolean.class);
            turnOnJB.setAccessible(true);
            turnOnJB.invoke(NsdManager.class, true);
            //must feed it an nsdmanager, but none exists in wifidirectactivity
            Log.v("nsd", "problem");
        } catch (NoSuchMethodException e) {
            Log.v("jb_error", "JB setEnabled() not found");
        } catch (Exception e) {
            Log.v("jb_error", "turnOnJB invocation failure");
            e.printStackTrace();
        }
    }
}

public static void turnOffP2P(WifiP2pManager m, Channel c) {
    //Log.v("button", "turnOffP2P");
    if (android.os.Build.VERSION.SDK_INT == 14 || android.os.Build.VERSION.SDK_INT == 15) {
        //Log.v("version", "Version is ICS");
        try {
            turnOffICS = WifiP2pManager.class.getDeclaredMethod("disableP2p", WifiP2pManager.Channel.class);
            turnOffICS.setAccessible(true);
            turnOffICS.invoke(m, c);
        } catch (NoSuchMethodException e) {
            Log.v("ics_error", "ICS disableP2P() not found");
        } catch (Exception e) {
            Log.v("ics_error", "turnOffICS invocation failure");
        }
    }
}

public static void printAll(){
    Method[] list = WifiP2pManager.class.getDeclaredMethods();
    for(Method m : list){
        Log.v("tag",m.getName());
    }
}

}

1 个答案:

答案 0 :(得分:0)

感谢您提出这个问题......当我们向我们的应用添加WiFi Direct功能时,我们一直在努力解决这个问题。

查看来自不同制造商的多部手机上的设置,并阅读thisthis等网页(这些网页在细节方面确实不是很精确,但这是我们能找到的最好的网页),我们得出的结论是,无需单独打开WiFi Direct 本身:只要启用了WiFi,它就会启用。因此,您的应用最多需要turn on WiFi

但是,您可以通过访问WiFi Direct设置页面来启动WiFi Direct 扫描(以及扫描的可见性)。

离开该页面可能会停止扫描(虽然第三方apps can and do会启动自己的扫描,但不应禁用WiFi Direct。这根本没有任何意义......正如你所说,这将使应用程序难以(不可能)使用WiFi Direct,但apps确实成功使用它。您看到的是什么让您在离开设置页面时似乎禁用了WiFi Direct?