2

Cordova用のカスタムプラグインを作成しようとしています-android。プラグインの目的は、HTML5画面のボタンをクリックするだけでネイティブのAndroidアクティビティの意図を高めることです。したがって、最初は、ボタンのあるHTML5画面が表示されます。ボタンをクリックすると、ネイティブのAndroidアクティビティ画面にリダイレクトされます。

これが私がすでに行ったコードのビットです、

customplugin.js

function CustomPlugin(){};

CustomPlugin.prototype.launchActivity = function(startClass) 
{
alert("@@@ Starting plugin to launch native activity.");
cordova.exec(null, null, 'CustomPlugin', 'launchActivity', [startClass]);
};

if(!window.plugins) {
window.plugins = {};
}
if (!window.plugins.customplugin) {
   window.plugins.customplugin = new CustomPlugin();
}

ただし、このコードでは、「Uncaught TypeError:undefinedのメソッド「launchActivity」を呼び出すことはできません」というメッセージが表示されます。plsはいくつかのサンプルコード例で私を助けます。前もって感謝します。

CustomPlugin.java

package org.apache.cordova.example;

import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.Plugin;
import org.apache.cordova.api.PluginResult;
import org.json.JSONArray;
import org.json.JSONException;

import android.util.Log;

public class CustomPlugin extends CordovaPlugin 
{
@Override
    public boolean execute(String action, final JSONArray args, CallbackContext callbackContext) throws JSONException 
    {
        if ("launchActivity".equals(action)) 
        { 
              String goClass = null; if(args.length() > 0) goClass = args.getString(0);

              Log.i("NATIVE", "Launch class : " + goClass); 
              return true;
          } 
          else 
          { 
              return false;
          }
    }
4

2 に答える 2

3

コードスニペットでは、実際にどこで実行されているのかわかりませんlaunchActivity()。問題があるように思われるので、質問に追加することをお勧めします。

まず、cordova.jsがページにロードされていることを確認してください。次に、を使用しますcordova.exec(これは、require.jsを使用した例ですが、必須ではありません。使用することもできますcordova.exec()

define(['cordova'], function (cordova) {
    'use strict';

    var exec = cordova.require('cordova/exec');

    return {
        changeBackground : function (color) {
            exec(function () {}, function () {}, 'Navbar', 'changeBackground', [color]);
        }
    };

});

必ずres/xml/plugins.xmlにプラグインを追加してください。

<plugin name="Navbar" value="my.package.NavbarPlugin"/>

プラグインを作成するには、を拡張するだけorg.apache.cordova.api.CordovaPluginです。

public class NavbarPlugin extends CordovaPlugin {

    @Override
    public boolean execute(String action, final JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("changeBackground".equals(action)) { ... }
    }

}

編集:

それが機能しない理由は、を実行しているためですwindow.customplugin.launchActivity(...)。は存在しないため、を呼び出すことはwindow.custompluginできません。launchActivityundefined

あなたは電話する必要がありますwindow.plugins.customplugin.launchActivity(...)

于 2013-01-12T16:30:42.887 に答える
2

以下のコードスニペットを見つけて、Android用のネイティブCordovaプラグインを作成し、Web側から呼び出して応答を取得するために必要な構成を作成してください。

例: Cordovaネイティブプラグインを使用したAndroidデバイスからの現在地の緯度と経度。

Androidコード:

 package com.sample.activity;

 import android.app.Activity;
 import android.content.Context
 import android.location.Criteria;
 import android.location.Location;
 import android.location.LocationListener;
 import android.location.LocationManager;
 import android.os.Bundle;
 import android.util.Log;

public class LocationTrackPlugin extends CordovaPlugin implements LocationListener {
public static final String ACTION_START = "GetLocation";
public static CallbackContext callbackContext;
public static Activity activity;

@Override
public boolean execute(String action, final JSONArray jArray,
                       final CallbackContext callbackContext) throws JSONException {
    activity = this.cordova.getActivity();
    boolean result = false;
    if (ACTION_START.equalsIgnoreCase(action)) {
        LocationTrackPlugin.callbackContext = callbackContext;
        LocationManager locationManager = (LocationManager) activity
                .getSystemService(activity.LOCATION_SERVICE);

        if (!locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            PluginResult pluginResult = new PluginResult(
                    PluginResult.Status.OK, "false");
            pluginResult.setKeepCallback(true);
            try {
                callbackContext.sendPluginResult(pluginResult);
            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {

            result = true;
            Location location = getCurrentDeviceLocation(activity);
            String my_location = location.getLatitude() + ":" + location.getLongitude();
            PluginResult pluginResult = new PluginResult(
                    PluginResult.Status.OK, my_location);
            pluginResult.setKeepCallback(true);
            try {
                callbackContext.sendPluginResult(pluginResult);
            } catch (Exception e) {
                e.printStackTrace();
            }

        }

    }

    return result;

}


public Location getCurrentDeviceLocation(Context contxt) {
    LocationManager locationManager;
    String provider;
    Location location = null;
    locationManager = (LocationManager) contxt
            .getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);

    if (provider != null && !provider.equals("")) {
        location = getCurrentLocation(provider, locationManager);
        if (location != null) {
            locationManager.removeUpdates(this);
            return location;

        } else {
            location = getCurrentLocation(LocationManager.NETWORK_PROVIDER,
                    locationManager);
            if (location != null) {
                locationManager.removeUpdates(this);
                return location;
            } else {
                locationManager.removeUpdates(this);
            }
        }
    } else
        Log.d("Location", "No Provider Found");
    return location;
}

public Location getCurrentLocation(String provider,
                                   LocationManager locationManager) {
    Location newlocation = null;
    if (locationManager.isProviderEnabled(provider)) {
        locationManager.requestLocationUpdates(provider, 1000, 1, this);
        if (locationManager != null) {
            newlocation = locationManager.getLastKnownLocation(provider);
            return newlocation;
        }
    }
    return newlocation;
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
}

Manifestfile.xml

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Config.xml(ファイルはappname / cordova / Config.xmlにあります)

 <feature name="LocationTrackPlugin">
    <param name="android-package"   value=com.sample.activity.LocationTrackPlugin" />
</feature>

ShowLocation.js

  callGetlocationPlugin: function() {
    if (Ext.os.is('Android')) {
        cordova.exec(
                function(result) {
                    console.log("Native call success", result);
                                      },
                function() {
                    console.log('Native call failed');
                },
                'LocationTrackPlugin', 'GetLocation', null);
    }
}
于 2015-12-29T06:53:13.840 に答える