PictureInPictureParams
사용. 가이드 코드를 보니 아래와 같았다. package com.android.pictureinpicture
import android.annotation.SuppressLint
import android.app.PictureInPictureParams
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.util.Rational
import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebSettings
import android.widget.Toast
import androidx.annotation.RequiresApi
import androidx.appcompat.app.AppCompatActivity
import android.webkit.WebView
import android.webkit.WebViewClient
class VideoActivity : AppCompatActivity() {
private val TAG:String = "PIP_TAG"
private var pictureInPictureParamsBuilder:PictureInPictureParams.Builder? = null
private lateinit var webView: WebView
@RequiresApi(Build.VERSION_CODES.O)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//init PictureInPictureParams, requires Android O and above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
pictureInPictureParamsBuilder = PictureInPictureParams.Builder()
}
webView = findViewById(R.id.webView)
// Load web page in WebView
webView.webViewClient = WebViewClient()
this.setupWebView()
webView.loadUrl("https://dev-player.charlla.io/shoplayer/list/QFuoEZxk1AJ?l=grid")
}
@SuppressLint("SetJavaScriptEnabled")
private fun setupWebView() {
val webSettings: WebSettings = webView.settings;
webSettings.javaScriptEnabled = true
webSettings.mediaPlaybackRequiresUserGesture = false
webSettings.loadWithOverviewMode = true
webSettings.useWideViewPort = true
webSettings.domStorageEnabled = true
webView.webViewClient = WebViewClient()
webView.webChromeClient = object : WebChromeClient() {
override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
super.onShowCustomView(view, callback)
pictureInPictureMode()
}
}
}
private fun pictureInPictureMode(){
//Requires Android O and higher
Log.d(TAG, "pictureInPictureMode: Try to enter in PIP mode")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
Log.d(TAG, "pictureInPictureMode: Supports PIP")
//setup PIP height width
val aspectRatio = Rational(webView.width, webView.height)
pictureInPictureParamsBuilder!!.setAspectRatio(aspectRatio).build()
enterPictureInPictureMode(pictureInPictureParamsBuilder!!.build())
}
else{
Log.d(TAG, "pictureInPictureMode: Doesn't supports PIP")
Toast.makeText(this, "Your device doesn't supports PIP", Toast.LENGTH_LONG).show()
}
}
override fun onUserLeaveHint() {
super.onUserLeaveHint()
//when user presses home button, if not in PIP mode, enter in PIP, requires Android N and above
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
Log.d(TAG, "onUserLeaveHint: was not in PIP")
pictureInPictureMode()
}
else{
Log.d(TAG, "onUserLeaveHint: Already in PIP")
}
}
override fun onBackPressed() {
onUserLeaveHint()
}
override fun onPictureInPictureModeChanged(
isInPictureInPictureMode: Boolean,
newConfig: Configuration?
) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
if (isInPictureInPictureMode){
Log.d(TAG, "onPictureInPictureModeChanged: Entered PIP")
}
else{
Log.d(TAG, "onPictureInPictureModeChanged: Exited PIP")
}
}
override fun onStop() {
super.onStop()
}
}
webView.webViewClient = WebViewClient()
webView.webChromeClient = object : WebChromeClient() {
override fun onShowCustomView(view: View?, callback: CustomViewCallback?) {
super.onShowCustomView(view, callback)
pictureInPictureMode()
}
}
webViewClient
가 있다. 여기서 커스텀 설정을 해주면 되는데 onShowCustomView
를 오버라이드해서 PIP가 가능하게 고쳐주면 된다. 밑의 PIP 활용 부분은 복붙하면 될듯하다.public class MyWebView extends WebView {
// ... (기타 코드 생략)
public void enterPIPMode() {
// PIP 모드로 전환하는 로직 추가
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
PictureInPictureParams.Builder pipBuilder = new PictureInPictureParams.Builder();
Rational aspectRatio = new Rational(getWidth(), getHeight());
pipBuilder.setAspectRatio(aspectRatio);
enterPictureInPictureMode(pipBuilder.build());
} else {
Toast.makeText(getContext(), "Your device doesn't support PIP", Toast.LENGTH_SHORT).show();
}
}
}
이걸 화면에서 Webview0.enterPIPMode()
고고
정리하자면
WebChromeClient
셋팅하는 부분에 onShowCustomView
오버라이드하여 PIP 빌더 생성셋팅해둠enterPIPMode()
를 만들어서 여기서 바로 만들면 안되는건가? webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setCacheMode(WebSettings.LOAD_DEFAULT); // 캐시 사용
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); // 캐시 사용 안 함
webView.getSettings().setLoadsImagesAutomatically(true);
shouldOverringUrlLoading
: 웹뷰에서 url이 로딩될 때 호출되며 앱에서 제어할 수 있다. 반환 default는 false이며 로딩 제어시 true를 반환해주어야 한다.onPageStarted
: 페이지가 로딩이 시작되는 시점에 호출됨onPageFinished
: 페이지가 로딩이 완료되는 시점에 호출됨onReceivedSslError
: 수신받은 SSL에러가 발생한 경우 호출되며 분기로직을 통해 처리 해줌@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
// 비디오가 전체 화면으로 표시될 때 처리
}
@Override
public void onHideCustomView() {
// 비디오가 전체 화면에서 사라질 때 처리
}
2) JavaScript 설정
@Override
public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
// JavaScript alert 처리
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
// JavaScript confirm 처리
return true;
}
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
// JavaScript prompt 처리
return true;
}
참고
https://velog.io/@pachuho/Android-WebView-%EC%95%8C%EA%B3%A0-%EC%93%B0%EA%B8%B0#-webview-settings