Android 调试buildvariant中无法访问/res/raw下的文件
在androidstudio/gradleandroid项目中,我有两个构建变体,Debug和Release(标准项目设置) 您可以在此图片中看到我的文件夹结构: 我有一个WebView,它应该显示/res/raw文件夹中的imprint.html。 WebView说,这在发布版本中有效,但在调试版本中无效Android 调试buildvariant中无法访问/res/raw下的文件,android,gradle,android-studio,Android,Gradle,Android Studio,在androidstudio/gradleandroid项目中,我有两个构建变体,Debug和Release(标准项目设置) 您可以在此图片中看到我的文件夹结构: 我有一个WebView,它应该显示/res/raw文件夹中的imprint.html。 WebView说,这在发布版本中有效,但在调试版本中无效 Couldn't load website under 'file///android_res/raw/imprint.hml net::EE_FILE_NOT_FOUND 这让我很困惑
Couldn't load website under 'file///android_res/raw/imprint.hml
net::EE_FILE_NOT_FOUND
这让我很困惑
我做错了什么?我认为您可以通过使用android_asset文件夹而不是原始文件夹来做同样的事情。 只需将所有的.html文件放入资产即可 语法如下:
setContentView(R.layout.webview);
webView = (WebView) findViewById(R.id.webView1);
wv.loadUrl("file:///**android_asset**/xyz.html");
试试这个,它对我有用
WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl("file:///android_res/raw/filename.html");
正如您可能已经意识到的那样,原始目录不是用于直接路径访问()的,而资产目录是首选的 从API级别8开始,您可以尝试这种稍微详细一点的方法,但我的成功率参差不齐:
WebView webview = ...;
String path = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.imprint);
webview.loadUrl(path);
或者,res路径应该使用3个斜杠和冒号,如果它不适用于调试,那么调试版本的编译方式可能会有问题,您应该显示/检查gradle文件
webview.loadUrl("file:///android_res/raw/imprint.html");
试试这个
WebView webview = (WebView) findViewById(R.id.webview);
webview.loadUrl("file:///android_res/raw/filename.html");
尝试删除调试模式的后缀 此外,请确保您在proguard规则中
-keepclassmembers class **.R$* {public static <fields>;}
-keep class **.R$*
第二次编辑:
如果这仍然不起作用(尽管对我来说它起作用),请尝试以下操作:使用输入流将文件加载到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");
我也有同样的问题,原因是调试风格不同的
applicationId
。
根据DDsix的回答,这是对我最有效的方法
它处理:
- 不同版本中的不同
sapplicationId
- HTML中的特殊字符(åäá)
- 不同原始文件夹(原始、原始en、原始xyz)中HTML文件的本地化
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");
如果您使用的CSS也在原始文件夹中,请使用loadDataWithBaseURL()
而不是loadData()
mWebView.loadDataWithBaseURL("file:///android_res/raw/", html, "text/html; charset=utf-8", "UTF-8", null);
尝试将html放入资源中。像
file:///android_asset/imprint.html
你解决了这个问题吗?@Xero抱歉,我不知道,很久没试过了。但是我想不起有什么特别的解决方案。你能展示一下试图引用这个文件并在显示时生成错误的代码吗?如果没有代码,您可能只会得到推测。请在此处使用您的gradle文件和完整崩溃列表进行更新,好吗?在使用发布版本类型时工作正常,但在使用调试版本类型时不起作用。不幸的是,此解决方案不支持默认的Android国际化。我已使用webview.loadUrl进行了尝试("file:///android_res/raw/eula_consumer.html")
并且可以确认它不起作用。请检查问题注释中的gradle设置。恐怕删除后缀不是我的选择。proguard规则不会更改任何内容,因为调试构建类型不使用proguard。删除它以查看这是否是问题所在。如果这是导致问题的原因,您将不得不加载资源以另一种方式。首先看看这是否是问题所在,然后我们会找到一种方法来解决它。当我删除后缀时,它工作得很好。那么是否有任何选项可以使用后缀并仍然能够加载html文件?尽管有后缀,所有其他资源都工作得很好。好的,您的第一次更新加载一个空白的webview;没有任何异常或错误。您第二次更新成功了。干得好!
mWebView.loadDataWithBaseURL("file:///android_res/raw/", html, "text/html; charset=utf-8", "UTF-8", null);