Androidアプリをwebviewで1年間実行しています。しかし、html5ビデオが数日前に私のアプリで再生されないと言う顧客がいます。テスト用に5台の電話を持っています。すべての携帯電話に問題はありません。ほとんどのお客様は問題なくアプリを使用しています。
ネットワークの負荷が原因であるため、プリロードプロパティの値をautoからmetaに変更しました。
下の写真はお客様のスクリーンショットです。 27:10の時間があり、読み込み用のスピナーがありません。 (読み込みは終わったと思います)ただし、お客様は再生ボタンを押すことができず、再生ボタンを押すと、動画要素の周りにオレンジ色の線が表示されます。
お客様の携帯電話はgalaxy note 8とgalaxy J7であり、Androidバージョンは8ですが、テストでは問題はありませんでした。Android 8問題なくサービスをご利用いただいているお客様。
どうすれば解決できますか?ありがとう。
html
<video preload="meta" width="95%" autoplay="autoplay" controls="" playsinline="">
<source type="video/mp4" src="url.../file.mp4">
HTML5 is not supported.
</video>
Android-MainActivity
public class MainActivity extends AppCompatActivity {
private WebView webView;
private BackPressCloseHandler backPressCloseHandler = new BackPressCloseHandler(this);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webView);
/* webView settings */
webView.getSettings().setSupportZoom(true);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebChromeClient(new FullscreenableChromeClient(MainActivity.this));
webView.setWebViewClient(new WebViewClientClass());
webView.loadUrl("MY URL IS HERE");
} //onCreate
private class WebViewClientClass extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
ビデオフルスクリーンを有効にするカスタムクラス
import Android.app.Activity;
import Android.content.Context;
import Android.os.Build;
import Android.support.v4.content.ContextCompat;
import Android.view.MotionEvent;
import Android.view.View;
import Android.view.ViewGroup;
import Android.view.Window;
import Android.view.WindowManager;
import Android.webkit.WebChromeClient;
import Android.widget.FrameLayout;
public class FullscreenableChromeClient extends WebChromeClient {
private Activity mActivity = null;
private View mCustomView;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private int mOriginalOrientation;
private FrameLayout mFullscreenContainer;
private static final FrameLayout.LayoutParams COVER_SCREEN_PARAMS = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
public FullscreenableChromeClient(Activity activity) {
this.mActivity = activity;
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mOriginalOrientation = mActivity.getRequestedOrientation();
FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
mFullscreenContainer = new FullscreenHolder(mActivity);
mFullscreenContainer.addView(view, COVER_SCREEN_PARAMS);
decor.addView(mFullscreenContainer, COVER_SCREEN_PARAMS);
mCustomView = view;
setFullscreen(true);
mCustomViewCallback = callback;
// mActivity.setRequestedOrientation(requestedOrientation);
}
super.onShowCustomView(view, callback);
}
@SuppressWarnings("deprecation")
@Override
public void onShowCustomView(View view, int requestedOrientation, WebChromeClient.CustomViewCallback callback) {
this.onShowCustomView(view, callback);
}
@Override
public void onHideCustomView() {
if (mCustomView == null) {
return;
}
setFullscreen(false);
FrameLayout decor = (FrameLayout) mActivity.getWindow().getDecorView();
decor.removeView(mFullscreenContainer);
mFullscreenContainer = null;
mCustomView = null;
mCustomViewCallback.onCustomViewHidden();
mActivity.setRequestedOrientation(mOriginalOrientation);
}
private void setFullscreen(boolean enabled) {
Window win = mActivity.getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_FULLSCREEN;
if (enabled) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
if (mCustomView != null) {
mCustomView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
}
}
win.setAttributes(winParams);
}
private static class FullscreenHolder extends FrameLayout {
public FullscreenHolder(Context ctx) {
super(ctx);
setBackgroundColor(ContextCompat.getColor(ctx, Android.R.color.black));
}
@Override
public boolean onTouchEvent(MotionEvent evt) {
return true;
}
}
}
manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="...">
<uses-permission Android:name="Android.permission.INTERNET" />
<uses-permission Android:name="Android.permission.READ_PHONE_STATE" />
<application
Android:allowBackup="true"
Android:icon="@mipmap/ic_launcher"
Android:label="@string/app_name"
Android:roundIcon="@mipmap/ic_launcher_round"
Android:supportsRtl="true"
Android:hardwareAccelerated="true"
Android:theme="@style/AppTheme">
<activity Android:name="....webview.MainActivity"
Android:configChanges="keyboardHidden|orientation|screenSize">
</activity>
<activity Android:name="....webview.IntroActivity">
<intent-filter>
<action Android:name="Android.intent.action.MAIN" />
<category Android:name="Android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
同じ問題が発生します。
それを修正します。
HTMLビデオタグにid
を配置し、Javaコードでid
を呼び出します。
例えば
<video id = "video" preload="meta" width="95%" autoplay="autoplay" controls="" playsinline=""><source type="video/mp4" src="url.../file.mp4"></video>
onPageFinished
-WebViewClient
のオーバーライドに、このコードを入れます
webView.loadUrl("javascript:(function() { document.getElementById('video').play(); })()");
webView.loadUrl("javascript:(function() { document.getElementById('video').pause(); })()");
これにより、JavaScript関数が挿入され、ビデオの自動再生が可能になります