ResponsiveVoice не работает, когда страница загружена в веб-браузере Android

Это хорошо работает, когда я нажимаю кнопку:

<!DOCTYPE html>
<html>
<head>


    <script src="https://code.responsivevoice.org/responsivevoice.js"></script>

    </head >

<body>

<button onclick="responsiveVoice.speak('Welcome to the Responsive Voice website');">Click</button>

</body>
</html>

но не работает, когда я хочу воспроизвести речь, когда страница загружена в веб-просмотр:

<!DOCTYPE html>
<html>
<head>

    <script src="https://code.responsivevoice.org/responsivevoice.js"></script>

    </head >

<body>

<script>

   setTimeout(responsiveVoice.speak("Welcome to the Responsive Voice  website"),500);

</script>
</body>
</html>

Код Android:

public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        WebView webView = (WebView) findViewById(R.id.myWebview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.loadUrl("file:///android_asset/index.html");


    }

Файл манифеста:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.abdallah.test">

    <WebView  xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        />

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission  android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Это журнал системы, когда я нажимаю кнопку:

I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(63)] "RV: speechSynthesis present but no system voices found", source: https://code.responsivevoice.org/responsivevoice.js (63)
I/chromium: [INFO:CONSOLE(64)] "RV: Enabling fallback mode", source: https://code.responsivevoice.org/responsivevoice.js (64)
D/MediaResourceGetter: ethernet/wifi connection detected
D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= SonyD5803 Build/23.4.A.1.232 stagefright/1.2 (Linux;Android 5.1.1)
D/MediaHTTPConnection: proxy null port 0
D/MediaResourceGetter: resource doesn't have video
D/MediaResourceGetter: extracted valid metadata: MediaMetadata[durationInMilliseconds=0, width=0, height=0, success=true]
E/MediaPlayer-JNI: QCMediaPlayer mediaplayer NOT present
D/MediaPlayer: Couldn't open file on client side, trying server side
D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= SonyD5803 Build/23.4.A.1.232 stagefright/1.2 (Linux;Android 5.1.1)
D/MediaHTTPConnection: filterOutInternalHeaders: key=allow-cross-domain-redirect, val= false
D/MediaHTTPConnection: filterOutInternalHeaders: key=x-wap-profile, val= http://uaprof.sonymobile.com/D5803R2321.xml
D/MediaHTTPConnection: proxy null port 0
E/MediaPlayer: Should have subtitle controller already set
D/MediaPlayer: getMetadata

Это когда я хочу воспроизводить речь при загрузке страницы:

I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(62)] "Voice support NOT ready", source: https://code.responsivevoice.org/responsivevoice.js (62)
I/chromium: [INFO:CONSOLE(63)] "RV: speechSynthesis present but no system voices found", source: https://code.responsivevoice.org/responsivevoice.js (63)
I/chromium: [INFO:CONSOLE(64)] "RV: Enabling fallback mode", source: https://code.responsivevoice.org/responsivevoice.js (64)
D/MediaResourceGetter: ethernet/wifi connection detected
D/MediaHTTPConnection: filterOutInternalHeaders: key=User-Agent, val= SonyD5803 Build/23.4.A.1.232 stagefright/1.2 (Linux;Android 5.1.1)
D/MediaHTTPConnection: proxy null port 0
D/MediaResourceGetter: resource doesn't have video
D/MediaResourceGetter: extracted valid metadata: MediaMetadata[durationInMilliseconds=0, width=0, height=0, success=true]

1 ответ

Решение

ResponsiveVoice говорит:

В iOS некоторые события, такие как синтез речи, должны запускаться с помощью действия пользователя (например, щелчка). Это заставляет ResponsiveVoice говорить вызовы, чтобы не работать, например, при загрузке страницы

С помощью синтезатора речи это инициируемое пользователем действие необходимо выполнить только один раз. Дальнейшие прямые звонки после первого будут работать как положено.

Таким образом, рекомендуется использовать кнопку "Пуск", чтобы пользователь мог щелкнуть ее, и использовать ее в качестве вызова инициализации responseiveVoice.speak(). Этот вызов, при желании, может иметь пустое пространство в виде текста, поэтому он не оказывает влияния на пользователя.

Я думаю, что Android-то же самое, но я нашел решение моей проблемы:

Сначала я загружу html-страницу, содержащую функцию javascript для преобразования текста в речь. Затем загрузите саму функцию, как показано ниже:

final Handler handler=new Handler();
handler.postDelayed(new Runnable() {

                        public void run() {
                            WebView webView = (WebView) findViewById(R.id.myWebview);
                            webView.loadUrl("javascript:speak('" + s + "');");

                        }
                    }, 5000 );
Другие вопросы по тегам