android - 在 AOSP 设备上保持 Wifi-Direct 打开

标签 android reflection wifi android-source wifi-direct

我和我的 friend 正在开发一个应用程序,它使用 wifi-direct 在 android 设备之间传输同步音乐。我们的问题是,虽然应用程序在手机连接后运行良好,但需要做一些工作才能连接手机,因为在所有 AOSP 设备上,wifi direct 似乎仅在进入 wifi direct 菜单时打开(并在退出时立即关闭) ).这使得应用程序内连接变得相当困难。我们想知道是否有任何方法可以直接从代码中打开 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());
    }
}

最佳答案

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

在浏览了来自不同制造商的几部手机的设置,并阅读了类似 this 的页面之后和 this (诚​​然,细节不是很精确,但这是我们能找到的最好的),我们得出的结论是,没有必要单独打开 WiFi Direct 本身:它会在任何时候启用WiFi 已启用。因此,您的应用最多需要 turn on WiFi .

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

离开该页面可能会停止扫描(尽管第 3 方 apps can and do 启动他们自己的扫描),但不应禁用 WiFi Direct。那根本没有任何意义……正如您所说,这会使应用程序很难(不可能)使用 WiFi Direct,但是 apps成功使用它。当您离开该设置页面时,您看到什么让 WiFi Direct 看起来好像被禁用了?

关于android - 在 AOSP 设备上保持 Wifi-Direct 打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051687/

相关文章:

Android - 通过wifi将数据从应用程序发送到电脑

java - Android开发: Getting the name of Images

.net - 以整数开头的标识符

java - 单元测试时未找到自定义注释

android - 限制 Android 设备 Wifi 连接

android - 使用 BLE Android 4.3 如何编写特性?

安卓私钥问题。

ios - 检查 Wi-Fi 开关是否处于 ON 或 OFF 状态

.net - 获取变量(非硬编码)名称?

iOS从蓝牙接收数据,然后通过wi-fi将信息发送到另一台服务器上的数据库