Tap the black
VideoView
to display its controls.
Then tap the triangular Run button in these controls to watch
Fred
Ott’s Sneeze.
We’ve seen a
TextView
and an
ImageView.
Now it’s time for a
VideoView.
See
View
the Video.
MainActivity.java
launches other activities.
activity_main.xml
contains a
VideoView.
strings.xml
a0026a.mp4
is on the list of
Supported
Media Formats.
AndroidManifest.xml
build.gradle
(Module: app)
Select the
app/res
folder in the Android Studio
project
view
and pull down
File → New → Android resource directory
Resource type: raw
OK
Point your browser at
Edison
kinetoscopic record of a sneeze,
January 7, 1894
at the Library of Congress.
In the lower left, under Resources, download the MP4.
Download it as
a0026a.mp4,
not
0026a.mp4.
Copy and paste the file into the app’s
app/res/raw
folder.
The id number of this file will be stored into the variable
R.raw.a0026a.
It would be impossible in Java to have a variable named
R.raw.0026a.
Turn up the Mac or PC sound volume before launching the app.
VideoViewDemo.java
defines a subclass of class
Activity.
videoview.xml
contains a
VideoView.
videoviewdemo.mp4.
Click on View Raw to download the
.mp4
file.
videoView.setMediaController(new MediaController(this));
to
videoView.start(); //Start the video spontaneously.
onCreate.
This is one way to get your hands on the
MediaPlayer
inside the
VideoView.
The variable
videoView
will have to be declared
final.
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
videoView.seekTo(0); //milliseconds; 0 is the start of the file
videoView.start();
}
});
Or seek to 7000 milliseconds to skip the intro.
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
Log.d("myTag", "duration = " + mediaPlayer.getDuration() + " milliseconds");
Log.d("myTag", "dimensions = (" + mediaPlayer.getVideoWidth() + ", " + mediaPlayer.getVideoHeight() + ")");
mediaPlayer.setLooping(true); //Another way to go into an infinite loop.
}
});
08-20 22:26:59.999 3426-3426/? D/myTag: duration = 22733 milliseconds 08-20 22:26:59.999 3426-3426/? D/myTag: dimensions = (480, 360)And now that you know the dimensions in pixels, you could change the width and height of the
VideoView
in
activity_main.xml
to
480px
by
360px
if you wanted to watch the video at its actual size.
See also
MediaPlayer.OnVideoSizeChangedListener.
Uri
to
Uri uri = Uri.parse("http://stream.media.loc.gov/ammem/EdisonCompanies/0026a.mp4");
and add the following element to the
<manifest>
element in
AndroidManifest.xml.
<uses-permission android:name="android.permission.INTERNET"/>
WebView.
<uses-permission android:name="android.permission.INTERNET"/>
Attribute of
<activity>
element:
android:hardwareAccelerated="true"
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
WebView webView = (WebView)findViewById(R.id.webView);
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setAllowFileAccess(true);
//Allow the JavaScript program to display an alert window.
webView.setWebViewClient(new WebViewClient());
webView.setWebChromeClient(new WebChromeClient());
webView.loadUrl("http://stream.media.loc.gov/ammem/EdisonCompanies/0026a.mp4");
On my Amazon HD6 fire and
on my Nexus 5 API 22 Android Virtual Device,
the
WebView
worked correctly.
On the Genymotion Samsung Galaxy S5,
the
WebView
displayed controls and played the sound but gave me a black screen.
The error messages included the following.
08-23 09:54:05.292 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder_autogen.h(1082)] [GroupMarkerNotSet(crbug.com/242999)!:0075F2B7]GL ERROR :GL_INVALID_OPERATION : GetIntegerv: <- error from previous GL command 08-23 09:54:05.308 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder_autogen.h(1082)] [GroupMarkerNotSet(crbug.com/242999)!:807CF6B7]GL ERROR :GL_INVALID_OPERATION : GetIntegerv: <- error from previous GL command 08-23 09:54:05.328 3307-3307/? E/eglCodecCommon﹕ **** ERROR unknown type 0xb7ef9518 (glSizeof,80) 08-23 09:54:10.336 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder_autogen.h(1082)] [GroupMarkerNotSet(crbug.com/242999)!:30F1FAB7]GL ERROR :GL_INVALID_OPERATION : GetIntegerv: <- error from previous GL command 08-23 09:54:10.408 3307-3307/? E/eglCodecCommon﹕ **** ERROR unknown type 0xb7ef9518 (glSizeof,80) 08-23 09:54:10.860 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5942)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUseProgram: program not linked 08-23 09:54:10.860 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5718)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUniformMatrix4fv: wrong uniform function for type 08-23 09:54:10.860 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5718)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUniform1iv: wrong uniform function for type 08-23 09:54:10.860 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(1777)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_OUT_OF_MEMORY : GLES2DecoderImpl::PrepareTexturesForRender: <- error from previous GL command 08-23 09:54:15.572 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5942)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUseProgram: program not linked 08-23 09:54:15.572 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5718)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUniformMatrix4fv: wrong uniform function for type 08-23 09:54:15.572 3307-3307/? E/chromium﹕ [ERROR:gles2_cmd_decoder.cc(5718)] [.Compositor-Onscreen-0xb7f69378]GL ERROR :GL_INVALID_OPERATION : glUniform1iv: wrong uniform function for type 08-23 09:54:15.580 3307-3307/? E/eglCodecCommon﹕ **** ERROR unknown type 0xb7ef9518 (glSizeof,80) 08-23 09:54:16.084 3307-3307/? E/eglCodecCommon﹕ **** ERROR unknown type 0xb7ef9518 (glSizeof,80)This article from May 11, 2015 might explain why
WebViews
crash when
displaying videos.
Intent
to find and launch a video-playing
Activity.
I got this to work for videos downloaded from the Internet
(http://),
but not for videos in the
app/res/raw
or
app/assets
folders.
Uri uri = Uri.parse("http://stream.media.loc.gov/ammem/EdisonCompanies/0026a.mp4");
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");
startActivity(intent);