(PhoneGap)JavascriptからJavaメソッドを呼び出すことは可能だと思います。
誰もそれを行う方法を知っていますか? (PhoneGapのソースコードを変更することでそれを行う方法を知っていますが、それは避けたいです)
ようやく機能しました。
使用するメソッドを含むクラスを作成します。
public class MyClass {
private WebView mAppView;
private DroidGap mGap;
public MyClass(DroidGap gap, WebView view)
{
mAppView = view;
mGap = gap;
}
public String getTelephoneNumber(){
TelephonyManager tm =
(TelephonyManager) mGap.getSystemService(Context.TELEPHONY_SERVICE);
String number = tm.getLine1Number();
return number;
}
}
メインアクティビティで、このクラスのJavascriptインターフェイスを追加します。
public class Main extends DroidGap
{
private MyClass mc;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.init();
mc = new MyClass(this, appView);
appView.addJavascriptInterface(mc, "MyCls");
super.loadUrl(getString(R.string.url));
}
}
Javascriptでwindow.MyClsメソッドを呼び出す:
<script>
$(function(){
$("#phone").text("My telephone number is: " +
window.MyCls.getTelephoneNumber());
});
</script>
注:
コメントで述べたように、Androidバージョン4.2以降では、@JavascriptInterface
をHTMLページからアクセスしたいメソッドに。 参照 。
addJavaScriptInterface(mc, "MyCls")
ギャップなしinit()
edはアプリをクラッシュさせる可能性があるため、super.init()
の前にaddJavascriptInterface()
を追加することをお勧めします
public class Main extends DroidGap
{
private MyClass mc;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
super.init();
mc = new MyClass(this, appView);
appView.addJavascriptInterface(mc, "MyCls");
super.loadUrl(getString(R.string.url));
}
}
PhoneGapにはまともなプラグインAPIがあります。 IPluginインターフェイスを実装することにより、プラグインをJavaで記述します。ほとんどの魔法はexecute()関数にあります。
public interface IPlugin {
/**
* Executes the request and returns PluginResult.
*
* @param action The action to execute.
* @param args JSONArry of arguments for the plugin.
* @param callbackId The callback id used when calling back into JavaScript.
* @return A PluginResult object with a status and message.
*/
PluginResult execute(String action, JSONArray args, String callbackId);
// ... more ...
}
プラグインの作成を開始する最良の方法は、最初にJavaScript APIを作成することです。通常、カスタムjavascriptクラスを作成し、javascriptクラスの各メソッドで変数をマーシャリングし、Phonegap.exec()メソッドを使用して開発したプラグインを呼び出します。参照用のメソッドシグネチャは次のとおりです。
/* src/com/phonegap/api/PluginManager.Java */
/**
* Receives a request for execution and fulfills it by finding the appropriate
* Java class and calling it's execute method.
*
* PluginManager.exec can be used either synchronously or async. In either case, a JSON encoded
* string is returned that will indicate if any errors have occurred when trying to find
* or execute the class denoted by the clazz argument.
*
* @param service String containing the service to run
* @param action String containt the action that the class is supposed to perform. This is
* passed to the plugin execute method and it is up to the plugin developer
* how to deal with it.
* @param callbackId String containing the id of the callback that is execute in JavaScript if
* this is an async plugin call.
* @param args An Array literal string containing any arguments needed in the
* plugin execute method.
* @param async Boolean indicating whether the calling JavaScript code is expecting an
* immediate return value. If true, either PhoneGap.callbackSuccess(...) or
* PhoneGap.callbackError(...) is called once the plugin code has executed.
*
* @return JSON encoded string with a response message and status.
*/
@SuppressWarnings("unchecked")
public String exec(final String service, final String action,
final String callbackId, final String jsonArgs,
final boolean async)
プラグインも登録する必要があります。これを行うには、カスタムjavascriptライブラリの下部に登録コードを追加します。
次の例では、作成者はjavascript BarcodeScannerクラスを定義し、addConstructorメソッドを使用して登録します。
AddConstructorで2つのステップが実行されます。
JavaScriptでBarcodeScannerの新しいインスタンスを作成し、登録します。これはjavascriptでwindow.plugins.barcodeScannerとしてアクセス可能です
カスタムプラグインクラスをサービス名で登録します。このサービス名は、PhoneGapがJavaプラグインクラスをインスタンス化し、execute()メソッドを呼び出すことができるように、PhoneGap.execの最初の引数として渡されます。
サンプル登録コード:
PhoneGap.addConstructor(function() {
/* The following registers an instance of BarcodeScanner in window.plugins.barcodeScanner */
PhoneGap.addPlugin('barcodeScanner', new BarcodeScanner());
/* The following associates a service name BarcodeScanner with a class com.beetight.barcodescanner.BarcodeScanner */
/* The service name is the first argument passed into PhoneGap.exec */
PluginManager.addService("BarcodeScanner","com.beetight.barcodescanner.BarcodeScanner");
});
より単純なフォーム:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.init();
super.appView.getSettings().setJavaScriptEnabled(true);
super.appView.addJavascriptInterface(this, "MyCls");
super.loadUrl("file:///Android_asset/www/login.html");
}
上記のコードを使用してだれかがnullPointer例外を受け取った場合、最初にsuper.oncreate()を実行し、次にsuper..init()を実行します
super.onCreate(savedInstanceState);
super.init();
ここでこのソリューションを見つけました: Phonegap Google Group
解決策を提供してくれた@ zorglub76に感謝します。
JavaScriptからネイティブへの通信は、AndroidネイティブコードのJavaScriptプロンプト関数をオーバーライドすることで実現され、渡されるメッセージはiOSで使用されるものとよく似ています。以前はWebView.addJavascriptInterfaceを使用してJavaオブジェクトをJavaScriptサンドボックスに直接追加していましたが、一部のデバイスがAndroid 2.3でクラッシュしていました。 JavaScriptをネイティブから呼び出すには、現在WebView.loadUrl(” javascript:…”)を使用しますが、いくつかの問題があるため、すぐにローカルHTTPサーバーを呼び出すJavaメッセージキューのポーリングに移行します。存続XHR接続。