2015-03-27 27 views
6

Zgodnie z tymi instrukcjami https://developers.facebook.com/docs/sharing/android Zaimplementowałem Facebook ShareDialog, aby pojawił się w mojej aplikacji, ale powoduje następujący błąd.Facebook Android SDK v4.0.0 ShareDialog Wydanie NullPointerException

03-27 16:12:53.150: E/AndroidRuntime(10275): FATAL EXCEPTION: main 03-27 16:12:53.150: E/AndroidRuntime(10275): Process: au.com.elegantmedia.emotit, PID: 10275 03-27 16:12:53.150: E/AndroidRuntime(10275): java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Object.hashCode()' on a null object reference 03-27 16:12:53.150: E/AndroidRuntime(10275): at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:746) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.Utility.getDialogFeatureConfig(Utility.java:859) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.DialogPresenter.getVersionSpecForFeature(DialogPresenter.java:248) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.DialogPresenter.getProtocolVersionForNativeDialog(DialogPresenter.java:234) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.DialogPresenter.canPresentNativeDialogWithFeature(DialogPresenter.java:75) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog.canShowNative(ShareDialog.java:133) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog.access$0(ShareDialog.java:130) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog$NativeHandler.canShow(ShareDialog.java:241) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.share.widget.ShareDialog$NativeHandler.canShow(ShareDialog.java:1) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.FacebookDialogBase.createAppCallForMode(FacebookDialogBase.java:184) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.FacebookDialogBase.showImpl(FacebookDialogBase.java:147) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.FacebookDialogBase.show(FacebookDialogBase.java:142) 03-27 16:12:53.150: E/AndroidRuntime(10275): at au.com.elegantmedia.emotit.activities.MainActivity.onTellAFriendClick(MainActivity.java:299) 03-27 16:12:53.150: E/AndroidRuntime(10275): at au.com.elegantmedia.emotit.activities.MainActivity.onItemClick(MainActivity.java:194) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AdapterView.performItemClick(AdapterView.java:300) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView.performItemClick(AbsListView.java:1143) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3044) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.widget.AbsListView$3.run(AbsListView.java:3833) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Handler.handleCallback(Handler.java:739) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Handler.dispatchMessage(Handler.java:95) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.os.Looper.loop(Looper.java:135) 03-27 16:12:53.150: E/AndroidRuntime(10275): at android.app.ActivityThread.main(ActivityThread.java:5221) 03-27 16:12:53.150: E/AndroidRuntime(10275): at java.lang.reflect.Method.invoke(Native Method) 03-27 16:12:53.150: E/AndroidRuntime(10275): at java.lang.reflect.Method.invoke(Method.java:372) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 03-27 16:12:53.150: E/AndroidRuntime(10275): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Na linii

03-27 16:12:53.150: E/AndroidRuntime(10275): at com.facebook.internal.Utility.getDialogFeatureConfig(Utility.java:859)

jest następujący fragment kodu,

FetchedAppSettings settings = fetchedAppSettings.get(applicationId); 

Zarówno fetchedAppSettings - {} i applicationId - null wydaje się być nie zainicjowany.

Jedyne miejsce, w którym znajduje się applicationId, znajduje się w pliku manifestu.

<provider android:authorities="com.facebook.app.FacebookContentProviderXXX" 
     android:name="com.facebook.FacebookContentProvider" 
     android:exported="true"/> 

XXX będący identyfikatorem aplikacji i poprawnie go umieściłem. Wszystko odbywa się również takie jak

FacebookSdk.sdkInitialize(getApplicationContext()); 

    callBackManager = CallbackManager.Factory.create(); 
    shareDialog = new ShareDialog(this); 
    shareDialog.registerCallback(callBackManager, new FacebookCallback<Sharer.Result>() { 

     @Override 
     public void onSuccess(Result result) { 
      ELog.d(LOG_TAG, "success"); 
     } 

     @Override 
     public void onError(FacebookException error) { 
      ELog.d(LOG_TAG, "error"); 
     } 

     @Override 
     public void onCancel() { 
      ELog.d(LOG_TAG, "cancel"); 
     } 
    }); 

w onCreate() i powołania,

if (ShareDialog.canShow(ShareLinkContent.class)) { 
     ShareLinkContent linkContent = new ShareLinkContent.Builder() 
       .setContentTitle("Hello Facebook") 
       .setContentDescription(
         "The 'Hello Facebook' sample showcases simple Facebook integration") 
       .setContentUrl(
         Uri.parse("http://developers.facebook.com/android")) 
       .setImageUrl(Uri.parse("https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfa1/t39.2178-6/11057086_1577191859234204_214246289_n.png")) 
       .build(); 

     shareDialog.show(linkContent); 
    } 

gdy użytkownik kliknie w celu udostępniania materiałów. Czy jest coś, co przeoczyłem? Czy mogę uruchomić jakiś błąd w nowym SDK, który powoduje, że NullPointerException?

Odpowiedz

14

Należy również dodać identyfikator aplikacji tak:

<application android:label="@string/app_name" ...> 
    ... 
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/> 
    ... 
</application> 
+0

Dzięki Gokhan. Rzeczywiście opuściłem dwie rzeczy. To, o czym wspomniałeś powyżej i poniżej. " " Wiem, że pochodząc z poprzednich wersji, te rzeczy muszą tam być, ale szkoda, że ​​nie wspomniano o tym w linku Podałem w moim pytaniu. Właściwie to próbuję zintegrować Facebook SDK z aplikacją na Androida po latach. – JanithaR

+0

Masz rację, @JanithaR, dopilnuję, aby dokumentacja została zaktualizowana, dzięki za informację zwrotną. –

+0

Gokhan Caglar Jestem w tym samym czasie za + 24 godziny. Śledziłem wspomniany link i aktualizowałem go zgodnie z Twoim komentarzem. Nadal otrzymuję ten sam wyjątek nullpointer. Czy mogą być inne przyczyny tego błędu? – carl

19

(mam nadzieję, że ktoś na FB będzie czytać tego)

Oprócz (poprawnie) porady udzielonej przez Gokhan Caglar, również pamiętać, to: Nie wpisuj numeru aplikacji bezpośrednio w AndroidManifest.xml! Aby FB działał, identyfikator aplikacji musi być również poprawnie zdefiniowany zgodnie z najlepszą praktyką w łańcuchach plików.xml

Ponieważ identyfikator aplikacji jest również używany pod znacznikiem dostawcy, ale bezpośrednio jako numer, zrobiłem skrót do zapisywania numeru aplikacji bezpośrednio w tagu meta-danych. Ogromny błąd, 2 dni minęły.

Wygląda na to, że FB użyje nazwy aplikacji pobranej z pliku AndroidManifest.xml i bezpośrednio na podstawie definicji w pliku strings.xml. Oba muszą tam być. identyfikator aplikacji musi być zdefiniowany w pliku strings.xml. To rozwiązało problem.

Dla zespołu rozwoju FB, kilka sugestii, które pozwolą zaoszczędzić czas ludzi:

  • Albo usunąć ten przesadnie rygorystyczne stosowanie app-id, lub wyjaśnić w samouczku, że jest to jedyny sposób. (Jest bardziej rygorystyczny niż sam system Android)

  • Ulepsz system raportowania błędów jako nakładkę, gdy definicje aplikacji są nieprawidłowe. Null wyjątek jak ten głęboko w FB wkrótce staje się twoim złodziejem czasu. W takim przypadku raport o błędzie typu: "Błąd: identyfikator aplikacji nie został zdefiniowany w łańcuchach.xml" byłby zadowalający.

  • chodzi o tutorial, zawiera również pułapkę, a więc wspominam go: Jeśli uruchomić samouczek tutaj: https://developers.facebook.com/quickstarts/?platform=android, po tym jak już włożona klawisz krzyżyka na rozwój, co byłoby łatwo zrobić, jeśli rzeczy nie są działając, należy pamiętać, że ten samouczek usunie (lub raczej zastąpi) istotne informacje w definicji aplikacji bez informowania o tym. Ponieważ prawdopodobnie już zdefiniowałeś keyhash, nie wypełniasz go ponownie w tym przewodniku szybkiego startu. Dlatego później odkrywasz, że keyhash zniknęło i zastanawiasz się dlaczego.

+1

Spędziłem większość z dzisiejszych prób implementacji pakietu SDK Facebooka, niezliczonych błędów. (Nawet uderzyłem w limit metody 64k w Androidzie). Mam nadzieję, że przerobią to (lub dostaną lepszych programistów), ponieważ w tej chwili facebook sdk jest totalnym crap-ware. –

+0

Nie zauważyłbym tego przez milion lat. Dzięki! Wtf Facebook? – LemonGentry

+0

Mam problemy (kliknięto opcję Udostępnij i nic się nie stało) i okazało się, że w ustawieniach aplikacji brakowało skrótu klawiaturowego! Aby to naprawić, przejdź na stronę dewelopera Facebooka> Moje aplikacje> Wybierz aplikację> Ustawienia i sprawdź, czy Key Hash nadal tam jest. To nie rozwiązało problemu, ale przynajmniej teraz wiem, że Key Hash nie zniknęło. –

1

nie pisać klawisz facebook wewnątrz meta

napisz to w ciąg i odwoływać w meta w jawnym

jak tak

<string name="id_facebook">id_facebook</string> 

<meta-data 
     android:name="com.facebook.sdk.ApplicationId" 
     android:value="@string/id_facebook" /> 

nadzieję, że to pomoże:)

Powiązane problemy