# 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
    • 返回: 无
    • 异常:
      • IllegalArgumentException
  • void syncHandler()

    • 功能: 成员函数。同步通过declareChannel()声明的通道到JsView。
                 这个函数必须在JsView.requestSdk()接口后调用,同步后通道才能生效。
    • 参数: 无
    • 返回: 无
    • 异常:
      • ClassNotFoundException
      • IllegalAccessException
      • InvocationTargetException
      • NoSuchFieldException
      • NoSuchMethodException

# 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
    3
    • void 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
      • 返回: 无
      • 异常: 无
  • 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);
  }

  ...
}
1
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);
  }

  ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Last Updated: 2/1/2024, 7:06:47 AM