2013-07-29 5 views
3

при попытке получить доступ данных пользователя, я получаю эту ошибку:org.json.JSONException: Нет значения для электронной почты

07-29 14:49:47.343: W/System.err(2745): org.json.JSONException: No value for email 
07-29 14:49:47.353: W/System.err(2745):  at org.json.JSONObject.get(JSONObject.java:354) 
07-29 14:49:47.374: W/System.err(2745):  at org.json.JSONObject.getString(JSONObject.java:510) 
07-29 14:49:47.374: W/System.err(2745):  at com.example.healthcity.common.FacebookContainer$3$1.onCompleted(FacebookContainer.java:237) 
07-29 14:49:47.409: W/System.err(2745):  at com.facebook.Request$1.onCompleted(Request.java:264) 
07-29 14:49:47.413: W/System.err(2745):  at com.facebook.Request$4.run(Request.java:1240) 
07-29 14:49:47.423: W/System.err(2745):  at android.os.Handler.handleCallback(Handler.java:725) 
07-29 14:49:47.423: W/System.err(2745):  at android.os.Handler.dispatchMessage(Handler.java:92) 
07-29 14:49:47.433: W/System.err(2745):  at android.os.Looper.loop(Looper.java:137) 
07-29 14:49:47.444: W/System.err(2745):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
07-29 14:49:47.444: W/System.err(2745):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-29 14:49:47.463: W/System.err(2745):  at java.lang.reflect.Method.invoke(Method.java:511) 
07-29 14:49:47.463: W/System.err(2745):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
07-29 14:49:47.485: W/System.err(2745):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
07-29 14:49:47.493: W/System.err(2745):  at dalvik.system.NativeStart.main(Native Method) 

Я не в состоянии захватить точку останова на методе обратного вызова. PLZ помощь, если вы прошли через эту ошибку.

ниже мой код для получения сведений о пользователе:

private void onSessionStateChange(Session session, SessionState state, Exception exception) { 
    //RFR//_("onSessionStateChange----------------"); 
    /////////////// super.onSessionStateChange(state, exception); 
    if (state.isOpened()) { 
     readUserInfo(session); 
    } else if (state.isClosed()) { 
     // Session closed 
    } 
} 

private Request.GraphUserCallback graphCallback = new Request.GraphUserCallback() { 

     // callback after Graph API response with user object 
     @Override 
     public void onCompleted(GraphUser user, Response response) { 
      String name = user.getName(); 
      String gender = (String) user.getProperty("gender"); 
      String email = (String) user.getProperty("email"); 
      String birthday = user.getBirthday(); 
      Log.d("FB----->","name: "+ name +" gender: "+ gender +" email: "+ email +" birthday: " +birthday); 

     } 

}; 

    public void readUserInfo(Session session){ 
     // make request to the /me API 
     Request.executeMeRequestAsync(session, graphCallback); 
    } 

И ниже разрешение, что я установил:

openRequest.setPermissions(Arrays.asList("user_birthday", "email", "user_location")); 

Вот ответ я получаю от графа апи, когда проверено у браузера:

{ 
    "id": "1000000XXXXX930", 
    "name": "First Last", 
    "first_name": "First", 
    "last_name": "Last", 
    "link": "http://www.facebook.com/<myusername>", 
    "username": "<myusername>", 
    "gender": "male", 
    "locale": "en_US" 
} 
+0

У меня есть asimilar проблемы с этим одним использованием FacebookSDK 4,0 , Вы уже решили это? – stackex

ответ

0

Вы даете разрешение «электронной почты», чтобы запросить приложение Facebook для доступа к любому пользователю Email ID?

Если вы хотите получить доступ к идентификатору электронной почты пользователя Facebook с помощью api, то вам необходимо предоставить разрешение электронной почты. Общая информация о профиле пользователя не даст вам адрес электронной почты пользователя Facebook.

Email Permissions in Facebook API

ПРИМЕЧАНИЕ: Некоторые пользователь также положить безопасность не разделяют адрес электронной почты какой-либо другой, то и это может быть так, что вы не получите адрес электронной почты.

Надеюсь, это поможет вам.

+0

Да, я тестирую свою учетную запись и проверяю разрешение на fb, они установлены правильно. однако я не сделал эти данные публичными. может быть, это проблема? – Ankit

+0

проверить ответ сначала, зарегистрировав его и проверить, содержит ли оно любое поле электронной почты? –

+0

Я уже печатаю детали для регистрации, см. OnCompleted в коде. однако я не получаю его на logcat. – Ankit

0

Вам нужно разрешение, чтобы захватить чей-то адрес электронной почты, хотя у некоторых людей есть своя конфиденциальность, чтобы вы могли получать свои электронные письма без этого выраженного разрешения, а большинство нет.

+0

Я установил разрешения. см. нижнюю часть вопроса. – Ankit

0

Этот кусок кода работает хорошо со мной в получении необходимых разрешений это также поможет вам в получении разрешения E-mail

private void FaceBookSignIn() 
    { 
    facebookBtn.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View arg0) { 
     Session currentSession = Session.getActiveSession(); 
     if (currentSession == null || currentSession.getState().isClosed()) { 
      Session session = new Session.Builder(context).build(); 
      Session.setActiveSession(session); 
      currentSession = session; 
     } 

     if (currentSession.isOpened()) { 
       Session.openActiveSession(SignIn_Rewards.this, false, new Session.StatusCallback() { 

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

          if (session.isOpened()) { 

           Request.executeMeRequestAsync(session, 
             new Request.GraphUserCallback() { 

              @Override 
              public void onCompleted(GraphUser user, 
                Response response) { 
               if (user != null) { 

                fromFB=true; 

               UserID=user.getId(); 
               firstName=user.getFirstName(); 
               Lastname=user.getLastName(); 
               Gender=user.getProperty("gender").toString(); 
               Email=user.getProperty("email").toString(); 
               DateofBirth=user.getBirthday(); 
               try { 
                getToken(); 
               } catch (NoSuchAlgorithmException e) { 
                // TODO Auto-generated catch block 
                e.printStackTrace(); 
               } 

               } 
              } 
             }); 
          } 
         } 
        }); 
       } 
      // Do whatever u want. User has logged in 

     else if (!currentSession.isOpened()) { 
      // Ask for username and password 
      OpenRequest op = new Session.OpenRequest((Activity) context); 

      op.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO); 
      op.setCallback(null); 

      List<String> permissions = new ArrayList<String>(); 
      permissions.add("publish_stream"); 
      permissions.add("user_likes"); 
      permissions.add("email"); 
      permissions.add("user_birthday"); 
      op.setPermissions(permissions); 

      Session session = new Session.Builder(SignIn_Rewards.this).build(); 
      Session.setActiveSession(session); 
      session.openForPublish(op); 
     } 




    } 
    }) ; 

     } 

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

     Session currentSession = Session.getActiveSession(); 
     if (currentSession == null || currentSession.getState().isClosed()) { 
      Session session = new Session.Builder(context).build(); 
      Session.setActiveSession(session); 
      currentSession = session; 
     } 

     if (currentSession.isOpened()) { 
      Session.openActiveSession(this, true, new Session.StatusCallback() { 

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

        if (session.isOpened()) { 

         Request.executeMeRequestAsync(session, 
           new Request.GraphUserCallback() { 

            @Override 
            public void onCompleted(GraphUser user, 
              Response response) { 
             if (user != null) { 

              fromFB=true; 

             UserID=user.getId(); 
             firstName=user.getFirstName(); 
             Lastname=user.getLastName(); 
             Gender=user.getProperty("gender").toString(); 
             Email=user.getProperty("email").toString(); 
             DateofBirth=user.getBirthday(); 
             try { 
              getToken(); 
             } catch (NoSuchAlgorithmException e) { 
              // TODO Auto-generated catch block 
              e.printStackTrace(); 
             } 

             } 
            } 
           }); 
        } 
       } 
      }); 
     } 
    } 
+0

Это сработало с тобой или нет? –

0

У вас есть проверить, как это:

private Request.GraphUserCallback graphCallback = new Request.GraphUserCallback() { 

    // callback after Graph API response with user object 
    @Override 
    public void onCompleted(GraphUser user, Response response) { 
     String name = user.getName(); 
     String gender = (String) user.getProperty("gender"); 
     String email = (String) user.getProperty("email"); 
     String birthday = user.getBirthday(); 

    if(email!=null){ 
    //perform your task here. 
    }else{ 
    Log.v("email","is empty"); 
    } 

     Log.d("FB----->","name: "+ name +" gender: "+ gender +" email: "+ email +" birthday: " +birthday); 

    }}; 
+0

, но это не проблема, я получаю jsonexception, а не NPE. – Ankit

0

Попробуйте это получить значение для электронной почты Отредактировано: По умолчанию вы не получите электронное письмо, поскольку по электронной почте вы должны указать разрешение.

Session.StatusCallback statusCallback = new Session.StatusCallback() 
     { 

      @Override 
      public void call(Session session, SessionState state, Exception exception) 
      { 
       if(session.isOpened()) 
       { 
        Request.executeMeRequestAsync(session, new Request.GraphUserCallback() 
        { 

         @Override 
         public void onCompleted(GraphUser user, Response response) 
         { 

          if(user != null) 
          { 
           try 
           { 
            System.out.println("Graph Inner Json"+user.getInnerJSONObject()); 
            String email = user.getInnerJSONObject().getString("email"); 
           } 
          } 
         } 
        } 
       } 
      } 

YourActivityName.openActiveSession(this, true, statusCallback); 

Это наш openActiveSession(), где мы указываем разрешения

private static Session openActiveSession(Activity activity, boolean allowLoginUI, Session.StatusCallback statusCallback) 
    { 
     OpenRequest openRequest = new OpenRequest(activity); 
     openRequest.setPermissions(Arrays.asList("user_birthday", "email")); 
     openRequest.setCallback(statusCallback); 

     Session session = new Session.Builder(activity).build(); 

     if(SessionState.CREATED_TOKEN_LOADED.equals(session.getState()) || allowLoginUI) 
     { 
      Session.setActiveSession(session); 
      session.openForRead(openRequest); 

      return session; 
     } 

     return null; 
    } 

И в конце концов вы должны сделать в onActivityResult метод, как:

if(Session.getActiveSession() != null) 
     { 
      Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
     } 
Смежные вопросы