NanoHTTPd 使用网络蓝牙 API

如何解决NanoHTTPd 使用网络蓝牙 API

我制作了一个简单的网络应用程序。 这包含 html 和 js。 在网页上,您应该能够扫描蓝牙设备。 这是通过 Web 蓝牙 API 实现的。

如果我使用应用程序“AWebServer”在 android 上托管 www 目录,然后使用 chrome 浏览器访问此页面“http://localhost:8080”,这会正常工作。

但我想直接从一个单独的应用程序中获取所有内容。 所以我制作了一个应用程序,它使用 NanoHTTPd 从资产文件夹托管网页。 该网站目前可以正常使用,只有连接蓝牙设备的按钮不再起作用。

网络蓝牙的代码来自:https://github.com/hakatashi/giiker

import GiiKER from 'giiker';

// Note: To use Web Bluetooth API trigger action such as button click is required
const button = document.querySelector('button#connect');
button.addEventListener('click',async () => {
    const giiker = await GiiKER.connect();
    giiker.on('move',(move) => {
        console.log(move.face); //=> "F"
        console.log(move.amount); //=> -1
        console.log(move.notation); //=> "F'"
    });
})

NanoHTTPd 的代码如下:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    private SimpleWebServer server = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        startLocalServer(3000,"www",true,true );
    }


    public void startLocalServer(int port,String root,Boolean localhost,Boolean keepAlive) {
        try {
            String[] filePathList =(getAssets().list("www"));
            for (String s : filePathList) {
                System.out.println(s);
            }
            MainActivity.copyFolderFromAssets(this.getApplicationContext(),getApplicationInfo().dataDir + '/' + root);
            File www_root = new File(getApplicationInfo().dataDir + '/' + root);
            System.out.println(www_root.listFiles());
            server = new WebServer("localhost",port,www_root.getCanonicalFile());
            server.start();
        } catch (IOException e) {
            e.printstacktrace();
        }
    }

    public static void copyFolderFromAssets(Context context,String rootDirFullPath,String targetDirFullPath) {
        System.out.println("copyFolderFromAssets " + "rootDirFullPath-" + rootDirFullPath + " targetDirFullPath-" + targetDirFullPath);
        File file = new File(targetDirFullPath);
        if (!file.exists()) {
            new File(targetDirFullPath).mkdirs();
        }
        try {
            String[] listFiles = context.getAssets().list(rootDirFullPath);
            for (String string : listFiles) {
                if (isFileByName(string)) {
                    copyFileFromAssets(context,rootDirFullPath + "/" + string,targetDirFullPath + "/" + string);
                } else {
                    String childRootDirFullPath = rootDirFullPath + "/" + string;
                    String childTargetDirFullPath = targetDirFullPath + "/" + string;
                    new File(childTargetDirFullPath).mkdirs();
                    copyFolderFromAssets(context,childRootDirFullPath,childTargetDirFullPath);
                }
            }
        } catch (IOException e) {
            e.printstacktrace();
        }
    }


    public static void copyFileFromAssets(Context context,String assetsFilePath,String targetFileFullPath) {
        InputStream assestsFileInputStream;
        try {
            assestsFileInputStream = context.getAssets().open(assetsFilePath);
            FileOutputStream fOS = new FileOutputStream(new File(targetFileFullPath));
            int length = -1;
            byte[] buf = new byte[1024];
            while ((length = assestsFileInputStream.read(buf)) != -1) {
                fOS.write(buf,length);
            }
            fOS.flush();
        } catch (IOException e) {
            e.printstacktrace();
        }
    }

    private static boolean isFileByName(String str) {
        return str.contains(".");
    }
}

WebServer.java

public class WebServer extends SimpleWebServer
{
    public WebServer(String localAddr,int port,File wwwroot) throws IOException {
        super(localAddr,wwwroot,"*");

        mimeTypes().put("xhtml","application/xhtml+xml");
        mimeTypes().put("opf","application/oebps-package+xml");
        mimeTypes().put("ncx","application/xml");
        mimeTypes().put("epub","application/epub+zip");
        mimeTypes().put("otf","application/x-font-otf");
        mimeTypes().put("ttf","application/x-font-ttf");
        mimeTypes().put("js","application/javascript");
        mimeTypes().put("svg","image/svg+xml");
    }

    @Override
    protected boolean useGzipwhenAccepted(Response r) {
        return super.useGzipwhenAccepted(r) && r.getStatus() != Response.Status.NOT_MODIFIED;
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?