# JsViewPlugin[TBD]
JsView Android 中,通过Java反射,定制一些功能来增加JsView的灵活性。使用户可以根据自己的实际需求自定义一些设置。这些自定义功能通过实现JsViewPlugin的接口来达成。
# JsViewPlugin
一个JsView和外部交互的隧道(Tunnel),将JsView内部的调用反射到外部来实现定制化。
接口:
static JsViewPlugin GetInstance()
- 功能: 静态函数。获取JsViewPlugin实例,JsViewPlugin是一个单例模式的架构。
- 参数: 无
- 返回: JsViewPlugin实例
- 异常: 无
void declareChannel(Class<? extends Channel> channelType,
Class<? extends Channel> channelClass)- 功能: 成员函数。声明一个通道。
- 参数:
- channelType: 通道类型,必须是以下值中的一个,其他类型暂不支持
- JsViewPlugin.URLConnection.class
- JsViewPlugin.DomAudio.class
- JsViewPlugin.DomVideo.class
- JsViewPlugin.AudioPlayer.class
- JsViewPlugin.VideoPlayer.class
- channelClass: 继承于channelType的一个具体实现类,必须有一个无参数的默认构造函数,由JsView内部通过newInstance进行实例化, 可以参照对应默认实现:
- DefaultURLConnection.class
- DefaultDomAudio.class
- DefaultDomVideo.class
- DefaultAudioPlayer.class
- DefaultVideoPlayer.class
- channelType: 通道类型,必须是以下值中的一个,其他类型暂不支持
- 返回: 无
- 异常:
- IllegalArgumentException
void syncHandler()
- 功能: 成员函数。同步通过declareChannel()声明的通道到JsView。
这个函数必须在JsView.requestSdk()接口后调用,同步后通道才能生效。 - 参数: 无
- 返回: 无
- 异常:
- ClassNotFoundException
- IllegalAccessException
- InvocationTargetException
- NoSuchFieldException
- NoSuchMethodException
- 功能: 成员函数。同步通过declareChannel()声明的通道到JsView。
# Channel
JsViewPlugin包含多个通路,每一个通路代表一个具体功能,用户在实际定制时,也是定制其中的一个或几个Channel。每个Channel均有一个默认实现集成在JsView SDK中,你可以在此基础上通过继承来降低工作难度。
当前JsViewPlugin支持的Channel包括:
- URLConnection
- DomAudio, DomVideo
- AudioPlayer, VideoPlayer
# URLConnection
JsViewPlugin.URLConnection Channel 是一个类似于Android标准的HttpsURLConnection接口,你可以通过这些接口定制JsView所有的网络请求,来解决比如静态DNS解析问题,某些Android设备不支持SSL等具体问题。URLConnection包含的接口有:
void openConnection(URL url, int retryCount, Exception retryReason)
- 功能: 成员函数。参照于URL.openConnection (opens new window)。在其基础上添加了重试功能。
- 参数:
- url: 请求地址。
- retryCount: 第几次重试,用户可以通过这个值来尝试更换请求方式。
- retryReason: 上一次失败原因。
- 返回: 无
- 异常:
- IOException
void setRetryTimes(int retryTimes)
- 功能: 成员函数。设置请求失败时的重试总次数,当请求失败时,这个次数影响到openConnection()的调用次数。
- 参数:
- retryTimes: 重试次数。
- 返回: 无
- 异常: 无
void connect()
void disconnect()
void setRequestMethod(String method)
String getRequestMethod()
void setRequestProperty(String key, String value)
void addRequestProperty(String key, String value)
String getRequestProperty(String key)
Map<String, List<String>> getRequestProperties()
void setConnectTimeout(int timeout)
int getConnectTimeout()
void setReadTimeout(int timeout)
int getReadTimeout()
void setInstanceFollowRedirects(boolean followRedirects)
boolean getInstanceFollowRedirects()
void setDoInput(boolean doinput)
boolean getDoInput()
void setDoOutput(boolean dooutput)
boolean getDoOutput()
InputStream getInputStream()
OutputStream getOutputStream()
int getResponseCode()
String getResponseMessage()
int getContentLength()
InputStream getErrorStream()
String getHeaderField(String name)
Map<String, List<String>> getHeaderFields()
void setUseCaches(boolean usecaches)
boolean getUseCaches()
void setDefaultHostnameVerifier(HostnameVerifier verifier)
void setSSLSocketFactory(SSLSocketFactory sf)
void setDefaultSSLSocketFactory(SSLSocketFactory sf)
以上未具体说明的接口请参照: URLConnection (opens new window)、HttpURLConnection (opens new window)和HttpsURLConnection (opens new window)
默认实现:对接URL.openConnection()
注意
JsViewPlugin.URLConnection的接口设计成和Android HttpsURLConnection类同只是为了降低接口学习成本,其和Android MediaPlayer包名不同,请注意区分。
# DomAudio
JsViewPlugin.DomAudio Channel 用于自定义JsView JS端定义的<audio>标签。其接口与<audio>相对应,你可以通过这个接口定制JsView的音频播放器,来解决比如不同Android设备的媒体播放器表现不一致等具体问题。
DomAudio等同于JsViewPlugin.DomMedia。
JsViewPlugin.DomMedia 包含的接口有:
void finalize()
- 功能: 成员函数。用于释放资源的时机。此函数调用后,DomAudio将不会再被使用。
- 参数: 无
- 返回: 无
- 异常: 无
void openDomMedia(Context context)
- 功能: 成员函数。创建自定义播放器的时机。此函数在DomAudio创建后使用前被使用。
- 参数:
- context: Android context
- 返回: 无
- 异常: 无
void setOnEventListener(OnEventListener listener)
- 功能: 成员函数。DomAudio被open后,此函数被触发。当播放器状态发生变化时,可以通过listener回调相关信息给JS端。
- 参数: 无
- listener: 参照OnEventListener,Android端回调给JS端的Channel。
- 返回: 无
- 异常: 无
OnEventListener
interface OnEventListener extends IJsViewTunnel.Channel { void onEvent(String event, Object[] extra); }
1
2
3void onEvent(String event, Object[] extra)
- 功能: 接口定义。由JsView实例化。播放器通过onEvent函数回调状态给JS。
- 参数:
- event: 事件名。常用的事件名包括:
- canplay, canplaythrough, durationchange, ended, error, load, loadedmetadata, loadstart, pause, play, playing, seeking, seeked, stalled, timeupdate
- extra: 附加信息,有效的附加信息包括:
- durationchange => [0]: duration
- error => [0]: code, [1]: message
- seeked => [0]: currentTime
- timeupdate => [0]: currentTime
- event: 事件名。常用的事件名包括:
- 返回: 无
- 异常: 无
void setProperty(String propName, Object propValue)
- 功能: 成员函数。当<audio>标签的属性被设置时,触发此函数。
- 参数:
- propName: 属性名。当前支持的属性名。
- propValue: 属性值。当前支持的属性值为null, boolean, int, double, String中的一个。
- 返回: 无
- 异常: 无
没有getProperty()? 为了提升JsView的性能,get属性通过onEvent的附加数据直接回给JS端。
void load()
- 功能: 成员函数。当<audio>标签的load()被调用时,触发此函数。
- 参数: 无
- 返回: 无
- 异常: 无
void pause()
- 功能: 成员函数。当<audio>标签的pause()被调用时,触发此函数。
- 参数: 无
- 返回: 无
- 异常: 无
void play()
- 功能: 成员函数。当<audio>标签的pause()被调用时,触发此函数。
- 参数: 无
- 返回: 无
- 异常: 无
默认实现:对默认AudioPlayer的包装,相当于从AudioPlayer到<audio>标签的封装。
# DomVideo
JsViewPlugin.DomVideo Channel 用于自定义JsView JS端定义的<video>标签。其接口与<video>相对应,你可以通过这个接口定制JsView的视频频播放器,来解决比如不同Android设备的媒体播放器表现不一致等具体问题。
DomVideo继承于JsViewPlugin.DomMedia,和DomAudio的区别仅仅是在其基础上添加了UI调用。
JsViewPlugin.DomMedia 包含的接口。其他接口有:
void setVideoContainer(Context context, FrameLayout videoContainer)
- 功能: 成员函数。用于设置Android端视频显示View的父View。此函数在setOnEventListener之前被JsView调用。
- 参数: 无
- context: Android context
- videoContainer: Android View,用于确定视频View的显示层级。
- 返回: 无
- 异常: 无
void setStyles(int left, int top, int width, int height,
String objectFit, String visibility, Object... others);- 功能: 成员函数。用于设置视频显示的相关数据。当<video>的style被修改时,此函数被调用。
- 参数: 无
- left, top, width, height: 视频的左/上/宽/高等位置信息。
- objectFit: 视频的缩放信息。值为:
- contain[默认]: 保持视频原有尺寸比例。内容被缩放。
- fill: 不保证视频保持原有的比例,内容拉伸填充整个内容容器。
- cover: 保持原有尺寸比例。但部分内容可能被剪切。
- visibility: 视频是否可见。值为:
- visible[默认]: 可见。
- hidden: 不可见。
- 返回: 无
- 异常: 无
默认实现:对默认VideoPlayer的包装,相当于从VideoPlayer到<video>标签的封装。
# AudioPlayer
JsViewPlugin.AudioPlayer Channel 是一个类似于Android标准MediaPlayer接口,你可以通过这个接口定制JsView的音频播放器,来解决比如不同Android设备的媒体播放器表现不一致等具体问题。
AudioPlayer等同于JsViewPlugin.MediaPlayer。
JsViewPlugin.MediaPlayer 包含的接口有:
void setDataSource(Context context, Uri uri)
void setDataSource(Context context, Uri uri, Map<String, String> headers)
void setDataSource(String path)
void prepare()
void prepareAsync()
void start()
void stop()
void pause()
boolean isPlaying()
void seekTo(int msec)
int getCurrentPosition()
int getDuration()
void release()
void reset()
void setLooping(boolean looping)
boolean isLooping()
void setVolume(float leftVolume, float rightVolume)
void setPlaybackSpeed(float rate)
void setOnPreparedListener(OnPreparedListener listener)
OnPreparedListener
interface OnPreparedListener extends IJsViewTunnel.Channel { void onPrepared(); }
1
2
3- void onPrepared()
void setOnCompletionListener(OnCompletionListener listener)
OnCompletionListener
interface OnCompletionListener extends IJsViewTunnel.Channel { void onCompletion(); }
1
2
3- void onCompletion()
void setOnBufferingUpdateListener(OnBufferingUpdateListener listener)
OnBufferingUpdateListener
interface OnBufferingUpdateListener extends IJsViewTunnel.Channel { void onBufferingUpdate(int percent); }
1
2
3- void onBufferingUpdate()
void setOnSeekCompleteListener(OnSeekCompleteListener listener)
OnSeekCompleteListener
interface OnSeekCompleteListener extends IJsViewTunnel.Channel { void onSeekComplete(); }
1
2
3- void onSeekComplete()
void setOnErrorListener(OnErrorListener listener)
OnErrorListener
interface OnErrorListener extends IJsViewTunnel.Channel { boolean onError(int what, int extra); }
1
2
3- void onError()
void setOnInfoListener(OnInfoListener listener)
OnInfoListener
interface OnInfoListener extends IJsViewTunnel.Channel { boolean onInfo(int what, int extra); }
1
2
3- void onInfo()
以上未具体说明的接口请参照: Android MediaPlayer (opens new window)
默认实现:对接Android MediaPlayer
注意
JsViewPlugin.MediaPlayer的接口设计成和Android MediaPlayer类同只是为了降低接口学习成本,其和Android MediaPlayer包名不同,请注意区分。
# VideoPlayer
JsViewPlugin.VideoPlayer Channel 是一个类似于Android标准MediaPlayer接口,你可以通过这个接口定制JsView的视频播放器,来解决比如不同Android设备的媒体播放器表现不一致等具体问题。
VideoPlayer继承于JsViewPlugin.MediaPlayer,和AudioPlayer的区别仅仅是在其基础上添加了UI调用。
JsViewPlugin.MediaPlayer 包含的接口。其他接口有:
void setSurface(Surface surface)
void setVideoScalingMode(int mode)
int getVideoWidth()
int getVideoHeight()
void setOnVideoSizeChangedListener(OnVideoSizeChangedListener listener)
OnVideoSizeChangedListener
interface OnVideoSizeChangedListener extends IJsViewTunnel.Channel { void onVideoSizeChanged(int width, int height); }
1
2
3- void onVideoSizeChanged()
以上未具体说明的接口请参照: Android MediaPlayer (opens new window)
默认实现:对接Android MediaPlayer
注意
JsViewPlugin.VideoPlayer的接口设计成和Android MediaPlayer类同只是为了降低接口学习成本,其和Android MediaPlayer包名不同,请注意区分。
# 样例
- 声明通道
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultURLConnection;
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultDomAudio;
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultDomVideo;
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultAudioPlayer;
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultVideoPlayer;
import com.qcode.jsview.plugin.api.JsViewPlugin;
void loadSdk() {
...
JsView.requestSdk(...);
// JsViewPlugin的操作需要放在JsView.requestSdk()之后。
try {
JsViewPlugin jsviewPlugin = JsViewPlugin.GetInstance();
jsviewPlugin.declareChannel(JsViewPlugin.URLConnection.class, DefaultURLConnection.class);
jsviewPlugin.declareChannel(JsViewPlugin.DomAudio.class, DefaultDomAudio.class);
jsviewPlugin.declareChannel(JsViewPlugin.DomVideo.class, DefaultDomVideo.class);
jsviewPlugin.declareChannel(JsViewPlugin.AudioPlayer.class, DefaultAudioPlayer.class);
jsviewPlugin.declareChannel(JsViewPlugin.VideoPlayer.class, DefaultVideoPlayer.class);
jsviewPlugin.syncHandler();
} catch (Exception ex) {
Log.e(TAG, "JsViewPlugin: Failed to declare channel.", ex);
}
...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- 自定义通道
import com.qcode.jsview.plugin.api.DefaultPlugins.DefaultURLConnection;
import com.qcode.jsview.plugin.api.JsViewPlugin;
public static class CustomURLConnection extends DefaultURLConnection {
...
}
void loadSdk() {
...
try {
JsViewPlugin jsviewPlugin = JsViewPlugin.GetInstance();
jsviewPlugin.declareChannel(JsViewPlugin.URLConnection.class, CustomURLConnection.class);
jsviewPlugin.syncHandler();
} catch (Exception ex) {
Log.e(TAG, "JsViewPlugin: Failed to declare channel.", ex);
}
...
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20