本文主要介绍PhoneGap视频插件的代码更新,具体插件的开发过程请参照我以前的博文《phonegap之android端插件开发》。现在PhoneGap已经把代码移交到apache开源项目cordova里面,本文代码的更新主要涉及到两项,一是把以前phoneGap的引用迁移到cordova的引用中,二是在原来插件代码的基础上增加回调机制。
以前版本的视频插件可以在android设备上面正常工作,但是有一个潜在的问题,因为插件启动视频播放利用的是 “startActivity”方法,无法获取到视频播放结束的消息,本次代码的主要改进就是改变原来启动视频播放的函数,使用“startActivityForResult”方法,这样当视频播放结束的时候,“onActivityResult”方法会被回调,从而该插件就能正确通知插件使用者视频已正常播放结束,可以继续处理其他流程。
Java 端的完整代码如下:
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package com.dlgreat.bbhtml.plugins; import org.apache.cordova.api.Plugin; import org.apache.cordova.api.PluginResult; import org.json.JSONArray; import org.json.JSONException; import android.content.Intent; import android.net.Uri; public class VideoPlayer extends Plugin { private String callbackId; @Override public PluginResult execute(String action, JSONArray args, String callbackId) { this.callbackId = callbackId; PluginResult.Status status = PluginResult.Status.OK; String result = ""; try { if (action.equals("playVideo")) { playVideo(args.getString(0)); PluginResult res = new PluginResult(PluginResult.Status.NO_RESULT); res.setKeepCallback(true); return res; } return new PluginResult(status, result); } catch (JSONException e) { return new PluginResult(PluginResult.Status.JSON_EXCEPTION); } } private void playVideo(String url) { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "video/*"); this.ctx.startActivityForResult(this, intent, 0); } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { success(new PluginResult(PluginResult.Status.OK, ""), callbackId); } } } |
package com.dlgreat.bbhtml.plugins;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;
import android.content.Intent;
import android.net.Uri;
public class VideoPlayer extends Plugin {
private String callbackId;
@Override
public PluginResult execute(String action, JSONArray args, String callbackId) {
this.callbackId = callbackId;
PluginResult.Status status = PluginResult.Status.OK;
String result = "";
try {
if (action.equals("playVideo")) {
playVideo(args.getString(0));
PluginResult res = new PluginResult(PluginResult.Status.NO_RESULT);
res.setKeepCallback(true);
return res;
}
return new PluginResult(status, result);
} catch (JSONException e) {
return new PluginResult(PluginResult.Status.JSON_EXCEPTION);
}
}
private void playVideo(String url) {
Uri uri = Uri.parse(url);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(uri, "video/*");
this.ctx.startActivityForResult(this, intent, 0);
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
success(new PluginResult(PluginResult.Status.OK, ""), callbackId);
}
}
}Javascript端的完整代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /* PhoneGap 视频播放插件*/ /** * Constructor */ function VideoPlayer() {}; /** * Starts the video player intent * * @param url The url to play */ VideoPlayer.prototype.play = function(url, successCallback, errorCallback) { cordova.exec(successCallback, errorCallback, "VideoPlayer", "playVideo", [url]); }; /** * Load VideoPlayer */ cordova.addConstructor(function() { cordova.addPlugin("videoplayer", new VideoPlayer()); }); |
/* PhoneGap 视频播放插件*/
/**
* Constructor
*/
function VideoPlayer() {};
/**
* Starts the video player intent
*
* @param url The url to play
*/
VideoPlayer.prototype.play = function(url, successCallback, errorCallback) {
cordova.exec(successCallback, errorCallback, "VideoPlayer", "playVideo", [url]);
};
/**
* Load VideoPlayer
*/
cordova.addConstructor(function() {
cordova.addPlugin("videoplayer", new VideoPlayer());
});插件的配置代码如下(xml/plugins.xml):
1 | <plugin name="VideoPlayer" value="com.dlgreat.bbhtml.plugins.VideoPlayer"/> |
<plugin name="VideoPlayer" value="com.dlgreat.bbhtml.plugins.VideoPlayer"/>
插件的使用代码如下:
1 2 3 4 5 6 7 8 | BBGlobalData.validBackKey = false; window.plugins.videoplayer.play(data, function() { console.log('play video ok done !!!'); setTimeout(function(){BBGlobalData.validBackKey = true;}, 300); }, function() { console.log('play video error done !!!'); setTimeout(function(){BBGlobalData.validBackKey = true;}, 300); }); |
BBGlobalData.validBackKey = false;
window.plugins.videoplayer.play(data, function() {
console.log('play video ok done !!!');
setTimeout(function(){BBGlobalData.validBackKey = true;}, 300);
}, function() {
console.log('play video error done !!!');
setTimeout(function(){BBGlobalData.validBackKey = true;}, 300);
});通过如上代码的修正,即可以在程序中正确处理视频播放的消息回调,插件的待完善之处就是只处理了视频播放成功的消息,默认支持所有的视频格式,可以在java端代码的实现中加入视频文件格式的判断,文件完整性的判断等等,如果有出错的时候,可以利用“error”方法来返回处理结果,具体的参数和“success”一致!




