2012-04-06 3 views
0

Ich bin eine Anwendung auf Sencha Touch 2.0.1 & PhoneGap entwickeln.
Ich muss ein Ereignis erfassen und übertragen, das in Sencha Touch in die native Android-Umgebung ausgelöst wird.Android - Ist es möglich, eine native Absicht aus einer Anwendung ausgelöst in PhoneGap

d. H .: Einige Sencha-Schaltflächen mit Berührungssteuerung müssen eine Klickabsicht auslösen, um eine andere Aktivität zu starten (Nicht-PhoneGap-Aktivitäten).

Bisher habe ich verschiedene Beispiele wie webintents und this gefunden. Aber soweit ich sehe, sind diese in meinem Fall nicht anwendbar.

Ich möchte PhoneGap entweder fallen lassen und mit einem anderen Wrapper arbeiten oder dieses Problem irgendwie umgehen. Danke im Voraus!

+0

sagen Sie Sie für Intents hören müssen, die übertragen wurden? –

+0

Nein, andersherum. Ich möchte Absichten aus dem, was in PhoneGap verpackt ist, übertragen. – Mitraidos

Antwort

2

Ich denke, Sie müssen Ihr eigenes Phonegap-Plugin erstellen, das die native Aktivität von innerhalb seiner Execute-Methode startet.

Es gibt ein ContactView-Plugin, das Sie als Anleitung zum Schreiben Ihrer eigenen verwenden können.

https://github.com/phonegap/phonegap-plugins/blob/master/Android/ContactView/ContactView.java

Insbesondere diese beiden Methoden

@Override 
public PluginResult execute(String action, JSONArray args, String callbackId) { 
    startContactActivity(); 
    PluginResult mPlugin = new PluginResult(PluginResult.Status.NO_RESULT); 
    mPlugin.setKeepCallback(true); 
    this.callback = callbackId; 
    return mPlugin; 
} 

public void startContactActivity() { 
    Intent intent = new Intent(Intent.ACTION_PICK); 
    intent.setType(ContactsContract.Contacts.CONTENT_TYPE); 
    this.ctx.startActivityForResult((Plugin) this, intent, PICK_CONTACT); 
} 
+0

+1 Das war ein nützlicher Link https://github.com/phonegap/phonegap-plugins/blob/master/Android/ContactView/ContactView.java – Spiff

0

bei dieser Werfen Sie einen Blick, die expliziten und impliziten Absicht Abschnitte (1.2, 1.3): http://www.vogella.de/articles/AndroidIntent/article.html

für WebIntent.java, einen Blick auf den Quellcode nehmen Sie dann die startActivity Funktion insbesondere: https://github.com/phonegap/phonegap-plugins/blob/master/Android/WebIntent/WebIntent.java

void startActivity(String action, Uri uri, String type, Map<String, String> extras) { 
    Intent i = (uri != null ? new Intent(action, uri) : new Intent(action)); 

Und dann die Absicht Konstrukteure hier (Suche nach Konstrukteurs): http://developer.android.com/reference/android/content/Intent.html

WebIntent unterstützt nicht den Intent-Konstruktor, der eine Android-Klasse benötigt.

Aber Sie können die Funktion erweitern, um es mit einer expliziten Absicht zu haben zu arbeiten (Code unten ist schnell und schmutzig und ungetestet):

void startActivity(String action, Uri uri, String type, String className, Map<String, String> extras) { 
    Intent i; 
    if (uri != null) 
    i = new Intent(action, uri) 
    else if (className != null) 
    i = new Intent(this.ctx, Class.forName(className)); 
    else 
    new Intent(action)); 

Oben, in der Funktion auszuführen, müssen Sie auch die neue parsen Parameter in dem "die Argumente Parsen" -Abschnitt

// Parse the arguments 
JSONObject obj = args.getJSONObject(0); 
String type = obj.has("type") ? obj.getString("type") : null; 
Uri uri = obj.has("url") ? Uri.parse(obj.getString("url")) : null; 
String className = obj.has("className") ? obj.getString("className") : null; 
JSONObject extras = obj.has("extras") ? obj.getJSONObject("extras") : null; 

und dann den neuen Klassennamen String im Aufruf von startActivity einige Zeilen unten passieren:

startActivity(obj.getString("action"), uri, type, className, extrasMap); 

Dann sollten Sie in der Lage sein, eine Android-Aktivität von Klassennamen zu nennen, mit so etwas wie:

Android.callByClassName = function(className) { 
    var extras = {}; 
    extras[WebIntent.EXTRA_CUSTOM] = "my_custom"; 
    extras[WebIntent.EXTRA_CUSTOM2] = "my_custom2"; 
    window.plugins.webintent.startActivity({ 
    className: className, 
    extras: extras 
    }, 
    function() {}, 
    function() { 
    alert('Failed to send call class by classname'); 
    } 
); 

};

Wo der Klassenname ist so etwas wie: com.company.ActivityName

HAFTUNGSAUSSCHLUSS: Raue Code, nicht getestet.

Verwandte Themen