2016-05-20 9 views
0

親愛なる開発者Facebookからデータを保存しようとしています。私は他のすべてのデータを取得していますが、メールと性別は取得できません。Facebook SDKのメールと性別が指定されています。

これは、今、私はあなたが私の上記のコードではエラーが何であるかを知っているだろう私のコード

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."); 
     } 
    }); 

です。

私がGraphRequestを実行すると、正常に実行されますが、電子メールと性別は取得されませんでした。電子メールと性別がNULLに等しいGrapRequestメソッドの後に私はAsyncTaskを実行し、そのデータを私のWebサービスの投稿クラスに送信します。私のクラスは私にメールと性別のヌルエラーを与えますが、実行後に電子メールと性別AsyncTask彼らはそのデータを持っていますので、その問題の解決方法を教えてください。

私は、私が試してみたいことを別の方法で教えてもらえれば、ユーザーの基本データを保存したいと思っています。

+0

ユーザーが電子メールを提供しても、電子メールが有効でない場合は、要求を受け付けません。 – RAAAAM

+0

あなたはメールについては正しいですが、私の場合はメールがあり、リクエストから取得していますが、AsyncTaskの実行後です。私はAsyncTaskの実行から前にそれを取得したい。 –

答えて

1

コードで2つのAsynctaskが同時に実行されるため、問題が発生します。 GraphRequestクラスもasynctaskを実行してユーザーデータを取得し、サーバーにユーザーデータを送信する非同期も実行していることを意味します。

非同期タスクは、常に(メインスレッドではなく)別のスレッドで実行され、他のタスクの完了を待たない。

したがって、ソリューションはonCompleted()メソッドでAsyncタスクを呼び出します。 LIKE ..

この非同期クラスは、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; 
      } 
     } 

その後、電子メールや性別値を取得した後onCompleted方法で、この非同期クラスを呼び出しても、電子メールや性別はAsynctaskクラスを呼び出す前にnullでないことを確認してください。

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

希望すると便利です。

+0

これは私の投稿AsyncTaskを** onActivityResult **に貼り付けることはできませんが、結果は同じです... –

+0

私は自分の答えを更新しました。これをチェックしてください.. –

+0

私のコードとあなたのコードの違いは教えてください –

関連する問題