Файл под /res/raw недоступен в Debug buildvariant

В 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");