android 浏览器插件开发 - HelloPlugin

来源:互联网 发布:java程序员培训价格 编辑:程序博客网 时间:2024/05/29 12:32

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


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

         

         java部分:AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"      package="com.example.helloplugin"      android:versionCode="1"      android:versionName="1.0">    <uses-permission android:name="android.webkit.permission.PLUGIN"/>    <uses-sdk android:minSdkVersion="3" />    <application android:icon="@drawable/hello_browser_plugin"                 android:label="@string/hello_browser_plugin">        <service android:name=".HelloPlugin">            <intent-filter>                <action android:name="android.webkit.PLUGIN" />            </intent-filter>            <meta-data android:name="type" android:value="native" />        </service>    </application></manifest>
    HelloPlugin.java代码
package com.example.helloplugin;import android.app.Service;import android.content.Intent;import android.os.IBinder;public class HelloPlugin extends Service {    @Override    public IBinder onBind(Intent intent) {        // TODO Auto-generated method stub        return null;    }   }

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

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

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

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

#include "HelloPlugin.h"extern ANPLogInterfaceV0       gLogI;extern ANPCanvasInterfaceV0    gCanvasI;///////////////////////////////////////////////////////////////////////////////HelloPlugin::HelloPlugin(NPP inst) : SubPlugin(inst) {    //    gLogI.log(kDebug_ANPLogType, "HelloPlugin created...");    //register for touch events    ANPEventFlags flags = kTouch_ANPEventFlag;    NPError err = browser->setvalue(inst, kAcceptEvents_ANPSetValue, &flags);    if (err != NPERR_NO_ERROR) {        gLogI.log(kError_ANPLogType, "Error selecting input events.");    }}HelloPlugin::~HelloPlugin(){    //}bool HelloPlugin::supportsDrawingModel(ANPDrawingModel model) {    return (model == kBitmap_ANPDrawingModel);}void HelloPlugin::drawPlugin(const ANPBitmap& bitmap, const ANPRectI& clip) {    // create a canvas    ANPCanvas* canvas = gCanvasI.newCanvas(&bitmap);    // clip the canvas    ANPRectF clipR;    clipR.left = clip.left;    clipR.top = clip.top;    clipR.right = clip.right;    clipR.bottom = clip.bottom;    gCanvasI.clipRect(canvas, &clipR);    // paint the canvas (using the path API)    gCanvasI.drawColor(canvas, 0xFF0000FF);    // delete the canvas    gCanvasI.deleteCanvas(canvas);}int16 HelloPlugin::handleEvent(const ANPEvent* evt) {    NPP instance = this->inst();    switch (evt->eventType) {        case kDraw_ANPEventType:            switch (evt->data.draw.model) {                case kBitmap_ANPDrawingModel:                    gLogI.log(kDebug_ANPLogType, "We should draw plugin !!!!!!!!");                    drawPlugin(evt->data.draw.data.bitmap, evt->data.draw.clip);                    return 1;                default:                    break;   // unknown drawing model            }        case kTouch_ANPEventType:            if (kDown_ANPTouchAction == evt->data.touch.action) {                gLogI.log(kDebug_ANPLogType, "touch event occurs!!!!!!!!");            }             return 1;        default:            break;    }    return 0;   // unknown or unhandled event}

        是不是很简单?

    

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

        

原创粉丝点击