Почему я не слышу звук из аудио-потоковой ссылки? - PullRequest
0 голосов
/ 15 мая 2019

ОБНОВЛЕНИЕ 20/20/2019: в манифест добавлены разрешения на использование и -функции; тот же результат, хотя. Обновления, внесенные в файл скрипта ниже.

У меня есть виджет webView, который загружает URL. Веб-сайт URL имеет кнопку воспроизведения одним щелчком мыши, чтобы открыть аудиопоток. Хотя URL-адрес будет загружен в веб-представление, и пользователь может нажать кнопку воспроизведения, чтобы открыть аудиопоток, я не слышу никакого звука, как если бы я загружал этот URL-адрес в браузере телефона по умолчанию, например в Safari.

Я думал, что метод webView будет работать, но он не позволяет мне слышать звук.

Я думаю, что это как-то связано с моими разрешениями в манифесте, так что вот оно ...

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

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-feature android:name="android.hardware.bluetooth" />
    <uses-feature android:name="android.hardware.camera" />
    <uses-feature android:name="android.media.MediaPlayer"/>
    <uses-feature android:name="android.media.AudioManager"/>
    <uses-feature android:name="android.media.AudioPlaybackConfiguration"/>
    <uses-feature android:name="android.media.MediaRouter"/>
    <uses-feature android:name="android.media.PlaybackParams"/>
    <uses-feature android:name="android.media.audiofx"/>



    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher"
        android:theme="@style/AppTheme"
        tools:ignore="GoogleAppIndexingWarning">

        <activity
            android:name=".facebook"
            android:parentActivityName=".MainActivity"/>

        <activity
            android:name=".twitter"
            android:parentActivityName=".MainActivity"/>

        <activity
            android:name=".wyum"
            android:parentActivityName=".MainActivity"/>

        <activity
            android:name=".wtcq"
            android:parentActivityName=".MainActivity"/>

        <activity
            android:name=".wvop"
            android:parentActivityName=".MainActivity"/>

        <activity
            android:name=".sega"
            android:parentActivityName=".MainActivity"/>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.sega" />
                <action android:name="android.intent.action.wvop" />
                <action android:name="android.intent.action.wtcq" />
                <action android:name="android.intent.action.wyum" />
                <action android:name="android.intent.action.twitter" />
                <action android:name="android.intent.action.facebook" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest>

на всякий случай, это java; вот это ...

package com.app.sega;

import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class wvop extends AppCompatActivity {
    private WebView webview_v;
        public class WebInterface_v {
            Context vContext;

            WebInterface_v (Context c) {
                vContext = c;
            }

            @JavascriptInterface
            public void playSound(String toast) {
                Toast.makeText(vContext, toast, Toast.LENGTH_SHORT).show();
            }

            @JavascriptInterface
            public void pauseSound(String toast) {
                Toast.makeText(vContext, toast, Toast.LENGTH_SHORT).show();
            }
        }
    private class WebViewClient_v extends WebViewClient {

        public boolean shouldOverrideURLLoading (WebView view, String url) {
            if (Uri.parse(url).getHost().equals("https://us7.maindigitalstream.com/2782/")) {
                return false;
            }else {
                Intent intent_wvop = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                startActivity(intent_wvop);
                return true;
            }
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_wvop);

        webview_v = (WebView) findViewById(R.id.webview_wvop);
        webview_v.setInitialScale(1);
        webview_v.setWebViewClient(new WebViewClient_v());
        WebSettings webSettings_v = webview_v.getSettings();
            webSettings_v.setJavaScriptEnabled(true);
            webSettings_v.setAllowContentAccess(true);
            webSettings_v.setDomStorageEnabled(true);
        webview_v.getSettings().getJavaScriptEnabled();
        webview_v.getSettings().setJavaScriptEnabled(true);
        webview_v.addJavascriptInterface(new WebInterface_v (this), "Android");
        webview_v.getSettings().getLoadWithOverviewMode();
        webview_v.getSettings().setUseWideViewPort(true);
        webview_v.getSettings().setAllowFileAccess(true);
        webview_v.getSettings().setAllowFileAccessFromFileURLs(true);
        webview_v.getSettings().setAllowContentAccess(true);
        webview_v.setScrollbarFadingEnabled(false);
        webview_v.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY);
        webview_v.getSettings().getBuiltInZoomControls();
        webview_v.getSettings().getUseWideViewPort();
        webview_v.getSettings().setDomStorageEnabled(true);
        webview_v.getSettings().setUserAgentString("silly_that_i_have_to_do_this");
        webview_v.loadUrl("https://us7.maindigitalstream.com/2782/");
        int SDK_INT = android.os.Build.VERSION.SDK_INT;
            if (SDK_INT > 16) {
            webview_v.getSettings().setMediaPlaybackRequiresUserGesture(false);
        }
    }


}


Не думаю, что это имеет какое-либо отношение к макету, но на всякий случай вот оно ...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"    
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <WebView android:id="@+id/webview_wvop"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

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

int SDK_INT = android.os.Build.VERSION.SDK_INT;
            if (SDK_INT > 16) {
            webview_v.getSettings().setMediaPlaybackRequiresUserGesture(false);

в Java, основываясь на рекомендации этого http://rat32.com/rat32/2018/12/20/how-to-solve-notallowederror-play-can-only-be-initiated-by-a-user-gesture-audio-problem-in-javascript-android-webview/, но я получаю те же результаты. Я добавил это дополнение к оригинальной Java в верхней части этого поста.

Я отправился на поиски дополнительной информации и обнаружил: Веб-сайты потокового аудио не работают должным образом в WebView

Как я рекомендовал, я добавил следующее в java выше

WebSettings webSettings_v = webview_v.getSettings();
            webSettings_v.setJavaScriptEnabled(true);
            webSettings_v.setAllowContentAccess(true);
            webSettings_v.setDomStorageEnabled(true);

но я все еще получаю те же результаты. Возвращаясь к прекрасному www.

Просто добавил еще один раздел в мой java вверху. Вот что я добавил

public class WebInterface_v {
        Context vContext;

        WebInterface_v (Context c) {
            vContext = c;
        }

        @JavascriptInterface
        public void playSound(String toast) {
            Toast.makeText(vContext, toast, Toast.LENGTH_SHORT).show();
        }

        @JavascriptInterface
        public void pauseSound(String toast) {
            Toast.makeText(vContext, toast, Toast.LENGTH_SHORT).show();
        }
    }

Все еще не работает, хотя ... все еще ищет решение, если у кого-то есть рекомендации.

...