Вопрос по android, android-assets, webview, audio – Android: воспроизведение звука активов с помощью WebView

8

Я пытаюсь воспроизвести звук из папки ресурсов, когда пользователь нажимает на тег в WebView моего приложения. Я обнаружил, что могу использовать новый класс, расширяющий WebViewClient, для определения расширения ссылки и, если это mp3-файл, он может воспроизводить его через стандартный аудиоплеер. Но я хочу, чтобы он играл в игре, не запуская новую игру.

Я использовал следующие ссылки в качестве ссылок: Звук в Webview а такжеОшибка создания MediaPlayer с Uri или файлом в активах

Но это не сработало.

Я попытался использовать следующие коды для этого:

package com.rangga.test.webview.sound;

import android.content.Intent;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.net.Uri;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient{

    public MediaPlayer mp;

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        if(url.endsWith(".mp3")){
            mp = new MediaPlayer();
            AssetFileDescriptor afd = getAssets().openFd(url);
            mp.setDataSource(afd.getFileDescriptor());
            mp.start();

            return true;
        }else{
            return true;
        }


    }

}

Я получаю неопределенную ошибку метода в getAssets (), я попробовал Googleing, и это говорит о передаче контекста. Я очень новичок в Android и объектно-ориентированном программировании, поэтому мне интересно, если это правильный способ сделать это и есть ли простое объяснение того, что такое контекст. Спасибо.

Ниже приведены мои полные коды:

MainActivity.class

package com.rangga.test.webview.sound;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;

public class MainActivity extends Activity {

    WebView webMain;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        webMain = (WebView) findViewById(R.id.webMain);

        webMain.loadUrl("file:///android_asset/webpages/test.html");
        webMain.setWebViewClient(new MyWebViewClient());
    }


}

EDIT

Так что коды работают благодаряhttps://stackoverflow.com/users/488241/squonk но теперь возникает другая проблема, я обновил MyWebViewClient в следующем:

package com.rangga.test.webview.sound;

import java.io.IOException;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient{

    public MediaPlayer mp;
    private Context context = null;

    public MyWebViewClient(Context c){
        this.context = c;
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        if(url.endsWith(".mp3")){

            mp = new MediaPlayer();
            try {
                AssetFileDescriptor afd = context.getAssets().openFd(url);
                mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                afd.close();
                mp.prepare();
                mp.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            return true;
        }else{
            return true;
        }   
    }
}

Но я получаю исключение java.io.FileNotFoundException, хотя путь кажется правильным. Я поместил 2 mp3-файла в assets / webpages / sounds / 1.mp3 и assets / webpages / 1.mp3 и использовал следующие html-коды для его проверки:

<html>
    <head>
        <title>Test Audio</title>
    </head>
    <body>
        <a href="file:///android_asset/webpages/sounds/1.mp3">File Asset</a><br/>
        <a href="1.mp3">Same Folder</a>
    </body>
</html>

Но я получаю следующую ошибку на LogCat:

06-11 06:20:37.955: W/System.err(377): java.io.FileNotFoundException: file:///android_asset/webpages/1.mp3
06-11 06:20:37.966: W/System.err(377):  at android.content.res.AssetManager.openAssetFd(Native Method)
06-11 06:20:37.974: W/System.err(377):  at android.content.res.AssetManager.openFd(AssetManager.java:314)
06-11 06:20:37.974: W/System.err(377):  at com.rangga.test.webview.sound.MyWebViewClient.shouldOverrideUrlLoading(MyWebViewClient.java:30)
06-11 06:20:37.985: W/System.err(377):  at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:193)
06-11 06:20:38.000: W/System.err(377):  at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:304)
06-11 06:20:38.005: W/System.err(377):  at android.os.Handler.dispatchMessage(Handler.java:99)
06-11 06:20:38.005: W/System.err(377):  at android.os.Looper.loop(Looper.java:123)
06-11 06:20:38.014: W/System.err(377):  at android.app.ActivityThread.main(ActivityThread.java:4363)
06-11 06:20:38.014: W/System.err(377):  at java.lang.reflect.Method.invokeNative(Native Method)
06-11 06:20:38.024: W/System.err(377):  at java.lang.reflect.Method.invoke(Method.java:521)
06-11 06:20:38.024: W/System.err(377):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-11 06:20:38.024: W/System.err(377):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-11 06:20:38.054: W/System.err(377):  at dalvik.system.NativeStart.main(Native Method)

Что-то не так с тем, как я назвал файл? Спасибо, прежде чем.

SOLVED

Спасибо за предложения, я попробовал следующие коды, чтобы он заработал, и это сработало, спасибо, squonk!

package com.rangga.test.webview.sound;

import java.io.IOException;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.media.MediaPlayer;
import android.util.Log;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient{

    public MediaPlayer mp;
    private Context context = null;

    public MyWebViewClient(Context c){
        this.context = c;
        mp = new MediaPlayer();
    }

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url){
        if(url.endsWith(".mp3")){
            url = url.replace("file:///android_asset/webpages/", "");
            Log.i("MyWebViewClient", url);
            try {
                AssetFileDescriptor afd = context.getAssets().openFd(url);
                mp = new MediaPlayer();
                mp.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
                afd.close();
                mp.prepare();
                mp.start();
            } catch (IllegalArgumentException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IllegalStateException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


            return true;
        }else{
            return true;
        }   
    }
}

И HTML, чтобы проверить это:

<html>
    <head>
        <title>Test Audio</title>
    </head>
    <body>
        <a href="webpages/1.mp3">File Asset</a><br/>
    </body>
</html>

Хотя я и получил ошибку, если несколько раз щелкнул по ней, но это другой вопрос: D Как закрыть свой вопрос? & GT;. & Л;

Ваш Ответ

1   ответ
3

MediaPLayer вMyWebViewClientдобавьте следующее ...

public class MyWebViewClient extends WebViewClient{

    public MediaPlayer mp;
    private Context context = null; // Add this line

    ...
}

Затем добавьте конструкторMyWebViewClient следующее...

public MyWebViewClient(Context context) {
    this.context = context;
}

Затем вshouldOverrideUrlLoading(...) получить ваши активы следующим образом ...

AssetFileDescriptor afd = context.getAssets().openFd(url);

В вашемMainActivity установитьWebViewClient мимоходомthis (что такое деятельностьContext) следующее...

webMain.setWebViewClient(new MyWebViewClient(this));

Также вы должны вернутьсяfalse отshouldOverrideUrlLoading(...) если URL оканчивается на «.mp3»; - это показывает вашWebView обрабатывает вещи и "хост" Приложение не должно запускать экземпляр стандартного веб-браузера.

EDIT: Чтобы воспроизвести аудиофайлы из каталога активов, вам нужно установить источник данных по-другому - см. Принятый ответ наиграть-аудиофайл-из-активов-каталог.

Также вам следует позвонитьmp.prepare() перед звонкомmp.start().

@RanggaWiratno: см. РЕДАКТИРОВАТЬ в конце моего ответа.
Вау, спасибо, по крайней мере, беги сейчас, ты, сэр, легенда ... подожди ... Дэрри! Но когда я нажимаю на ссылки 1 и 3, он получает исключение java.oi.FileNotFoundException, и кажется, что путь по ссылке неверный & gt;. & Lt; в то время как ссылка 2 просто открывает страницу недоступную веб-страницу. Есть ли способ воспроизвести звук в файле актива или должен быть в сыром файле или SDCard? Rangga Wiratno
Я отредактировал свой вопрос, надеюсь, он поможет вам ответить на него, еще раз спасибо: D Rangga Wiratno
Да, но, к сожалению, это тоже не сработало, я попробую протестировать его с другими похожими проектами. Хорошо, спасибо большое, эй: D Rangga Wiratno
Да, на самом деле я тоже попробовал следующее. Я добавил параметры в afd и добавил mp.prepare () и afd.close () перед mp.start () после прочтения этогоdroidapp.co.uk/?p=272 но странная вещь, я все еще получаю исключение java.io.FileNotFoundException, хотя путь правильный. Я попытался возиться с html, но все еще не могу понять, что это правильно. Файл href =: ///android_asset/webpages/sounds/1.mp3" & gt; Файловый актив & lt; / a & gt; & lt; br / & gt ; и & lt; a href = "1.mp3"; та же папка / a & gt ;. Я поместил 2 файла для его проверки в ресурсах & gt; веб-страницы & gt; 1.mp3 и активах & gt; веб-страницы & gt; sounds & gt; 1.mp3 Rangga Wiratno

Похожие вопросы