2013-03-13 3 views
5

Quindi sto cercando di ottenere un URL che viene chiamato nella mia app, ma dopo l'apertura, sembra sempre essere null non importa quello che ho fare.Schema URL Android: intent.getData() == null (PhoneGap)

Ecco la parte rilevante del mio manifesto:

<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> 

Ed ecco il mio java:

@Override 
public void onStart() { 

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

    Uri url = intent.getData(); 

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

} 

Il registro è l'output "Intent = null", e non ho nessun errore.

Non sono uno sviluppatore Java quindi potrei avere un semplice problema che non riconosco. Ho intenzione di passare questo nella mia app PhoneGap con sendJavascript ma essere un'app PhoneGap non sembra pertinente a questo problema.

EDIT:

mi sembra di essere sempre solo il primo <intent-filter> quando accedo intent. Ecco il log:

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) } 

SOLUZIONE:

Dopo aver versato attraverso decine di messaggi su come implementare schemi URL per aprire il tuo PhoneGap app, e nessuno di loro di essere molto robusto o di lavoro a tutti, Inserirò la mia soluzione completa e spero che qualcuno la trovi utile.

Passo uno: AndroidManifest.xml - Aggiungi questo <intent-filter> al tuo <activity>, modifica di "urlScheme" in base alle esigenze. In questo caso, puoi fare clic su un link a urlScheme: ///? Key = val e aprire l'app.

<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> 

Fase due: myApp.java - Aggiungere il seguente sotto onCreate. Se utilizzi singleTask, assicurati di inserire la tua logica nella funzione onStart (anziché in onCreate, come altri hanno sbandierato), in quanto ciò ti consentirà di collegarti alla tua app se è già in esecuzione o meno.

@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); 
} 

vedere la risposta accettato per una spiegazione del onNewIntent override.

+0

Penso che Intent final intent = getIntent(); dovrebbe essere Intent finale intent = intent.getIntent(); –

+0

In che modo? 'intento' non esiste ancora. Ci proverò comunque. – bearfriend

+0

Sì, non è un metodo. Credo di aver registrato 'intent' as is e di averne ricavato qualcosa. È solo chiamando metodi su di esso per ottenere i dati da esso è sempre nullo. – bearfriend

risposta

14

Provare a ignorare onNewIntent. Il problema è che getIntent restituisce Intent che ha avviato Activity, ma non il più recente. Ma puoi sostituirlo usando il metodo setIntent.

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

Grazie funziona come un fascino. L'unica cosa che devo fare sulla mia soluzione è. Mentre stavo lanciando una nuova attività, indica ActivityZ dalla mia attività principale, nel mio metodo onStart. Ma quello che stava succedendo come quando torno all'attività principale lancia di nuovo ActivityZ, quindi quello che ho fatto è impostare esplicitamente i dati di intent su null. – cocoaNoob

0

Estensione della risposta originale, nel caso in cui l'attività principale avvii un'altra attività. Quindi può finire in loop infiniti per lanciare l'attività ancora e ancora quando si ritorna all'attività principale dall'attività avviata.

Ecco il codice

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); 
    } 

Speranza che aiuta.

+0

Devi impostare android: launchMode = "singleTask" sull'attività nel tuo AndroidManifest.xml (vedi il codice nella domanda) – jackocnr