Skip to content
This repository was archived by the owner on Apr 3, 2020. It is now read-only.

Commit b22e688

Browse files
committed
[Android] Support third part media player on Crosswalk
A requirement from an important customer who want to forward web resources with proxy on Crosswalk, but android system MediaPlayer can't set a proxy with a standard API. The ExoMediaPlayer is playing videos and music is a popular activity on Android devices, and it can be configured with proxy. https://developer.android.com/guide/topics/media/exoplayer.html BUG=XWALK-6770
1 parent 0732335 commit b22e688

File tree

2 files changed

+138
-9
lines changed

2 files changed

+138
-9
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
// Copyright 2013 The Chromium Authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
package org.chromium.media;
6+
7+
import android.content.Context;
8+
import android.media.MediaPlayer;
9+
import android.media.MediaPlayer.TrackInfo;
10+
import android.net.Uri;
11+
import android.view.Surface;
12+
13+
import org.chromium.base.Log;
14+
15+
import java.io.FileDescriptor;
16+
import java.io.IOException;
17+
import java.util.Map;
18+
19+
/**
20+
* Use Android system MediaPlayer by default.
21+
*/
22+
public class ExMediaPlayer {
23+
private static final String TAG = "ExMediaPlayer";
24+
25+
private MediaPlayer mPlayer;
26+
27+
protected MediaPlayer getLocalPlayer() {
28+
if (mPlayer == null) {
29+
mPlayer = new MediaPlayer();
30+
Log.d(TAG, "Create a Android System Media Player");
31+
}
32+
return mPlayer;
33+
}
34+
35+
public void setSurface(Surface surface) {
36+
getLocalPlayer().setSurface(surface);
37+
}
38+
39+
public void setDataSource(Context context, Uri uri, Map<String, String> headers)
40+
throws Exception {
41+
getLocalPlayer().setDataSource(context, uri, headers);
42+
}
43+
44+
public void setDataSource(FileDescriptor fd, long offset, long length) throws IOException {
45+
getLocalPlayer().setDataSource(fd, offset, length);
46+
}
47+
48+
public void setDataSource(Context context, Uri uri) throws IOException {
49+
getLocalPlayer().setDataSource(context, uri);
50+
}
51+
52+
public void prepareAsync() throws IllegalStateException {
53+
getLocalPlayer().prepareAsync();
54+
}
55+
56+
public TrackInfo[] getTrackInfo() throws RuntimeException {
57+
return getLocalPlayer().getTrackInfo();
58+
}
59+
60+
public boolean isPlaying() {
61+
return getLocalPlayer().isPlaying();
62+
}
63+
64+
public int getVideoWidth() {
65+
return getLocalPlayer().getVideoWidth();
66+
}
67+
68+
public int getVideoHeight() {
69+
return getLocalPlayer().getVideoHeight();
70+
}
71+
72+
public int getCurrentPosition() {
73+
return getLocalPlayer().getCurrentPosition();
74+
}
75+
76+
public int getDuration() {
77+
return getLocalPlayer().getDuration();
78+
}
79+
80+
public void release() {
81+
getLocalPlayer().release();
82+
}
83+
84+
public void setVolume(float volume1, float volume2) {
85+
getLocalPlayer().setVolume((float) volume1, (float) volume2);
86+
}
87+
88+
public void start() {
89+
getLocalPlayer().start();
90+
}
91+
92+
public void pause() {
93+
getLocalPlayer().pause();
94+
}
95+
96+
public void seekTo(int msec) {
97+
getLocalPlayer().seekTo(msec);
98+
}
99+
100+
public void setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) {
101+
getLocalPlayer().setOnBufferingUpdateListener(listener);
102+
}
103+
104+
public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
105+
getLocalPlayer().setOnCompletionListener(listener);
106+
}
107+
108+
public void setOnErrorListener(MediaPlayer.OnErrorListener listener) {
109+
getLocalPlayer().setOnErrorListener(listener);
110+
}
111+
112+
public void setOnPreparedListener(MediaPlayer.OnPreparedListener listener) {
113+
getLocalPlayer().setOnPreparedListener(listener);
114+
}
115+
116+
public void setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListener listener) {
117+
getLocalPlayer().setOnSeekCompleteListener(listener);
118+
}
119+
120+
public void setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) {
121+
getLocalPlayer().setOnVideoSizeChangedListener(listener);
122+
}
123+
}

media/base/android/java/src/org/chromium/media/MediaPlayerBridge.java

+15-9
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,18 @@
3535
*/
3636
@JNINamespace("media")
3737
public class MediaPlayerBridge {
38-
38+
/**
39+
* Give the host application a chance to take over MeidaPlayer.
40+
*/
3941
public static class ResourceLoadingFilter {
4042
public boolean shouldOverrideResourceLoading(
41-
MediaPlayer mediaPlayer, Context context, Uri uri) {
43+
ExMediaPlayer mediaPlayer, Context context, Uri uri) {
4244
return false;
4345
}
46+
47+
public ExMediaPlayer getExMediaPlayer() {
48+
return null;
49+
}
4450
}
4551

4652
private static ResourceLoadingFilter sResourceLoadFilter = null;
@@ -54,7 +60,7 @@ public static void setResourceLoadingFilter(ResourceLoadingFilter filter) {
5460
// Local player to forward this to. We don't initialize it here since the subclass might not
5561
// want it.
5662
private LoadDataUriTask mLoadDataUriTask;
57-
private MediaPlayer mPlayer;
63+
private ExMediaPlayer mPlayer;
5864
private long mNativeMediaPlayerBridge;
5965

6066
@CalledByNative
@@ -78,9 +84,9 @@ protected void destroy() {
7884
mNativeMediaPlayerBridge = 0;
7985
}
8086

81-
protected MediaPlayer getLocalPlayer() {
87+
protected ExMediaPlayer getLocalPlayer() {
8288
if (mPlayer == null) {
83-
mPlayer = new MediaPlayer();
89+
mPlayer = sResourceLoadFilter.getExMediaPlayer();
8490
}
8591
return mPlayer;
8692
}
@@ -202,9 +208,9 @@ protected boolean setDataSource(
202208
headersMap.put("allow-cross-domain-redirect", "false");
203209
}
204210
try {
205-
if (sResourceLoadFilter != null &&
206-
sResourceLoadFilter.shouldOverrideResourceLoading(
207-
getLocalPlayer(), context, uri)) {
211+
if (sResourceLoadFilter != null
212+
&& sResourceLoadFilter.shouldOverrideResourceLoading(
213+
getLocalPlayer(), context, uri)) {
208214
return true;
209215
}
210216
getLocalPlayer().setDataSource(context, uri, headersMap);
@@ -372,7 +378,7 @@ private boolean canSeekBackward() {
372378
*/
373379
@CalledByNative
374380
protected AllowedOperations getAllowedOperations() {
375-
MediaPlayer player = getLocalPlayer();
381+
ExMediaPlayer player = getLocalPlayer();
376382
boolean canPause = true;
377383
boolean canSeekForward = true;
378384
boolean canSeekBackward = true;

0 commit comments

Comments
 (0)