2015-05-22 17 views
10

Jestem w stanie uzyskać wszystkie te rzeczy, jak pokazano w moim kodzie poniżej, ale nie można pobrać wiadomości e-mail z profilu użytkownika.Facebook onCompleted Email java.lang.NullPointerException

Co mogę zrobić w tym celu?

Każdy rodzaj pomocy zostanie doceniony.

Wcześniej używałem tego źródła, aby uzyskać szczegółowe informacje na Facebooku użytkownikiem i został pobierania danych (w tym e-mail) bez żadnych problemów:

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() { 
     .... 
    } 

} 

a teraz jestem przy użyciu tego samego kodu w jednym z mojego projektu, ale zawsze uzyskiwanie:

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) 

Na tej linii, jestem coraz NPE:

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

Kod:

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

Co może być przyczyną? Dlaczego to się dzieje?

+0

jak źle .. co jest nie tak? – Sun

+0

Log.i ("fb", "fb user:" + user.toString()); dlaczego to robisz ? czy sesja istnieje? –

+1

@Sun: prawdopodobnie wywołanie 'toString()' na 'null', więc spróbuj użyć' String email = user.asMap(). Get ("email") ' –

Odpowiedz

0

Po pewnym czasie może się zdarzyć, że Użytkownik nie ustawi swojego identyfikatora e-mail w swoim profilu, który otrzymujesz na Facebooku Zaloguj się za pomocą Androida, aby powodować błędy, takie jak wyjątek zerowego wskaźnika.

należy więc trzeba sprawdzić przed użyciem zmiennej email po pobraniu od Login że jest null lub nie Takich jak:

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

jak napisałem we wcześniejszym przykładzie, że otrzymywałem również wiadomość e-mail, a ja używam tego samego konta do logowania – Sun

+0

Tak, ale jak sprawdziłem powyższy kod i straciłeś możliwość sprawdzenia, czy identyfikator poczty istnieje, czy nie. Więc teraz przy użyciu tego kodu nie masz żadnego problemu związanego z wyjątkiem wskaźnika pustego w powyższym sugerowanym wierszu zapytania: String email = user.asMap(). Get ("email"). ToString(); –

0

Trzeba dodać „e-mail” na liście uprawnień przebywa wymagające, w przeciwnym razie wiadomość e-mail zawsze będzie miała wartość zerową. Nie wiem, której wersji sdk używasz. Z ostatniego można napisać:

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

... Przy okazji pamiętać, że użytkownik może cofnąć pozwolenie lub nie może udzielić go podczas logowania.