2013-03-13 15 views
5

Próbuję uzyskać wywołanie adresu URL do mojej aplikacji, ale po jej otwarciu zawsze wydaje się, że jest to null nie ważne co ja zrobić.Schemat URL dla systemu Android: intent.getData() == null (PhoneGap)

Tutaj jest odpowiednia część mojego manifestu:

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

A oto moja Java:

@Override 
public void onStart() { 

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

    Uri url = intent.getData(); 

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

} 

Rejestr jest wyprowadzanie "Intent = null", i nie mam żadnych błędów.

Nie jestem programistą java, więc może mam prosty problem, którego nie rozpoznaję. Mam zamiar przekazać to do mojej aplikacji PhoneGap z sendJavascript, ale bycie aplikacją PhoneGap nie wydaje się istotne dla tego problemu.

EDIT:

I wydają się być coraz tylko pierwszy <intent-filter> gdy loguję intent. Oto 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) } 

ROZWIĄZANIE:

Po wylaniu przez dziesiątki postów na temat implementacji schematów URL, aby otworzyć aplikację PhoneGap, a żaden z nich są bardzo wytrzymałe i działa w ogóle, Zamierzam opublikować moje pełne rozwiązanie i mam nadzieję, że ktoś uzna to za przydatne.

Krok pierwszy: AndroidManifest.xml - Dodaj tę <intent-filter> do swojego <activity>, zmieniając "urlScheme" na cokolwiek chcesz. W takim przypadku możesz kliknąć link do urlScheme: ///? Key = val, aby otworzyć aplikację.

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

Krok drugi: myApp.java - dodaj następujące pod onCreate. Jeśli używasz singleTask, pamiętaj, aby umieścić swoją logikę w funkcji onStart (zamiast w onCreate, jak inni trąbili), ponieważ pozwoli ci to połączyć się z twoją aplikacją, czy już działa, czy nie.

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

Zobacz zaakceptowane odpowiedź na wyjaśnienie onNewIntent ręcznym.

+0

Myślę, że końcowy intent intent = getIntent(); powinien być ostateczny Intent intent = intent.getIntent(); –

+0

Jak to zrobić? "intencja" jeszcze nie istnieje. Spróbuję tego. – bearfriend

+0

Tak, to nie jest metoda. Wierzę, że logowałem "intencję" tak jak jest i otrzymałem z tego coś. To tylko wywoływanie metod, aby uzyskać dane z niego zawsze jest zerowe. – bearfriend

Odpowiedz

14

Spróbuj zastąpić onNewIntent. Problem polega na tym, że getIntent zwraca Intent, który rozpoczął Activity, ale nie najnowszy. Ale możesz to zmienić, używając metody setIntent.

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

Dzięki działa jak urok. Jedyne, co muszę zrobić z moim rozwiązaniem, to. Kiedy wprowadzałem nową aktywność, powiedz ActivityZ z mojej głównej działalności, w mojej metodzie onStart. Ale co się dzieje, gdy tylko wracam do głównej aktywności, ponownie uruchamia ActivityZ, więc to, co zrobiłem, to jawne ustawienie danych intencji na zero. – cocoaNoob

0

Przedłużenie oryginalnej odpowiedzi, w przypadku, gdy główna aktywność rozpoczyna inną aktywność. Wtedy może skończyć się nieskończoną pętlą uruchamiania działania raz po raz, kiedy wrócisz do głównej aktywności z uruchomionej aktywności.

Oto kod

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

Nadzieję, że to pomaga.

+0

Musisz ustawić android: launchMode = "singleTask" na aktywności w Twoim AndroidManifest.xml (patrz kod w pytaniu) – jackocnr

Powiązane problemy