Note that there are some explanatory texts on larger screens.

plurals
  1. POAndroid webView to play YouTube videos
    primarykey
    data
    text
    <p>can anyone help using this code to get youtube videos to play that are embedded in website? have tried all sorts of things including hardwareAccelerated=true in manifest. </p> <p>The webview shows the youtube page and thumbnail images but when clicking on them nothing happens.</p> <p>On certain devices with hardwareAccelerated it plays the sound but no video. thanks everyone!</p> <pre><code>package com.inglesupdated; import java.util.ArrayList; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Picture; import android.net.Uri; import android.os.Bundle; import android.view.Gravity; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; import android.webkit.WebView.PictureListener; import android.widget.Button; import android.widget.LinearLayout; public class BT_screen_customURL extends BT_activity_base{ private boolean didCreate = false; private WebView webView = null; private String dataURL = ""; private String currentURL = ""; private String originalURL = ""; private AlertDialog confirmLaunchInNativeAppDialogue = null; private AlertDialog confirmEmailDocumentDialogue = null; private String showBrowserBarBack = ""; private String showBrowserBarLaunchInNativeApp = ""; private String showBrowserBarEmailDocument = ""; private String showBrowserBarRefresh = ""; ////////////////////////////////////////////////////////////////////////// //activity life-cycle events. //onCreate @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); this.activityName = "BT_screen_customURL"; BT_debugger.showIt(activityName + ":onCreate"); //reference to base layout.. LinearLayout baseView = (LinearLayout)findViewById(R.id.baseView); //setup background colors... BT_viewUtilities.updateBackgroundColorsForScreen(this, this.screenData); //setup background images.. if(backgroundImageWorkerThread == null){ backgroundImageWorkerThread = new BackgroundImageWorkerThread(); backgroundImageWorkerThread.start(); } //setup navigation bar... LinearLayout navBar = BT_viewUtilities.getNavBarForScreen(this, this.screenData); if(navBar != null){ baseView.addView(navBar); } //inflate this screens layout file... LayoutInflater vi = (LayoutInflater)thisActivity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View thisScreensView = vi.inflate(R.layout.screen_customurl, null); //add the view to the base view... baseView.addView(thisScreensView); //reference to the webview in the layout file. webView = (WebView) thisScreensView.findViewById(R.id.webView); webView.setBackgroundColor(0); webView.setInitialScale(0); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setSupportZoom(true); webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setPluginsEnabled(true); webView.setPictureListener(new MyPictureListener()); webView.setWebChromeClient(new WebChromeClient()); webView.setWebViewClient(new WebViewClient(){ @Override public boolean shouldOverrideUrlLoading(WebView view, String url){ //remember the URL... currentURL = url; //load the URL in the app's built-in browser if it's in our list of types to load... if(BT_act_controller.canLoadDocumentInWebView(url)){ //load url in built-in browser... // showProgress(null, null); return false; }else{ //ask user what app to open this in if the method returned NO... try{ Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); startActivity(Intent.createChooser(i, getString(R.string.openWithWhatApp))); }catch(Exception e){ BT_debugger.showIt(activityName + ": Error launching native app for url: " + url); showAlert(getString(R.string.noNativeAppTitle), getString(R.string.noNativeAppDescription)); } //do not try to load the URL.. return true; } } @Override public void onPageFinished(WebView view, String url){ hideProgress(); BT_debugger.showIt(activityName + ":onPageFinished finished Loading: " + url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { hideProgress(); showAlert(getString(R.string.errorTitle), getString(R.string.errorLoadingScreen)); BT_debugger.showIt(activityName = ":onReceivedError ERROR loading url: " + failingUrl + " Description: " + description); } }); //fill JSON properties... dataURL = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "dataURL", ""); currentURL = dataURL; originalURL = dataURL; //button options for hardware menu key... showBrowserBarBack = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "showBrowserBarBack", "0"); showBrowserBarLaunchInNativeApp = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "showBrowserBarLaunchInNativeApp", "0"); showBrowserBarEmailDocument = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "showBrowserBarEmailDocument", "0"); showBrowserBarRefresh = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "showBrowserBarRefresh", "0"); //prevent user interaction? String preventUserInteraction = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "preventUserInteraction", "0"); if(preventUserInteraction.equalsIgnoreCase("1")){ //can't seem to get Android to "prevent user interaction"...??? } //hide scroll bars.. String hideVerticalScrollBar = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "hideVerticalScrollBar", "0"); if(hideVerticalScrollBar.equalsIgnoreCase("1")){ webView.setVerticalScrollBarEnabled(false); } String hideHorizontalScrollBar = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "hideHorizontalScrollBar", "0"); if(hideHorizontalScrollBar.equalsIgnoreCase("1")){ webView.setHorizontalScrollBarEnabled(false); } String preventAllScrolling = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "preventAllScrolling", "0"); if(preventAllScrolling.equalsIgnoreCase("1")){ webView.setVerticalScrollBarEnabled(false); webView.setHorizontalScrollBarEnabled(false); } //figure out what to load... if(dataURL.length() &gt; 1){ String useUrl = BT_strings.mergeBTVariablesInString(dataURL); BT_debugger.showIt(activityName + ": loading URL from: " + useUrl); this.loadUrl(useUrl); }else{ BT_debugger.showIt(activityName + ": No URL found? Not loading web-view!"); showAlert(getString(R.string.errorTitle), getString(R.string.errorLoadingScreen)); } //flag as created.. didCreate = true; /* * ******************************************************************* Notes: This screen has fully loaded it's layout file at this point. BT_activity_base loaded act_base.xml --THEN-- this screen loaded it's own layout file. JSON properties for this screen from the app's configuration data are available for use. You can read these properties easily using the BT_strings class. Example: String thisScreensNavBarTitleText = BT_strings.getJsonPropertyValue(this.screenData.getJsonObject(), "thisScreensNavBarTitleText", "default value here"); The screens background and title bar were setup using the BT_viewUtilities class: BT_viewUtilities.updateBackgroundColorsForScreen() You are free to modify the layout file and extend this screen however you want. ******************************************************************** */ }//onCreate //onStart @Override protected void onStart() { //BT_debugger.showIt(activityName + ":onStart"); super.onStart(); } //onResume @Override public void onResume() { super.onResume(); //BT_debugger.showIt(activityName + ":onResume"); //verify onCreate already ran... if(didCreate){ } } //onPause @Override public void onPause() { super.onPause(); //BT_debugger.showIt(activityName + ":onPause"); } //onStop @Override protected void onStop(){ super.onStop(); //BT_debugger.showIt(activityName + ":onStop"); } //onDestroy @Override public void onDestroy() { super.onDestroy(); //BT_debugger.showIt(activityName + ":onDestroy"); } //end activity life-cycle events ////////////////////////////////////////////////////////////////////////// //load URL in webView public void loadUrl(String theUrl){ BT_debugger.showIt(activityName + ": loadUrl"); try{ webView.loadUrl(theUrl); }catch(Exception e){ BT_debugger.showIt(activityName + ":loadUrl Exception: " + e.toString()); } } /* Hardware Back-Key, uncomment as needed. Uncomment this to make the hardware back-key act like a browser back button Warning: If you do this the user will need to go "back" the number of times they when "forward" to return to the previous screen. @Override public boolean onKeyDown(int keyCode, KeyEvent event){ if ((keyCode == KeyEvent.KEYCODE_BACK) &amp;&amp; webView.canGoBack()){ webView.goBack(); return true; } //not the back-key.. return super.onKeyDown(keyCode, event); } */ //back button... public void handleBackButton(){ BT_debugger.showIt(activityName + ":handleBackButton"); if(webView.canGoBack()){ webView.goBack(); }else{ BT_debugger.showIt(activityName + ":handleBackButton cannot go back?"); } } //refresh button... public void handleRefreshButton(){ BT_debugger.showIt(activityName + ":handleRefreshButton"); if(currentURL.length() &gt; 1){ showProgress(null, null); webView.loadUrl(currentURL); }else{ BT_debugger.showIt(activityName + ":handleRefreshButton cannot refresh?"); } } //launch in native app button... public void handleLaunchInNativeAppButton(){ BT_debugger.showIt(activityName + ":handleLaunchInNativeAppButton"); if(currentURL.length() &gt; 1 &amp;&amp; originalURL.length() &gt; 1){ confirmLaunchInNativeApp(); }else{ showAlert(getString(R.string.errorTitle), getString(R.string.cannotOpenDocumentInNativeApp)); BT_debugger.showIt(activityName + ":handleLaunchInNativeAppButton NO url?"); } } //handle email button public void handleEmailDocumentButton(){ BT_debugger.showIt(activityName + ":handleLaunchInNativeAppButton"); showAlert(getString(R.string.errorTitle), getString(R.string.cannotEmailDocument)); BT_debugger.showIt(activityName + ":handleEmailDocumentButton NO document to email on URL screens"); } //confirm launch in native app public void confirmLaunchInNativeApp(){ confirmLaunchInNativeAppDialogue = new AlertDialog.Builder(this).create(); confirmLaunchInNativeAppDialogue.setTitle(getString(R.string.confirm)); confirmLaunchInNativeAppDialogue.setMessage(getString(R.string.confirmLaunchInNativeBrowser)); confirmLaunchInNativeAppDialogue.setIcon(R.drawable.icon); //YES confirmLaunchInNativeAppDialogue.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { confirmLaunchInNativeAppDialogue.dismiss(); //tell Android to load the URL in the best available Native App... try{ Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(currentURL)); startActivity(i); }catch(Exception e){ BT_debugger.showIt(activityName + ": Error launching native app for url: " + currentURL); showAlert(getString(R.string.noNativeAppTitle), getString(R.string.noNativeAppDescription)); } } }); //NO confirmLaunchInNativeAppDialogue.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { confirmLaunchInNativeAppDialogue.dismiss(); } }); //show the confirmation box... confirmLaunchInNativeAppDialogue.show(); } //confirm email document public void confirmEmailDocumentDialogue(){ confirmEmailDocumentDialogue = new AlertDialog.Builder(this).create(); confirmEmailDocumentDialogue.setTitle(getString(R.string.confirm)); confirmEmailDocumentDialogue.setMessage(getString(R.string.confirmEmailDocument)); confirmEmailDocumentDialogue.setIcon(R.drawable.icon); //YES confirmEmailDocumentDialogue.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.yes), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { confirmEmailDocumentDialogue.dismiss(); //tell Android launch the native email application... Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND); emailIntent.setType("plain/text"); emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, getString(R.string.sharingWithYou)); emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, currentURL); //chooser will propmpt user if they have more than one email client.. startActivity(Intent.createChooser(emailIntent, getString(R.string.openWithWhatApp))); } }); //NO confirmEmailDocumentDialogue.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.no), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { confirmEmailDocumentDialogue.dismiss(); } }); //show the confirmation box... confirmEmailDocumentDialogue.show(); } //see webView (above) where onPageFinished is loading too soon... class MyPictureListener implements PictureListener { public void onNewPicture(WebView view, Picture arg1) { //BT_debugger.showIt("here" + ":onNewPicture done"); hideProgress(); } } ///////////////////////////////////////////////////// //options menu (hardware menu-button) @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); //set up dialog final Dialog dialog = new Dialog(this); //linear layout holds all the options... LinearLayout optionsView = new LinearLayout(this); optionsView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT)); optionsView.setOrientation(LinearLayout.VERTICAL); optionsView.setGravity(Gravity.CENTER_VERTICAL); optionsView.setPadding(0, 0, 0, 20); //options have individual layout params LinearLayout.LayoutParams btnLayoutParams = new LinearLayout.LayoutParams(400, LayoutParams.WRAP_CONTENT); btnLayoutParams.setMargins(10, 10, 10, 10); btnLayoutParams.leftMargin = 10; btnLayoutParams.rightMargin = 10; btnLayoutParams.topMargin = 0; btnLayoutParams.bottomMargin = 10; //holds all the options ArrayList&lt;Button&gt; options = new ArrayList&lt;Button&gt;(); //cancel... final Button btnCancel = new Button(this); btnCancel.setText(getString(R.string.okClose)); btnCancel.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); } }); options.add(btnCancel); //back... if(showBrowserBarBack.equalsIgnoreCase("1")){ final Button btn = new Button(this); btn.setText(getString(R.string.browserBack)); btn.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); handleBackButton(); } }); options.add(btn); } //launch in native app... if(showBrowserBarLaunchInNativeApp.equalsIgnoreCase("1")){ final Button btn = new Button(this); btn.setText(getString(R.string.browserOpenInNativeApp)); btn.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); handleLaunchInNativeAppButton(); } }); options.add(btn); } //email document... if(showBrowserBarEmailDocument.equalsIgnoreCase("1")){ final Button btn = new Button(this); btn.setText(getString(R.string.browserEmailDocument)); btn.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); handleEmailDocumentButton(); } }); options.add(btn); } //refresh page... if(showBrowserBarRefresh.equalsIgnoreCase("1")){ final Button btn = new Button(this); btn.setText(getString(R.string.browserRefresh)); btn.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); handleRefreshButton(); } }); options.add(btn); } //refreshAppData (if we are on home screen) if(this.screenData.isHomeScreen() &amp;&amp; inglesupdated_appDelegate.rootApp.getDataURL().length() &gt; 1){ final Button btnRefreshAppData = new Button(this); btnRefreshAppData.setText(getString(R.string.refreshAppData)); btnRefreshAppData.setOnClickListener(new OnClickListener(){ public void onClick(View v){ dialog.cancel(); refreshAppData(); } }); options.add(btnRefreshAppData); } //add each option to layout, set layoutParams as we go... for(int x = 0; x &lt; options.size(); x++){ options.get(x).setLayoutParams(btnLayoutParams); options.get(x).setPadding(5, 5, 5, 5); optionsView.addView(options.get(x)); } //set content view.. dialog.setContentView(optionsView); if(options.size() &gt; 1){ dialog.setTitle(getString(R.string.menuOptions)); }else{ dialog.setTitle(getString(R.string.menuNoOptions)); } //show dialog.show(); return true; } //end options menu ///////////////////////////////////////////////////// } </code></pre>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload