Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 调试buildvariant中无法访问/res/raw下的文件_Android_Gradle_Android Studio - Fatal编程技术网

Android 调试buildvariant中无法访问/res/raw下的文件

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 这让我很困惑

在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
这让我很困惑


我做错了什么?

我认为您可以通过使用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的回答,这是对我最有效的方法

它处理:

  • 不同版本中的不同
    applicationId
    s
  • 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);