android - 在 Android 中使用 NanoHTTPD

标签 android file http nanohttpd

我正在尝试使用 NanoHTTP 来提供 HTML 文件。然而,NanoHTTP 相对没有文档,而且我是 Android 新手。我的问题是,我在哪里存储 html 文件,以及如何具体地使用 NanoHTTP 提供它。

最佳答案

一个迟到的答案,但可能对其他人有用。

这是一个简单的 hello Web Server,与您所要求的不完全一样,但您可以从这里继续。下面的程序假设你在 SD 卡的根目录下有一个 www 目录,里面有一个文件 index.html

主要 Activity Httpd.java:

package com.inforscience.web;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import java.io.*;
import java.util.*;


public class Httpd extends Activity
{
    private WebServer server;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        server = new WebServer();
        try {
            server.start();
        } catch(IOException ioe) {
            Log.w("Httpd", "The server could not start.");
        }
        Log.w("Httpd", "Web server initialized.");
    }


    // DON'T FORGET to stop the server
    @Override
    public void onDestroy()
    {
        super.onDestroy();
        if (server != null)
            server.stop();
    }

    private class WebServer extends NanoHTTPD {

        public WebServer()
        {
            super(8080);
        }

        @Override
        public Response serve(String uri, Method method, 
                              Map<String, String> header,
                              Map<String, String> parameters,
                              Map<String, String> files) {
            String answer = "";
            try {
                // Open file from SD Card
                File root = Environment.getExternalStorageDirectory();
                FileReader index = new FileReader(root.getAbsolutePath() +
                        "/www/index.html");
                BufferedReader reader = new BufferedReader(index);
                String line = "";
                while ((line = reader.readLine()) != null) {
                    answer += line;
                }
                reader.close();

            } catch(IOException ioe) {
                Log.w("Httpd", ioe.toString());
            }


            return new NanoHTTPD.Response(answer);
        }
    }

}

显然 NanoHTTPD 类必须在同一个包中。

您需要在 AndroidManifest.xml 中授予互联网权限。

<uses-permission android:name="android.permission.INTERNET" />

并读取外部存储权限。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

编辑:要访问服务器,请使用您设备的 IP 打开您的网络浏览器,例如192.168.1.20:8080.

注意事项:

关于android - 在 Android 中使用 NanoHTTPD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14309256/

相关文章:

php - $_FILES 数组及其愚蠢的结构

android - 在/sdcard 中创建目录失败

c - 如何在 C 语言中删除文件末尾不需要的字符?

javascript - 如何使第三方 javascript 函数使异步行为像 angular2 http 请求一样?

android - Gradle (Android Studio) 不会编译 9patches

android - 如何确保特定 xml 中的每个字符串都被翻译成 Android 中的另一个 xml?有什么好的做法吗?

Android 在元素下方包含布局

unit-testing - 如何在golang中为http请求编写单元测试?

AngularJS:无法读取未定义的 $http 的属性 'get'

php - 使用 GCM 将推送通知发送到我的 Android 应用程序的所有设备