Java yöntemlerini (PhoneGap) Javascript'ten çağırmanın mümkün olduğuna inanıyorum.
Bunu nasıl yapacağını bilen var mı? (PhoneGap'in kaynak kodunu değiştirerek bunu nasıl yapacağımı biliyorum ama bundan kaçınırım)
Yanıtlar:
Sonunda çalıştırdım.
Kullanmak istediğiniz yöntemlerle bir sınıf oluşturun:
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;
}
}
Ana etkinliğinizde bu sınıf için bir Javascript arayüzü ekleyin:
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 çağrı penceresinde. MyCls yöntemleri:
<script>
$(function(){
$("#phone").text("My telephone number is: " +
window.MyCls.getTelephoneNumber());
});
</script>
Not:
Yorumda belirtildiği gibi, Android 4.2 ve üzeri sürümler @JavascriptInterfaceiçin HTML sayfanızdan erişmek istediğiniz yöntemi ekleyin . Referans .
addJavaScriptInterface(mc, "MyCls")Gap init()ed olmadan uygulamanın ezilmesine neden olabilir, daha super.init()önce eklemelisinizaddJavascriptInterface()
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, iyi bir Eklenti API'sine sahiptir. Eklentiyi, IPlugin arayüzünü uygulayarak Java ile yazarsınız. Sihrin çoğu execute () işlevindedir.
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 ...
}
Bir eklenti yazmaya başlamanın en iyi yolu, önce javascript API'sini yazmaktır. Tipik olarak özel bir javascript sınıfı yazarak başlarsınız ve javascript sınıfındaki her yöntemde, değişkenleri sıralayın ve Phonegap.exec () yöntemini kullanarak geliştirdiğiniz eklentiyi çağırın. İşte referansınız için yöntem imzası.
/* 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)
Eklentiyi de kaydetmeniz gerekir. Bunu, özel javascript kitaplığınızın altına kayıt kodunu ekleyerek yaparsınız.
Aşağıdaki örnekte, yazar bir javascript BarcodeScanner sınıfı tanımladı ve addConstructor yöntemini kullanarak bunu kaydeder.
AddConstructor'da iki adım gerçekleştirilir:
JavaScript'te yeni bir BarcodeScanner örneği oluşturun ve bunu kaydeder. Buna javascript'te window.plugins.barcodeScanner olarak erişilebilir.
Özel Plugin sınıfını bir hizmet adıyla kaydeder. Bu hizmet adı PhoneGap.exec'e ilk argüman olarak aktarılır, böylece PhoneGap java eklenti sınıfını başlatabilir ve üzerinde execute () yöntemini çağırabilir.
Örnek kayıt kodu:
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");
});
daha basit bir form:
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");
}
Yukarıdaki kodu kullanan herhangi biri nullPointer istisnası alırsa, önce super.oncreate () ve ardından super..init () yapın
super.onCreate(savedInstanceState);
super.init();
Bu çözümü burada buldum: Phonegap Google Grubu
Çözüm için @ zorglub76'ya çok teşekkürler ....
JavaScript'ten yerele iletişim, Android yerel kodundaki JavaScript komut istemi işlevinin geçersiz kılınmasıyla sağlanır ve iletilen mesaj iOS'ta kullanılana çok benzer. Java nesnelerini doğrudan JavaScript sanal alanına eklemek için WebView.addJavascriptInterface'i kullanırdık, ancak bu, bazı cihazların Android 2.3 ile çökmesine neden oluyordu. Yerelden JavaScript'i çağırmak için şu anda WebView.loadUrl (”javascript:…”) kullanıyoruz, ancak bu bazı sorunları var, bu nedenle kısa süre sonra uzun ömürlü bir XHR bağlantısı aracılığıyla yerel bir HTTP sunucusunu çağıran bir Java mesaj kuyruğunu sorgulamaya geçeceğiz.