2013-04-23 35 views
13

Próbuję zaimplementować prostą czynność w mojej aplikacji Android, w której użytkownik jest proszony o zalogowanie się za pośrednictwem Facebooka, aby odzyskać "polubienia" użytkownika . Więc oczywiście najpierw testuję proste logowanie przez facebook. Używam dokładnego kodu, który mają na "Pierwsze kroki z Facebook SDK dla Androida" - krok 6 (https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/), ale z jakiegoś powodu to nie działa. Kiedy debugowanie kodu zdałem sobie sprawę, że następujący warunek:if (session.isOpen()), facebook login na Androida zawsze zwraca false

if(session.isOpen()) 

jest ZAWSZE powrocie fałszywy, chociaż ja już być zalogowany na Facebooku. Próbowałem wszystkiego, aby to naprawić, ale nic nie działa.

Ktoś miał ten problem lub wie, jak to naprawić?

EDYCJA: Próbuję tego testu na moim telefonie bezpośrednio na emulatorze. Nie wiem, czy to może być problem.

Z góry dziękuję!

I wypróbowałem to rozwiązanie session.isOpened() returns false even if successfully logged in to Facebook, ale używanie java 6 lub 7 nadal dawało ten sam klucz hash.

EDIT 2: Próbowałem również tego samego, ale z nieco innym podejściem. http://sonyarouje.com/2011/09/18/facebook-hash-key-for-android-apps/ Nadal mam ten sam problem. Metoda session.isOpen() zawsze zwraca wartość false.

EDYCJA 3: Oto najnowszy kod, który próbowałem. Nie sądzę, że są jakieś błędy w logcat. W każdym razie połączę to tutaj, na wypadek, gdy czegoś mi brakuje.

package com.example.danandroidapp; 
import java.util.Arrays; 

import com.facebook.FacebookException; 
import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.model.GraphUser; 
import com.facebook.widget.LoginButton; 
import com.facebook.widget.LoginButton.OnErrorListener; 

import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    private String TAG = "MainActivity"; 
    private TextView lblEmail; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     lblEmail = (TextView) findViewById(R.id.lblEmail); 

     LoginButton authButton = (LoginButton) findViewById(R.id.authButton); 

     authButton.setOnErrorListener(new OnErrorListener() { 
      @Override 
      public void onError(FacebookException error) { 
       Log.i(TAG, "Error " + error.getMessage()); 
      } 
     }); 

     authButton.setReadPermissions(Arrays.asList("basic_info", "email")); 
     authButton.setSessionStatusCallback(new Session.StatusCallback() { 

     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      if(session.isOpened()) { 
       Log.i(TAG, "Access Token " + session.getAccessToken()); 
       Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

        @Override 
        public void onCompleted(GraphUser user, Response response) { 
         if(user != null) { 
          Log.i(TAG, "User ID " + user.getId()); 
          Log.i(TAG, "Email " + user.asMap().get("email")); 
          lblEmail.setText(user.asMap().get("email").toString()); 
         } 
        } 
       }); 
      } 
     } 
    }); 
} 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

I moje wyjście logcat: https://www.dropbox.com/s/7qg9zbhlpikfovf/log.txt

+0

Rozumiem, że jesteś po prostu z samouczka, ale proszę pisać kod dokładnie tak, jak trzeba, i wszelkie błędy w kodzie logującym. –

+0

Dzięki za odpowiedź, zaktualizowałem swoje pytanie za pomocą kodu i wyjścia logcat. –

Odpowiedz

9

Miałem podobny problem, ponieważ hashkey był zły na facebooku, postępując zgodnie z poniższym kodem, można uzyskać klucz hash, który został wysłany na Facebook. Po prostu skopiuj ten skrót i zastąp go. Zacznie działać.

try { 
     PackageInfo info = getPackageManager().getPackageInfo(
       "your.root.package", 
       PackageManager.GET_SIGNATURES); 
     for (Signature signature : info.signatures) { 
      MessageDigest md = MessageDigest.getInstance("SHA"); 
      md.update(signature.toByteArray()); 
      Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); 
      } 
    } catch (NameNotFoundException e) { 

    } catch (NoSuchAlgorithmException e) { 

    } 
+0

Mimo że już to rozwiązałem, dziękuję za odpowiedź. Właśnie tego musiałem użyć. :) http://stackoverflow.com/questions/14486377/android-facebook-api-exception-remote-app-id-does-not-match-stored-id –

+0

@DanielGrima Czy możesz powiedzieć, w jaki sposób rozwiązałeś problem? – aagam94

+0

@ POSEID0n wystarczy spojrzeć na odpowiedź w linku zamieszczonym powyżej (http://stackoverflow.com/questions/14486377/android-facebook-api-exception-remote-app-id-does-not-match-stored -id) :) po uruchomieniu tego kodu wypisze on klucz hash w logcat, a następnie upewnij się, że skopiowałeś i wkleiłeś ten hash w ustawieniach aplikacji na facebooku :) mam nadzieję, że to pomoże –

6

Brakuje nadpisanie onActivityResult (ostatni kawałek fragmentu kodu w Getting Started Guide).

Funkcja onActivityResult informuje o tym, w jaki sposób informacje z aplikacji FB (lub z przeglądarki internetowej) są pobierane z powrotem do aplikacji i muszą zostać zastąpione, aby ponownie nawiązać połączenie z sesją.

+0

Dam ci spróbować, wcześniej próbowałem. –

+0

Po raz kolejny spróbowałem bezużyteczności onActivityResult. Zaktualizowałem również dane wyjściowe logcat, na wszelki wypadek. –

+0

Czy możesz spróbować zarejestrować zarówno "stan", jak i "wyjątek" w metodzie callback()? Ponadto, czy możesz zapewnić, że twoja metoda onActivityResult jest wywoływana? –

0
private Session.StatusCallback statusCallback = new SessionStatusCallback(); 

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(final Session session, SessionState state, 
      Exception exception) { 

     try { 
      new_session = session; 
      if (state.equals(SessionState.OPENING)) { 

      } 

      if (state.equals(SessionState.OPENED)) { 


      } 

      if (state.equals(SessionState.CLOSED_LOGIN_FAILED)) { 
       try { 
        PackageInfo info = context.getPackageManager() 
          .getPackageInfo("your package name", 
            PackageManager.GET_SIGNATURES); 
        for (Signature signature : info.signatures) { 
         MessageDigest md = MessageDigest.getInstance("SHA"); 
         md.update(signature.toByteArray()); 
         Log.d("KeyHash:", Base64.encodeToString(
           md.digest(), Base64.DEFAULT)); 
        } 
        Session.openActiveSession((Activity) context, true, 
          statusCallback); 
       } catch (NameNotFoundException e) { 

       } catch (NoSuchAlgorithmException e) { 

       } 
      } 

      if (state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 



      } 

    } 
    catch(Exception e){} 
    } 
} 

//if session is closed 
Session.openActiveSession((Activity) context, true, 
        statusCallback); 
0

Trzeba dodać klawisz krzyżyka na Facebooku dewelopera to działa na mnie

Powiązane problemy