2013-03-13 3 views
5

Also versuche ich eine URL in meiner App aufgerufen werden, aber nachdem es öffnet, scheint es immer nur null egal was ich machen.Android URL Schema: intent.getData() == null (PhoneGap)

Hier ist der relevante Teil meines manifest:

<activity android:name="myapp" android:label="@string/app_name" 
      android:theme="@android:style/Theme.Black.NoTitleBar" 
      android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" 
      android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

     <intent-filter> 
      <data android:scheme="myapp" /> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
     </intent-filter> 

    </activity> 

Und hier ist mein Java:

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    Uri url = intent.getData(); 

    Log.e("myLog", "Url = " + url); 

} 

Das Protokoll "Intent = null" ausgibt, und ich habe keine Fehler.

Ich bin kein Java-Entwickler, so dass ich ein einfaches Problem habe, das ich nicht erkenne. Ich werde dies in meine PhoneGap-App mit sendJavascript weiterleiten, aber eine PhoneGap-App scheint für dieses Problem nicht relevant.

EDIT:

ich nur scheinen die erste <intent-filter> bekommen, wenn ich intent anmelden. Hier ist das Protokoll:

03-13 12:36:18.593: E/MyAppLog(13793): Intent=Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10000000 cmp=com.wd.myapp/.myapp (has extras) } 

LÖSUNG:

Nach dem Gießen durch Dutzende von Stellen, wie URL-Schemata zu implementieren Ihre PhoneGap App zu öffnen, und keiner von ihnen sind sehr robust oder überhaupt arbeiten, Ich werde meine vollständige Lösung posten und hoffe, dass jemand sie nützlich findet.

Schritt eins: AndroidManifest.xml - Fügen Sie dieses <intent-filter> zu Ihrem <activity> hinzu und ändern Sie 'urlScheme' zu was auch immer Sie mögen. In diesem Fall könnten Sie auf einen Link zu urlScheme: ///? Key = val klicken und die App öffnen.

<intent-filter> 
    <data android:scheme="urlScheme" /> 
    <action android:name="android.intent.action.VIEW" /> 
    <category android:name="android.intent.category.DEFAULT" /> 
    <category android:name="android.intent.category.BROWSABLE" /> 
</intent-filter> 

Zweiter Schritt: myApp.java - unter onCreate folgendes hinzufügen. Wenn Sie singleTask verwenden, stellen Sie sicher, dass Sie Ihre intent Logik in der onStart Funktion (anstatt in onCreate, wie andere haben trompeted), wie Sie können in Ihre App verknüpfen, ob es bereits läuft oder nicht.

@Override 
public void onStart() { 

    super.onStart(); 
    final Intent intent = getIntent(); 

    String url = intent.getDataString(); 

    if(url != "" && url != null) { 
     super.sendJavascript("setTimeout(function() { handleOpenURL('" + url + "'); },1);"); 
    }     


} 

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); setIntent(intent); 
} 

Siehe die akzeptierte Antwort auf eine Erklärung der onNewIntent außer Kraft setzen.

+0

Ich denke, endgültige Absicht intent = getIntent(); sollte endgültig sein intent intent = intent.getIntent(); –

+0

Wie so? 'Absicht' existiert noch nicht. Ich werde es versuchen. – bearfriend

+0

Ja, es ist keine Methode. Ich glaube, ich habe "Absicht" protokolliert, wie es ist und habe etwas davon. Es ruft nur Methoden auf, um Daten daraus zu erhalten, ist immer null. – bearfriend

Antwort

14

Versuchen Sie, onNewIntent zu überschreiben. Das Problem ist, dass getIntent die Intent zurückgibt, die die Activity startete, aber nicht die neueste. Aber Sie können es mit der Methode setIntent überschreiben.

@Override 
protected void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    setIntent(intent); 
} 
+0

Danke funktioniert wie ein Zauber. Einzige Sache, die ich auf meiner Lösung tun muss, ist. Als ich eine neue Aktivität startete, sagte ActivityZ von meiner Hauptaktivität in meiner onStart Methode. Aber was passierte, wenn ich wieder zur Hauptaktivität zurückkehrte, startet ActivityZ wieder, also habe ich explizit die Absichtsdaten auf null gesetzt. – cocoaNoob

0

Erweitern der ursprünglichen Antwort, falls Ihre Hauptaktivität eine andere Aktivität startet. Dann kann es zu endlosen Schleifen kommen, in denen die Aktivität immer wieder gestartet wird, wenn Sie von der gestarteten Aktivität zur Hauptaktivität zurückkehren.

Hier ist der Code

public void onStart(){ 
     super.onStart(); 
     Intent intent = getIntent(); 
     Uri data = intent.getData(); 
     if (data != null) { 
      // explicitly set intent data to null 
      // so on next launch, from same lifecycle of activity 
      // it does not restart the Activity Z. 
      intent.setData(null); 
      Intent activityZ = new Intent(MyActivity.this, ActivityZ.class); 
       businessViewActivity.putExtra("url", data.toString()); 
       startActivity(activityZ); 
     } 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     setIntent(intent); 
    } 

Hoffe, es hilft.

+0

Sie müssen Android: launchMode = "singleTask" für die Aktivität in Ihrem AndroidManifest.xml (siehe den Code in der Frage) – jackocnr