2015-05-22 19 views
10

Sono in grado di ottenere tutte quelle cose come mostrato nel mio codice qui sotto, ma non in grado di recuperare e-mail dal profilo utente.Facebook onCompleted Email java.lang.NullPointerException

Cosa posso fare per questo?

Qualsiasi tipo di aiuto sarà apprezzato.

All'inizio usavo questa fonte per ottenere i dettagli di Facebook dell'utente ed è stato il recupero dei dati (compresa la posta elettronica) senza alcuna difficoltà:

public class MainActivity extends Activity { 
    private Session.StatusCallback sessionStatusCallback; 
    private Session currentSession; 

    private Button login; 
    private Button logout; 
    private Button publishButton; 

    private TextView textView; 

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

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

     // create instace for sessionStatusCallback 
     sessionStatusCallback = new Session.StatusCallback() { 

      @Override 
      public void call(Session session, SessionState state, 
          Exception exception) { 
       onSessionStateChange(session, state, exception); 

      } 
     }; 

     login = (Button) findViewById(R.id.loginButton); 
     login.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       connectToFB();     
      } 
     }); 

     logout = (Button) findViewById(R.id.logoutButton); 
     logout.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (currentSession != null) { 
        currentSession.closeAndClearTokenInformation(); 
        ... 
       } 
      } 
     }); 

     // publish button 
     publishButton = (Button) findViewById(R.id.publishButton); 
     publishButton.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       publishStory(); 

      } 
     }); 

    } 

    public void connectToFB() { 

     List<String> permissions = new ArrayList<String>(); 
     permissions.add("publish_actions"); 

     currentSession = new Session.Builder(this).build(); 
     currentSession.addCallback(sessionStatusCallback); 

     Session.OpenRequest openRequest = new Session.OpenRequest(
       MainActivity.this); 
     openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
     openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE); 
     openRequest.setPermissions(permissions); 
     currentSession.openForPublish(openRequest); 

    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (currentSession != null) { 
      currentSession 
        .onActivityResult(this, requestCode, resultCode, data); 
     } 
    } 

    private void onSessionStateChange(Session session, SessionState state, 
             Exception exception) { 
     if (session != currentSession) { 
      return; 
     } 

     if (state.isOpened()) { 
      // Log in just happened. 
      Toast.makeText(getApplicationContext(), "session opened", 
        Toast.LENGTH_SHORT).show(); 

      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 
       @Override 
       public void onCompleted(GraphUser user, Response response) { 
        String fbId = user.getId(); 
        String fbName = user.getName(); 
        String gender = user.asMap().get("gender").toString(); 
        String email = user.asMap().get("email").toString(); 
        String first = user.asMap().get("first_name").toString(); 
        String last = user.asMap().get("last_name").toString(); 

        textView.setText("Id: " + fbId + ", Name: " + fbName + ", Gender: " + gender + ", EmailID: " + email + ", First: " + first + ", Last: " + last); 
       } 
      }); 

     } else if (state.isClosed()) { 
      // Log out just happened. Update the UI. 
      Toast.makeText(getApplicationContext(), "session closed", 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void publishStory() { 
     .... 
    } 

} 

E ora sto usando lo stesso codice in uno dei miei progetti, ma sempre ottenendo:

E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.NullPointerException 
at c.o.m.MainActivity$5.onCompleted(MainActivity.java:262) 
at com.facebook.Request$1.onCompleted(Request.java:303) 
at com.facebook.Request$4.run(Request.java:1726) 
at android.os.Handler.handleCallback(Handler.java:615) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4921) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 

In questa linea, io sono sempre NPE:

String email = user.asMap().get("email").toString(); 

Codice:

public class MainActivity extends Activity { 

    Button btnFBLogin, btnGPLogin; 

    private Session.StatusCallback sessionStatusCallback; 
    private Session currentSession; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.screen_layout); 

     sessionStatusCallback = new Session.StatusCallback() { 

      @Override 
      public void call(Session session, SessionState state, 
          Exception exception) { 
       onSessionStateChange(session, state, exception); 

      } 
     }; 

     btnFBLogin = (Button) findViewById(R.id.loginFB); 
     btnFBLogin.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       connectToFB(); 
      } 
     }); 

    } 

    public void connectToFB() { 

     List<String> permissions = new ArrayList<String>(); 
     permissions.add("publish_actions"); 

     currentSession = new Session.Builder(this).build(); 
     currentSession.addCallback(sessionStatusCallback); 

     Session.OpenRequest openRequest = new Session.OpenRequest(
       MainActivity.this); 
     openRequest.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
     openRequest.setRequestCode(Session.DEFAULT_AUTHORIZE_ACTIVITY_CODE); 
     openRequest.setPermissions(permissions); 
     currentSession.openForPublish(openRequest); 

    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     if (currentSession != null) { 
      currentSession 
        .onActivityResult(this, requestCode, resultCode, data); 
     } 
    } 

    private void onSessionStateChange(Session session, SessionState state, 
             Exception exception) { 
     if (session != currentSession) { 
      return; 
     } 

     if (state.isOpened()) { 
      // Log in just happened. 
      Toast.makeText(getApplicationContext(), "session opened", 
        Toast.LENGTH_SHORT).show(); 

      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 
       @Override 
       public void onCompleted(GraphUser user, Response response) { 
        String fbId = user.getId(); 
        String fbName = user.getName(); 
        String gender = user.asMap().get("gender").toString(); 
        String email = user.asMap().get("email").toString(); 
        String first = user.asMap().get("first_name").toString(); 
        String last = user.asMap().get("last_name").toString(); 

        Toast.makeText(MainActivity.this, "EmailId:- "+email, Toast.LENGTH_LONG).show(); 
       } 
      }); 

     } else if (state.isClosed()) { 
      // Log out just happened. Update the UI. 
      Toast.makeText(getApplicationContext(), "session closed", 
        Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

Quale potrebbe essere il motivo? Perché sta accadendo?

+0

quanto male .. cosa c'è che non va qui? – Sun

+0

Log.i ("fb", "utente fb:" + user.toString()); perché stai facendo questo ? la tua sessione esiste? –

+1

@Sun: probabilmente chiamando 'toString()' su 'null', quindi prova a usare' String email = user.asMap(). Get ("email") ' –

risposta

0

A volte potrebbe accadere che l'Utente non abbia impostato il proprio ID e-mail nel proprio profilo che si ottiene nel Login di Facebook tramite Android in modo da generare un errore come Eccezione puntatore nullo.

così si dovrebbe avere di controllare prima di utilizzare la variabile email dopo il recupero da accesso che è null o non Come ad esempio:

String email =""; 
if(user.asMap().get("email") != null){ 
email = user.asMap().get("email").toString(); 
} 
+0

come ho scritto nel mio esempio precedente stavo ricevendo anche l'e-mail, e sto usando lo stesso account per accedere a – Sun

+0

Ya Sure ma come ho verificato il tuo codice sopra e ti sei perso per controllare che Se id di posta esiste o no. Quindi, ora usando questo codice non hai alcun problema relativo all'eccezione del puntatore nullo nella tua domanda precedente: String email = user.asMap(). Get ("email"). ToString(); –

0

È necessario aggiungere "e-mail" per l'elenco dei permessi di sei richiedendo, altrimenti l'email sarà sempre nullo. Non so quale versione del sdk stai usando. Con l'ultimo si può scrivere:

Collection<String> mPermissions = new ArrayList<>(); 
mPermissions.add("email"); 
LoginManager mLoginManager = LoginManager.getInstance(); 
CallbackManager mCallbackManager = CallbackManager.Factory.create(); 
FbCallback fbCallback = new FbCallback(this); 
mLoginManager.registerCallback(mCallbackManager, fbCallback); 
[...] 
mLoginManager.logInWithReadPermissions(this, mPermissions); 

A proposito ... ricordate che l'utente può revocare il permesso o non può concedere durante il login.

Problemi correlati