干的太杂,希望自己能够沉淀沉淀。从今天开始吧。
我的语言组织能力不是太强。就拿项目说事吧。
项目需求:
android 4.0.3机顶盒上,领导有需求想看一下某个服务器上的视频点播。即某个视频网站(该视频网站是个演示demo网站,不会出现点击某个视频就能调用mediaplayer播放)会有单个页面,该页面上有多个视频url,想要实现点击某个视频url就能出现播放该url视频功能。
因为我们的机顶盒浏览器比较特殊,因为我们都是在源码上修改且其不能简单的实现如同手机的视频播放功能。
实现步骤:
1)提供js方法供网页调用,该网页(服务器什么的都是我们公司的,所以在服务器网页添加一个js方法很简单)有一个方法,只要遥控器点击确认就将需要播放的url作为行参传下去。如 jShow.getcurrenturl("http://*******");
2 )浏览器中已经实现了c++和js互相调用的过程,只需要在供js调用的方法中加入该方法。(所有后续改动都是在android4.0.3浏览器源码上改动)
在NGBJshow.h添加一个
+ void getcurrenturl(const String& url) const;
在NGBJshow.cpp添加
+ void NGBJShow::getcurrenturl(const String& url) const
+ {
+ browsePrintf("NGBLab get CurUrl in NGBJshow is:%s\n",url.utf8().data());
+ PlatformBridge::getcurrenturlfromwebkit(m_frame->view(),url.utf8().data());//其中paltformBrige是
+
+ }
在NGBJshow.idl添加
+ void getcurrenturl(in DOMString url);
在Source/WebCore/platform/android/PlatformBridge.h
该bridge负责就是的c++方法到浏览器中
+ static void getcurrenturlfromwebkit(FrameView*,const WTF::String& url);
在 Source/WebKit/android/WebCoreSupport/PlatformBridge.cpp
js的c++方法调用webViewCore方法
+void PlatformBridge::getcurrenturlfromwebkit(FrameView* frameView,const WTF::String& url)
+{
+ android::WebViewCore* webViewCore = android::WebViewCore::getWebViewCore(frameView);
+ webViewCore->notifygetcururl(url);
+}
在Source/WebKit/android/jni/WebViewCore.h
+ void notifygetcururl(const WTF::String& url);
//走jni调用java中的senkeyforgetvodcururl方法
在Source/WebKit/android/jni/WebViewCore.cpp
+ jmethodID m_sendkeyforgetvodcururl;
+ m_javaGlue->m_sendkeyforgetvodcururl=GetJMethod(env, clazz, "senkeyforgetvodcururl","(Ljava/lang/String;)V");
+void WebViewCore::notifygetcururl(const WTF::String& url)
+{
+ JNIEnv* env = JSC::Bindings::getJNIEnv();
+ AutoJObject javaObject = m_javaGlue->object(env);
+ if (!javaObject.get())
+ return;
+ LOGOO("NGBLab in notifygetcururl webviewcore.cpp\n");
+ jstring jUrlStr = wtfStringToJstring(env, url);
+ env->CallVoidMethod(javaObject.get(), m_javaGlue->m_sendkeyforgetvodcururl,jUrlStr);
+ checkException(env);
+
+}
//java中的实现方法
在 framework/base/core/java/android/webkit/WebViewCore.java
+ private void senkeyforgetvodcururl(String url)
+ {
+ Log.e("NGBLab get url of java in webviewcore", "gettime:"+url );
+ mCallbackProxy.onGetVodCurUrl(url);
+
+ }
在framework/base/core/java/android/webkit/CallbackProxy.java
+ private static final int GET_VODCURURL = 301;
+ case GET_VODCURURL:
+ String mUrl= (String)msg.obj;
+ mWebView.onGetVodCurUrl(mUrl);//zxx add
+ if(mWebViewClient != null){
+ //nw do nothing
+ }
+ public void onGetVodCurUrl(String url){
+ Log.e("NGBLab in get url of callbackproxy","url: "+url);
+ Message msg = obtainMessage(GET_VODCURURL,url);
+ // msg.getData().putString("url", url);
+ sendMessage(msg);
+ }
在framework/base/core/java/android/webkit/WebView.java
+void onGetVodCurUrl(String url){
+ Intent intent=new Intent();
+ intent.setAction("mediaplaydemo");
+ intent.putExtra("controlUrl",url);
+ Log.v("NGBLab in webview.java","sen the mediapalydemo & url:"+url);
+ getContext().sendBroadcast(intent);
+
+}
上面的改动可能只是有点多,但是思路不是很麻烦。就是js-->c++->浏览器的webviewcore->java层webcore->calbackproxy->webview->广播出去url。
了解android浏览器framework层的同学应该都知道,平常都是webview主动调用webcore。消息传递到webcore之后是不能直接发广播的。只能功过callbackproxy转毁掉webview,然后与用户层沟通。
具体可了解 http://blog.csdn.net/hxwwf/article/details/7710184
之后可另写一apk,接受到该广播后,调用videoview实现播放网络视频资源。