android 浏览器插件开发 - HelloPlugin

来源:互联网 发布:手机淘宝2015旧版本 编辑:程序博客网 时间:2024/05/17 09:15

转载请注明出处:http://blog.csdn.net/awebkit


        这一讲我们一起来编写一个简单的浏览器插件 - HelloPlugin

         

         java部分:AndroidManifest.xml

[html] view plaincopy
  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  2.       package="com.example.helloplugin"  
  3.       android:versionCode="1"  
  4.       android:versionName="1.0">  
  5.   
  6.     <uses-permission android:name="android.webkit.permission.PLUGIN"/>  
  7.   
  8.     <uses-sdk android:minSdkVersion="3" />  
  9.   
  10.     <application android:icon="@drawable/hello_browser_plugin"  
  11.                  android:label="@string/hello_browser_plugin">  
  12.         <service android:name=".HelloPlugin">  
  13.             <intent-filter>  
  14.                 <action android:name="android.webkit.PLUGIN" />  
  15.             </intent-filter>  
  16.             <meta-data android:name="type" android:value="native" />  
  17.         </service>  
  18.     </application>  
  19.   
  20. </manifest>  
    HelloPlugin.java代码
[html] view plaincopy
  1. package com.example.helloplugin;  
  2.   
  3. import android.app.Service;  
  4. import android.content.Intent;  
  5. import android.os.IBinder;  
  6.   
  7. public class HelloPlugin extends Service {  
  8.   
  9.     @Override  
  10.     public IBinder onBind(Intent intent) {  
  11.         // TODO Auto-generated method stub  
  12.         return null;  
  13.     }     
  14. }  

   c代码部分。保留main.cpp, main.h, PluginObject.h, PluginObject.cpp,稍微作一些修改。

   修改Android.mk,仿照原来的例子。

   增加hello/HelloPlugin.h hello/HelloPlugin.cpp。这个函数要实现的API有两个

[cpp] view plaincopy
  1. virtual bool supportsDrawingModel(ANPDrawingModel);                           
  2. virtual int16 handleEvent(const ANPEvent* evt);       
    我简单实现的HelloPlugin.cpp代码如下
 

[cpp] view plaincopy
  1. #include "HelloPlugin.h"  
  2.   
  3. extern ANPLogInterfaceV0       gLogI;  
  4. extern ANPCanvasInterfaceV0    gCanvasI;  
  5. ///////////////////////////////////////////////////////////////////////////////  
  6.   
  7. HelloPlugin::HelloPlugin(NPP inst) : SubPlugin(inst) {  
  8.     //  
  9.   
  10.     gLogI.log(kDebug_ANPLogType, "HelloPlugin created...");  
  11.     //register for touch events  
  12.     ANPEventFlags flags = kTouch_ANPEventFlag;  
  13.     NPError err = browser->setvalue(inst, kAcceptEvents_ANPSetValue, &flags);  
  14.     if (err != NPERR_NO_ERROR) {  
  15.         gLogI.log(kError_ANPLogType, "Error selecting input events.");  
  16.     }  
  17. }  
  18.   
  19. HelloPlugin::~HelloPlugin(){  
  20.     //  
  21. }  
  22.   
  23. bool HelloPlugin::supportsDrawingModel(ANPDrawingModel model) {  
  24.     return (model == kBitmap_ANPDrawingModel);  
  25. }  
  26.   
  27. void HelloPlugin::drawPlugin(const ANPBitmap& bitmap, const ANPRectI& clip) {  
  28.   
  29.     // create a canvas  
  30.     ANPCanvas* canvas = gCanvasI.newCanvas(&bitmap);  
  31.   
  32.     // clip the canvas  
  33.     ANPRectF clipR;  
  34.     clipR.left = clip.left;  
  35.     clipR.top = clip.top;  
  36.   
  37.     clipR.right = clip.right;  
  38.     clipR.bottom = clip.bottom;  
  39.     gCanvasI.clipRect(canvas, &clipR);  
  40.   
  41.     // paint the canvas (using the path API)  
  42.     gCanvasI.drawColor(canvas, 0xFF0000FF);  
  43.   
  44.     // delete the canvas  
  45.     gCanvasI.deleteCanvas(canvas);  
  46. }  
  47.   
  48. int16 HelloPlugin::handleEvent(const ANPEvent* evt) {  
  49.     NPP instance = this->inst();  
  50.   
  51.     switch (evt->eventType) {  
  52.         case kDraw_ANPEventType:  
  53.             switch (evt->data.draw.model) {  
  54.                 case kBitmap_ANPDrawingModel:  
  55.                     gLogI.log(kDebug_ANPLogType, "We should draw plugin !!!!!!!!");  
  56.                     drawPlugin(evt->data.draw.data.bitmap, evt->data.draw.clip);  
  57.                     return 1;  
  58.                 default:  
  59.                     break;   // unknown drawing model  
  60.             }  
  61.         case kTouch_ANPEventType:  
  62.             if (kDown_ANPTouchAction == evt->data.touch.action) {  
  63.                 gLogI.log(kDebug_ANPLogType, "touch event occurs!!!!!!!!");  
  64.             }  
  65.              return 1;  
  66.         default:  
  67.             break;  
  68.     }  
  69.     return 0;   // unknown or unhandled event  
  70. }  

        是不是很简单?

    

        插件的实现还是比较简单的,我们只要深入理解了NPAPI,然后在合适的时机实现需要的功能即可

0 0
原创粉丝点击