2016-05-20 3 views
0

Liebe Entwickler Ich versuche, Daten von Facebook zu speichern Ich bekomme andere alle Daten, aber kann nicht die E-Mail und Geschlecht.Facebook SDK E-Mail und Geschlecht ist Null in Android

Dies ist mein Code

loginButton.setReadPermissions("public_profile"); 
    loginButton.setReadPermissions("email"); 
    loginButton.setReadPermissions("user_friends"); 


    loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      AccessToken accessToken = loginResult.getAccessToken(); 
      GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { 
       @Override 
       public void onCompleted(JSONObject object,GraphResponse response) { 
        if (response != null) { 
         try { 
          email = object.getString("email"); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
         try { 
          gender = object.getString("gender"); 
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", "email,gender"); 
      request.setParameters(parameters); 
      request.executeAsync(); 


      Profile profile = Profile.getCurrentProfile(); 

      userid = profile.getId(); 
      userfirstname = profile.getFirstName(); 
      middlename = profile.getMiddleName(); 
      userlastname = profile.getLastName(); 
      userimage = profile.getProfilePictureUri(30, 40); 
      linkuri = profile.getLinkUri(); 
      name = profile.getName(); 




      new AsyncTask<String, String, String>() { 
       @Override 
       protected String doInBackground(String... params) { 
        WebService ws = new WebService(URL); 
        Map<String, String> data = new HashMap<String, String>(); 
        data.put("user_fb_id", userid); 
        data.put("first_name", userfirstname); 
        data.put("middle_name", userfirstname); 
        data.put("gender", gender); 
        data.put("email", email); 
        data.put("last_name", userfirstname); 
        data.put("user_fb_profile_name", name); 
        data.put("fb_profile_pic", userimage.toString()); 


        try { 
         String response = ws.makeHTTPRequest(data, "POST"); 
         JSONObject jsonObject = new JSONObject(response); 
         Log.e("Response", jsonObject.toString()); 

        } catch (Exception e) { 
         Log.d("", "Exception : " + e.getMessage()); 
        } 
        return null; 
       } 
      }.execute(); 

     } 

     @Override 
     public void onCancel() { 
      //info = ("Login attempt canceled."); 
     } 

     @Override 
     public void onError(FacebookException e) { 
      // info = ("Login attempt failed."); 
     } 
    }); 

jetzt lasse ich Sie wissen, was der Fehler in meinem obigen Code ist.

Wenn ich die GraphRequest ausführen wird es erfolgreich ausgeführt, aber nicht die E-Mail und Geschlecht. Die E-Mail und das Geschlecht ist gleich Null Nach der GrapRequest Methode ich bin AsyncTask laufen und senden Sie diese Daten in meinem Web-Services post Klasse geben Sie mir Fehler von null E-Mail und Geschlecht, aber wenn ich die E-Mail und Geschlecht nach der Ausführung von AsyncTask sie haben diese Daten bitte helfen Sie mir, wie Sie dieses Problem lösen.

was ich will Ich möchte die Benutzergrunddaten speichern, wenn es eine andere Möglichkeit gibt, lassen Sie mich auch wissen, dass ich es versuchen werde.

+0

In einigen Fällen, obwohl der Benutzer eine E-Mail angegeben hat, wird die Anfrage nicht beantwortet, wenn die E-Mail nicht gültig ist. – RAAAAM

+0

Sie Recht über die E-Mail, aber ich meine Fall die E-Mail ist da und es wird von der Anfrage aber nach der AsyncTask Ausführung. Ich möchte es vor der Ausführung von AsyncTask erhalten. –

Antwort

1

Das Problem tritt auf, weil in Ihrem Code zwei Asynctask gleichzeitig ausgeführt wird. Bedeutet, dass die GraphRequest-Klasse auch eine asynctask ausführt, um Benutzerdaten abzurufen, und Sie auch eine Async ausführen, um die Benutzerdaten an den Server zu senden.

Async-Tasks werden immer auf separaten Threads ausgeführt (nicht auf Main-Thread) und sie warten nicht auf die Fertigstellung anderer Tasks.

Also die Lösung ist Ihre Async-Task in OnCompleted() -Methode aufrufen. LIKE ..

Schreiben Sie diese asynchrone Klasse für das Hochladen von Daten zum Server außerhalb von registerCallback.

private class Upload_Data extends AsyncTask<String, String, String>() { 
@Override 
      protected String doInBackground(String... params) { 
       WebService ws = new WebService(URL); 
       Map<String, String> data = new HashMap<String, String>(); 
       data.put("user_fb_id", userid); 
       data.put("first_name", userfirstname); 
       data.put("middle_name", userfirstname); 
       data.put("gender", gender); 
       data.put("email", email); 
       data.put("last_name", userfirstname); 
       data.put("user_fb_profile_name", name); 
       data.put("fb_profile_pic", userimage.toString()); 


       try { 
        String response = ws.makeHTTPRequest(data, "POST"); 
        JSONObject jsonObject = new JSONObject(response); 
        Log.e("Response", jsonObject.toString()); 

       } catch (Exception e) { 
        Log.d("", "Exception : " + e.getMessage()); 
       } 
       return null; 
      } 
     } 

dann nennen diese Asynchron-Klasse in OnCompleted Verfahren nach der E-Mail und Geschlecht Wert bekommen und prüfen Sie auch, dass die E-Mail und Geschlecht ist nicht null, bevor AsyncTask Klasse aufrufen.

@Override 
      public void onCompleted(JSONObject object,GraphResponse response) { 
       if (response != null) { 
        try { 
         email = object.getString("email"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
        try { 
         gender = object.getString("gender"); 
        } catch (JSONException e) { 
         e.printStackTrace(); 
        } 
       } 
    if(email!=null && gender!=null){ 
new Upload_Data().execute(); 
} 
      } 
     }); 

Ich hoffe, dies wird hilfreich sein.

+0

das ist nicht funktionieren, ich füge meine Post AsyncTask in ** onActivityResult **, aber das Ergebnis ist gleich ... –

+0

Ich habe Update meine Antwort. überprüfen Sie das .. –

+0

können Sie mir sagen, was ist der Unterschied in meinem Code und Ihrem Code –

Verwandte Themen