Я пытаюсь разработать автономное приложение для Android, в котором я бы показывал html-страницу в веб-просмотре с вызовами css и js, используя веб-сервер NanoHTTPD. HTML-файл index.html находится в папке assets, в то время как файлы js и css находятся в папке assets / lib. До сих пор мне удалось просмотреть только HTML-файл.
Это был мой файл NanoHTTPD
package jensklingenberg.de.jkandroidwebserver;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;
import android.util.Log;
import fi.iki.elonen.NanoHTTPD;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import static android.content.ContentValues.TAG;
public class MyHTTPD extends NanoHTTPD {
public static final int PORT = 8765;
private Context mContext;
public MyHTTPD(Context context) throws IOException {
super(PORT);
this.mContext = context;
}
//@Override
public Response serve(IHTTPSession session) {
Method method = session.getMethod();
String uri = session.getUri();
AssetManager assetManager = mContext.getAssets();
InputStream is = null;
String answer = "";
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line = "";
try
{
while ((line = reader.readLine()) != null) {
answer += line;
}
reader.close();
}
catch (IOException e )
{}
return newFixedLengthResponse(Response.Status.OK, "text/html", answer);
}
}
Это мой index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test Page</title>
</head>
<body>
<h1 id="pageheader">Hello There</h1>
</body>
Но всякий раз, когда я пытаюсь загрузить внешние js-файлы, как показано ниже
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Test Page</title>
<script type="text/javascript" src='lib/jquery_2.1.1.min.js'></script>
</head>
<body>
<h1 id="pageheader">Hello There</h1>
</body>
</html>
Я получаю сообщение в LogCat, в котором говорится "Uncaught SyntaxError: неожиданный токен <" </p>
Загрузка через f: /// исключена!
При поиске ответа я нашел два связанных вопроса и очень расплывчатые ответы по следующим ссылкам SO
Справочник по Android, NanoHttpd и Local jQuery
Как обслуживать внешние файлы css, jpg и gif из Nanohttpd (Nanohttpd запускается на обычном компьютере, а не на Android)?
После просмотра ответов я даже попытался изменить свой файл NanoHTTPD на следующий, но безрезультатно
package jensklingenberg.de.jkandroidwebserver;
import android.content.Context;
import android.content.res.AssetManager;
import android.os.Environment;
import android.util.Log;
import fi.iki.elonen.NanoHTTPD;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;
import static android.content.ContentValues.TAG;
public class MyHTTPD extends NanoHTTPD {
public static final int PORT = 8765;
private Context mContext;
public MyHTTPD(Context context) throws IOException {
super(PORT);
this.mContext = context;
}
//@Override
public Response serve(IHTTPSession session) {
Method method = session.getMethod();
String uri = session.getUri();
AssetManager assetManager = mContext.getAssets();
InputStream is = null;
String answer = "";
try {
is = assetManager.open("index.html");
switch (uri) {
case "/":
return newChunkedResponse(Response.Status.OK, "text/html", is);
case "lib/jquery_2.1.1.min.js":
InputStream is2 = assetManager.open("lib/jquery_2.1.1.min.js");
return newChunkedResponse(Response.Status.OK, "text/javascript", is2);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Итак, как мне успешно загрузить файлы js и css из папки assets?
P.S. - Я заметил, что большинство решений, которые я нашел, обычно возвращают ответ как таковой
return new NanoHTTPD.Response(answer);
, который не работает для меня. Это показывает мне ошибку
error: constructor Response in class Response cannot be applied to given
types;
required: IStatus,String,InputStream,long
found: String
reason: actual and formal argument lists differ in length
Вот почему я использую
return newChunkedResponse(Response.Status.OK, "text/html", is);
Может ли это также повлиять на проблему?