В Android-проекте Android/ Gradle Android у меня есть два варианта сборки: Debug And Release (стандартная настройка проекта).
Вы можете увидеть мою структуру папок на этом рисунке:
![enter image description here]()
У меня есть WebView, который должен отображать imprint.html из /res/raw -folder.
Это работает в сборке релизов, но не в сборке отладки, WebView говорит
Couldn't load website under 'file///android_res/raw/imprint.hml
net::EE_FILE_NOT_FOUND
который меня озадачивает.
Что я делаю неправильно?
Ответ 1
Попробуйте удалить суффикс в режим отладки.
Кроме того, убедитесь, что в правилах proguard у вас есть
-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*
EDIT:
После выяснения проблемы (суффикс пакета отладки ".debug" ) попробуйте загрузить файл следующим образом:
String path = "android.resource://" + getPackageName() + "/" + R.raw.my_web_file;
Uri myFileUri = Uri.parse(path);
File file = new File(myFileUri.toString());
webview.loadUrl(file.getAbsolutePath());
2nd EDIT:
Если это все еще не работает (хотя для меня это работает), попробуйте это: загрузите файл в webview с помощью входного потока.
String prompt = "";
try {
InputStream inputStream = getResources().openRawResource(R.raw.my_web_file);
byte[] buffer = new byte[inputStream.available()];
inputStream.read(buffer);
prompt = new String(buffer);
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
webview.loadData(prompt,"text/html","utf-8");
Ответ 2
Попробуйте это, он работает для меня.
WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl("file:///android_res/raw/filename.html");
Ответ 3
Как вы могли убедиться, исходный каталог не предназначен для прямого доступа к пути (см. документы), а каталог ресурсов предпочтительнее.
От уровня API 8 вы можете попробовать этот несколько более подробный метод, но у меня был смешанный успех:
WebView webview = ...;
String path = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.imprint);
webview.loadUrl(path);
Альтернативно путь res должен работать с тремя слэшами и двоеточием, присутствующими, если он не работает для Debug, может возникнуть проблема с тем, как скомпилирована ваша версия отладки, вы должны показать/проверить ваш файл gradle
webview.loadUrl("file:///android_res/raw/imprint.html");
Ответ 4
Я думаю, что вы можете сделать то же самое, используя папку android_asset вместо исходной папки.
Просто поместите все ваши .html файлы в актив.
Синтаксис выглядит следующим образом:
setContentView(R.layout.webview);
webView = (WebView) findViewById(R.id.webView1);
wv.loadUrl("file:///**android_asset**/xyz.html");
Ответ 5
У меня была одна и та же проблема, и причина этого заключалась в различном applicationId
отладочном вкусе.
Основываясь на ответе DDsix, это то, что сработало лучше всего для меня.
Он обрабатывает:
- Различные
applicationId
в разных вариантах сборки
- Специальные символы в HTML (åäá)
- Локализация HTML файла в разных исходных папках (raw, raw-en, raw-xyz)
код
InputStream inputStream = getResources().openRawResource(rawFileResId);
StringBuilder stringBuilder = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
// Log Exception
} finally {
try {
inputStream.close();
} catch (IOException e) {
// Log Exception
}
}
String html = stringBuilder.toString();
webView.loadData(html, "text/html; charset=utf-8", "UTF-8");
Используйте loadDataWithBaseURL()
вместо loadData()
, если вы используете CSS, который также находится в необработанной папке
mWebView.loadDataWithBaseURL("file:///android_res/raw/", html, "text/html; charset=utf-8", "UTF-8", null);
Ответ 6
Попробуйте это
WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl("file:///android_res/raw/filename.html");