【问题标题】:Android: How to load local zip-compressed audio files in WebViewAndroid:如何在 WebView 中加载本地 zip 压缩的音频文件
【发布时间】:2018-12-16 10:31:22
【问题描述】:

我在 Android 上创建了一个 WebView,用于加载 HTML,如下所示:

<audio controls>
  <source src="zip://resource?fileName=apple.wav" type="audio/wav">
</audio>

apple.wav 存储在本地 zip 文件中。我想要的是,当用户单击音频组件上的“播放”按钮时,WebView 将尝试从 zip 文件中加载 wav 音频。目前我尝试的是创建一个本地的WebViewClient,如下。

public class MyWebViewClient extends WebViewClient {
    @Override
    public WebResourceResponse shouldInterceptRequest(final WebView view, String url) {
        if (url.startsWith("zip://resource")) {
            Uri uri = Uri.parse(url);
            String fileName = uri.getQueryParameter("fileName");
            byte[] resourceContents = getResource(fileName);
            WebResourceResponse webResourceResponse = new WebResourceResponse("audio/wav",
                    "UTF-8", new ByteArrayInputStream(resourceContents));
            Map<String, String> responseHeaders = new HashMap<>();

            responseHeaders.put("Content-Type", "audio/wav");
            webResourceResponse.setResponseHeaders(responseHeaders);
            return webResourceResponse;
        } else {
            return super.shouldInterceptRequest(view, url);
        }
    }
    private byte[] getResource(String resourceName) {
        // read the audio contents from the pre-determined zip file
    }
}

然后将其分配给 WebView。

WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new MyWebViewClient());

但它没有用。当我点击“播放”按钮时,什么也没发生。我在网上找了很久,唯一相关的问题是this one,但是这个问题的答案并不优雅,涉及修改HTML和将音频文件写入sdcard。

为什么我的代码不起作用?有没有优雅的方法让它工作?

【问题讨论】:

    标签: android


    【解决方案1】:

    我终于用 WebInterface 解决了这个问题,这也不是一个优雅的解决方案,音频文件必须在播放之前写入磁盘。但它奏效了。

    这是我使用的 HTML:

    <button onclick='Audio.playAudio()' />
    

    创建一个网络接口:

    import android.media.MediaPlayer;
    import android.webkit.JavascriptInterface;
    
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class PlayAudioWebInterface {
        @JavascriptInterface
        public void playAudio() {
            try {
                MediaPlayer mp = new MediaPlayer();
                FileInputStream fis = getFileInputStream();
                mp.setDataSource(fis.getFD());
                fis.close();
                mp.prepare();
                mp.start();
            } catch (Exception e) {
                Logger.debug("Couldn't play audio");
            }
        }
        private FileInputStream getFileInputStream() throws IOException {
            File resourceFile = new File("/data/data/com.example/files/test.wav");
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(resourceFile));
            bos.write(extractWAVContents());
            bos.flush();
            bos.close();
            return new FileInputStream(resourceFile);
        }
        private byte[] extractWAVContents() {
            // extract wav from zip
        }
    }
    

    将其分配给 WebView

    webView.getSettings().setJavaScriptEnabled(true);
    webView.addJavascriptInterface(new PlayAudioWebInterface(), "Audio");
    

    【讨论】:

      猜你喜欢
      • 2015-03-08
      • 2014-01-19
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多