Autore Topic: Facebook SDK for Android  (Letto 1219 volte)

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Facebook SDK for Android
« il: 06 Settembre 2013, 10:15:21 CEST »
0
Salve avrei bisogno cortesemente di un vostro suggerimento, in pratica sto realizzando un applicazione che si interfaccia con Facebook per condividere uno stato sulla propria bacheca.

Ho seguito la guida in inglese https://developers.facebook.com/docs/android/ in particolare il Getting Started, il Login ed il Publish to Feed.

Il mio problema sorge proprio sul Login, al click sul bottone di Login mi si apre la schermata per l'accesso a Facebook, dopo l'accesso la schermata ritorna alla mia activity map poi qualcosa va storto :
Codice (Java): [Seleziona]
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}
Dal logcat noto che il TAG è Logged out mentre dovrebbe essere Logged in!

Vi posto il mio codice :

Codice (Java): [Seleziona]
public class MainActivity extends FragmentActivity{
        private MainFragment mainFragment;
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            if (savedInstanceState == null) {
                // Add the fragment on initial activity setup
                mainFragment = new MainFragment();
                getSupportFragmentManager()
                .beginTransaction()
                .add(android.R.id.content, mainFragment)
                .commit();
            } else {
                // Or set the fragment from restored state info
                mainFragment = (MainFragment) getSupportFragmentManager()
                .findFragmentById(android.R.id.content);
            }
        }
Codice (Java): [Seleziona]
public class MainFragment extends Fragment{
       
        private static final String TAG = "MainFragment";
        private UiLifecycleHelper uiHelper;
        private Button shareButton;
        private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
        private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";//
        private boolean pendingPublishReauthorization = false;
       
        @Override
        public View onCreateView(LayoutInflater inflater,
                ViewGroup container,
                Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.activity_main, container, false);
           
            LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
            authButton.setFragment(this);
            authButton.setReadPermissions(Arrays.asList("user_likes", "user_status"));
           
            shareButton = (Button) view.findViewById(R.id.shareButton);
           
            if (savedInstanceState != null) {
                pendingPublishReauthorization =
                    savedInstanceState.getBoolean(PENDING_PUBLISH_KEY, false);
            }
           
            shareButton = (Button) view.findViewById(R.id.shareButton);
            shareButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    publishStory();        
                }
            });

            return view;
        }
       
        private void onSessionStateChange(Session session, SessionState state, Exception exception) {
            if (state.isOpened()) {
                Log.i(TAG, "Logged in...");
                shareButton.setVisibility(View.VISIBLE);
                if (pendingPublishReauthorization &&
                        state.equals(SessionState.OPENED_TOKEN_UPDATED)) {
                    pendingPublishReauthorization = false;
                    publishStory();
                }
            } else if (state.isClosed()) {
                Log.i(TAG, "Logged out...");
                //shareButton.setVisibility(View.INVISIBLE);
            }
        }
       
        private Session.StatusCallback callback = new Session.StatusCallback() {
            @Override
            public void call(Session session, SessionState state, Exception exception) {
                onSessionStateChange(session, state, exception);
            }
        };
       
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
         
            uiHelper = new UiLifecycleHelper(getActivity(), callback);
            uiHelper.onCreate(savedInstanceState);
        }
       
        @Override
        public void onResume() {
            super.onResume();
            // For scenarios where the main activity is launched and user
            // session is not null, the session state change notification
            // may not be triggered. Trigger it if it's open/closed.
            Session session = Session.getActiveSession();
            if (session != null &&
                   (session.isOpened() || session.isClosed()) ) {
                onSessionStateChange(session, session.getState(), null);
            }

         
            uiHelper.onResume();
        }

        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
           
            uiHelper.onActivityResult(requestCode, resultCode, data);
        }

        @Override
        public void onPause() {
            super.onPause();
            uiHelper.onPause();
        }

        @Override
        public void onDestroy() {
            super.onDestroy();
            uiHelper.onDestroy();
        }

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //outState.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization);
            uiHelper.onSaveInstanceState(outState);
        }
       
        private void publishStory() {
            Session session = Session.getActiveSession();

            if (session != null){

                // Check for publish permissions    
                List<String> permissions = session.getPermissions();
                if (!isSubsetOf(PERMISSIONS, permissions)) {
                    pendingPublishReauthorization = true;
                    Session.NewPermissionsRequest newPermissionsRequest = new Session
                            .NewPermissionsRequest(this, PERMISSIONS);
                session.requestNewPublishPermissions(newPermissionsRequest);
                    return;
                }

                Bundle postParams = new Bundle();
                postParams.putString("name", "Facebook SDK for Android");
                postParams.putString("caption", "Build great social apps and get more installs.");
                postParams.putString("description", "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps.");
                postParams.putString("link", "https://developers.facebook.com/android");
                postParams.putString("picture", "https://raw.github.com/fbsamples/ios-3.x-howtos/master/Images/iossdk_logo.png");

                Request.Callback callback= new Request.Callback() {
                    public void onCompleted(Response response) {
                        JSONObject graphResponse = response
                                                   .getGraphObject()
                                                   .getInnerJSONObject();
                        String postId = null;
                        try {
                            postId = graphResponse.getString("id");
                        } catch (JSONException e) {
                            Log.i(TAG,
                                "JSON error "+ e.getMessage());
                        }
                        FacebookRequestError error = response.getError();
                        if (error != null) {
                            Toast.makeText(getActivity()
                                 .getApplicationContext(),
                                 error.getErrorMessage(),
                                 Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(getActivity()
                                     .getApplicationContext(),
                                     postId,
                                     Toast.LENGTH_LONG).show();
                        }
                    }
                };

                Request request = new Request(session, "me/feed", postParams,
                                      HttpMethod.POST, callback);

                RequestAsyncTask task = new RequestAsyncTask(request);
                task.execute();
            }
           
         

        }// end publish story
       
         private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
                for (String string : subset) {
                    if (!superset.contains(string)) {
                        return false;
                    }
                }
                return true;
            }

}
Codice (XML): [Seleziona]
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context=".MainActivity" >

<com.facebook.widget.LoginButton
       android:id="@+id/authButton"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_gravity="center_horizontal"
       android:layout_marginTop="30dp"
       />
     <Button
   android:id="@+id/shareButton"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:textStyle="bold"
   android:gravity="center"
   android:layout_marginTop="80dp"
   android:visibility="invisible"
   android:text="@string/share"
   />
</RelativeLayout>

Il programma viene compilato ed eseguito correttamente ma il login è affetto da qualche errore che non riesco a capire.

Premetto che ho registrato su Facebook la mia applicazione correttamente inserendo la mia key hash su fb è l'id fornitomi nel mio manifest.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Facebook SDK for Android
« Risposta #1 il: 06 Settembre 2013, 10:25:49 CEST »
0
Quali altre informazioni escono nel LogCat?
Lo hai messo il permesso per l'accesso ad internet nel manifest?
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:Facebook SDK for Android
« Risposta #2 il: 06 Settembre 2013, 13:16:42 CEST »
0
Si il permesso per internet nel manifest l'ho inserito... adex allego il logcat

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Facebook SDK for Android
« Risposta #3 il: 06 Settembre 2013, 13:54:29 CEST »
0
Non so dove possa essere l'errore, ma la causa è questa e sembra molto specifica (ti dice qualcosa?)

Codice: [Seleziona]
Key com.facebook.platform.protocol.PROTOCOL_VERSION expected String but value was a java.lang.Integer.  The default value <null> was returned.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:Facebook SDK for Android
« Risposta #4 il: 06 Settembre 2013, 14:38:23 CEST »
0
Non saprei... anche perchè il codice fa fede con l'integrazione dell SDK di facebook... quindi mi aspetto che il codice dell'SDK si esente da errori...

Offline Sakazaki

  • Utente normale
  • ***
  • Post: 396
  • Respect: +74
    • Mostra profilo
  • Dispositivo Android:
    Sony xperia Z
  • Play Store ID:
    Saka Labs
  • Sistema operativo:
    Windows 8
Re:Facebook SDK for Android
« Risposta #5 il: 06 Settembre 2013, 14:53:38 CEST »
0
La cosa che trovo curiosa è questa:
Codice (Java): [Seleziona]
09-06 13:15:14.558: W/Bundle(10658): java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
09-06 13:15:14.558: W/Bundle(10658):    at android.os.Bundle.getString(Bundle.java:1061)
09-06 13:15:14.558: W/Bundle(10658):    at android.content.Intent.getStringExtra(Intent.java:4406)
09-06 13:15:14.558: W/Bundle(10658):    at com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821)

Che versione del facebook SDK stai usando? Perché in quella che uso io (scaricata ai primi di agosto) a riga 821 di AuthorizationClient non ho codice applicativo...

Offline DjWilliams

  • Nuovo arrivato
  • *
  • Post: 14
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    tablet
  • Sistema operativo:
    windows vista
Re:Facebook SDK for Android
« Risposta #6 il: 06 Settembre 2013, 15:16:38 CEST »
0
la 3.5 disponobile al link https://developers.facebook.com/docs/android/
che disperazione :(

Post unito: 06 Settembre 2013, 15:43:27 CEST
Nella sezione Applicazioni di Facebook Developer il class name deve essere <package>.MainActivity oppure <package>.MainFragment ?

E nel Namespace deve andarci obbligatoriamente qualcosa?

Post unito: 06 Settembre 2013, 17:05:42 CEST
Avete qualche alternativa per la stessa funzionalità ?
« Ultima modifica: 06 Settembre 2013, 17:05:42 CEST da DjWilliams, Reason: Merged DoublePost »