android 浏览器插件开发 - HelloPlugin

转载请注明出处: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,然后在合适的时机实现需要的功能即可

        

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值