【问题标题】:Get profile data from Facebook SDK on Android always return Null. Why?从 Android 上的 Facebook SDK 获取个人资料数据总是返回 Null。为什么?
【发布时间】:2018-07-23 17:28:47
【问题描述】:

我刚刚了解了 android 上的 facebook SDK。我已经在 stackoverflow 和 facebook developer guide 上搜索登录,但是当从 facebook sdk 获取个人资料数据时我仍然卡住了。我尝试从 unable get profileGet email 实施解决方案,但仍然卡住。

这是我的代码:

    public class HomeLoginActivity extends Activity {
   LoginButton btnFacebook;
    CallbackManager callbackManager = CallbackManager.Factory.create();
    ProfileTracker profTrack;
    AccessTokenTracker accessTokenTracker;
    TextView welcomeText;
    FacebookCallback<LoginResult> mFacebookCallback;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(this.getApplicationContext());
        setContentView(R.layout.activity_home_login);
        welcomeText = (TextView) findViewById(R.id.welcome_id);
        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(
                    AccessToken oldAccessToken,
                    AccessToken currentAccessToken) {
                // App code
                Log.d("current token", "" + currentAccessToken);

                //}
            }
        };
        profTrack = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(
                    Profile oldProfile,
                    Profile currentProfile) {
                // App code
                Log.d("current profile", "" + currentProfile);
                welcomeText.setText(constructWelcomeMessage(currentProfile));
            }

        };
        mFacebookCallback = new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                AccessToken accessToken = loginResult.getAccessToken();
                Profile profile = Profile.getCurrentProfile();
                welcomeText.setText(constructWelcomeMessage(profile));

                GraphRequest request = GraphRequest.newMeRequest(
                        loginResult.getAccessToken(),
                        new GraphRequest.GraphJSONObjectCallback() {
                            @Override
                            public void onCompleted(
                                    JSONObject object,
                                    GraphResponse response) {
                                // Application code
                                try {
                                    String id=object.getString("id");
                                    String name=object.getString("name");
                                    String email=object.getString("email");
                                    String gender=object.getString("gender");
                                    Stringbirthday=object.getString("birthday");

                                    //do something with the data here
                                } catch (JSONException e) {
                                    e.printStackTrace(); 
                                }
                            }
                        });
                Bundle parameters = new Bundle();
                parameters.putString("fields", "id,name,email,gender,birthday");
                request.setParameters(parameters);
                request.executeAsync();
            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException e) {

            }
        };

        accessTokenTracker.startTracking();
        profTrack.startTracking();

        //Button Facebook
        btnFacebook = (LoginButton) findViewById(R.id.btnFacebook);
        btnFacebook.setReadPermissions("public_profile", "user_friends");
        btnFacebook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            LoginManager.getInstance().logInWithReadPermissions((Activity) v.getContext(),Arrays.asList("public_profile", "user_friends"));
            }
        });
        btnFacebook.registerCallback(callbackManager, mFacebookCallback);

    }
    // ennd on create
    private String constructWelcomeMessage(Profile profile) {
        StringBuffer stringBuffer = new StringBuffer();
        if (profile != null) {
            stringBuffer.append("Welcome " + profile.getName());
        }
        else {
            stringBuffer.append("NULL Profile");
        }
        return stringBuffer.toString();
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);

    }
    @Override
    public void onResume() {
        super.onResume();
        AccessToken.getCurrentAccessToken();
        Log.d("resume current token", "" + AccessToken.getCurrentAccessToken());
        Profile.fetchProfileForCurrentAccessToken();
    }

    @Override
    public void onStop() {
        super.onStop();
        profTrack.stopTracking();
        accessTokenTracker.stopTracking();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        accessTokenTracker.stopTracking();
        profTrack.stopTracking();
    }
}

还有我的日志猫:

 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String org.json.JSONObject.getString(java.lang.String)' on a null object reference
            at com.twiscode.gimme.HomeLoginActivity$3$1.onCompleted(HomeLoginActivity.java:100)
            at com.facebook.GraphRequest$1.onCompleted(GraphRequest.java:298)
            at com.facebook.GraphRequest$5.run(GraphRequest.java:1246)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

【问题讨论】:

  • 谢谢,我已经发布了关于这个错误的日志。
  • 您正试图在您的 onCompleted 回调中对空对象调用 getString,这可能意味着您没有活动的 Facebook 会话。
  • 是的,我尝试获取 String id=object.getString("id");从 facebook SDK 完成图形请求后。虽然,我删除了图形请求,只使用了配置文件跟踪器和 accesstoketracker,但当我调用 Profile.getCurrentProfile() 时,配置文件仍然为空。在 facebook SDK 4.0 上,facebook 删除会话并更改为 acesstoken,如果我没有登录,为什么会调用登录结果中的 onsuccess 函数?我坚持这个,成功登录但无法获取数据用户配置文件
  • GraphResponse 是否包含任何可能出错的提示?
  • 不,只是说明返回为空。它在 JSONObject 或 GraphResponse 中都是空指针异常

标签: android facebook-sdk-4.0


【解决方案1】:

试试这个示例代码来获取个人资料信息

loginButton.registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    // App code

                    // login ok get access token
                    GraphRequest request = GraphRequest.newMeRequest(
                            AccessToken.getCurrentAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(JSONObject object,
                                        GraphResponse response) {

                                    if (BuildConfig.DEBUG) {
                                        FacebookSdk.setIsDebugEnabled(true);
                                        FacebookSdk
                                                .addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS);

                                        System.out
                                                .println("AccessToken.getCurrentAccessToken()"
                                                        + AccessToken
                                                                .getCurrentAccessToken()
                                                                .toString());
                                        Profile.getCurrentProfile().getId();
                                        Profile.getCurrentProfile().getFirstName();
                                        Profile.getCurrentProfile().getLastName();
                                        Profile.getCurrentProfile().getProfilePictureUri(50, 50);
                                        //String email=UserManager.asMap().get(“email”).toString();
                                    }
                                }
                            });
                    request.executeAsync(); 
                /*  Bundle parameters = new Bundle();
                    parameters
                            .putString("fields",
                                    "id,firstName,lastName,name,email,gender,birthday,address");
                    request.setParameters(parameters);



                    Intent loginintent = new Intent(getActivity(),
                            EditProfile.class);
                    startActivity(loginintent);
                    System.out.println("XXXX " + getId());
                 */
                    makeJsonObjReq();
                }

                @Override
                public void onCancel() {
                    // App code
                }

                @Override
                public void onError(FacebookException exception) {
                    // App code
                }

            });

    return view;

【讨论】:

  • 抱歉,makeJsonObjReq() 的内部函数是什么?我已经实现了你的代码,我可以获得访问令牌,并读取权限,但是当尝试从当前配置文件中获取 id 时,它返回空指针异常。
  • 这是我的自定义方法,你可以删除它
  • @BagusKristomoyoKristanto 你有 facebook 用户性别吗,你能告诉我怎么做
  • 对不起,我没有实现获取用户性别,也许你可以试试 deepika 的回答。我有其他项目,所以我没有实施 deepika 的回答。对不起。
【解决方案2】:

我遇到了同样的错误,终于找到了解决方案。基本上你必须首先知道是什么导致了这个崩溃/NullPointerException。因此,要找出导致此异常的原因,请让您的 onComplete 代码块如下所示:

                        GraphRequest request = GraphRequest.newMeRequest(
                            loginResult.getAccessToken(),
                            new GraphRequest.GraphJSONObjectCallback() {
                                @Override
                                public void onCompleted(
                                        JSONObject object,
                                        GraphResponse response) {
                                    Log.v("LoginActivity Response ", response.toString());
                                }
                            });

现在,运行您的应用并尝试使用 FB 按钮登录。继续检查你的 logcat,很快你就会看到如下一行:

V/LoginActivity Response: {Response:  responseCode: 200, graphObject: {"id":"10206735777938523","name":"Rohit Paniker","email":"rohit.paniker.1990@gmail.com","gender":"male"}, error: null}

我正在使用“年龄”权限,这导致 ID、姓名、电子邮件和我从上面的 logcat 输出中知道的所有权限中出现 NullPointerException。根据输出,我明白为什么会发生崩溃,我删除了 object.getString("age") 并再次运行应用程序,完美运行,没有崩溃,我得到了从 ID 到姓名和电子邮件的所有数据!

【讨论】:

    【解决方案3】:

    请参阅下面的工作代码以获取配置文件详细信息 FB SDK 4

        //Initialize Facebook SDK
        FacebookSdk.sdkInitialize(getApplicationContext());
    
        //if the facebook profile is changed, below code block will be called
        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
    
                if(currentProfile != null){
                    fbUserId = currentProfile.getId();
    
                    if(!sharedPreferences.contains("UserName")){
                        editor.putString("UserName",currentProfile.getFirstName()+" "+currentProfile.getLastName());
                    }
                    if(!sharedPreferences.contains("FbId")){
                        editor.putString("FbId",currentProfile.getId());
                    }
                    if(!sharedPreferences.contains("ProfilePicture")){
                        editor.putString("ProfilePicture",currentProfile.getProfilePictureUri(100,100).toString());
                    }
    
                    editor.commit();
                }
            }
        };
    
        //when new fb user logged in , below code block will be called
        AccessTokenTracker accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken accessToken, AccessToken accessToken2) {
                System.out.println("acesstoken trackercalled");
            }
        };
    
    
    
        //set layout resource
        setContentView(R.layout.activity_login);
    
        //fb login button
        loginButton = (LoginButton) findViewById(R.id.connectWithFbButton);
    
        //set fb permissions
        loginButton.setReadPermissions(Arrays.asList("public_profile,email"));
    
        //call the login callback manager
        callbackManager = CallbackManager.Factory.create();
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
    
                        profile = Profile.getCurrentProfile();
                        if(profile != null){
                            fbUserId = profile.getId();
    
                            if(!sharedPreferences.contains("UserName")){
                                editor.putString("UserName",profile.getFirstName()+" "+profile.getLastName());
                            }
                            if(!sharedPreferences.contains("FbId")){
                                editor.putString("FbId",profile.getId());
                            }
                            if(!sharedPreferences.contains("ProfilePicture")){
                                editor.putString("ProfilePicture",profile.getProfilePictureUri(20,20).toString());
                            }
                            editor.commit();
                        }
    
    
    
                        goToNewActivity();
                    }
    
                    @Override
                    public void onCancel() {
                    }
    
                    @Override
                    public void onError(FacebookException e) {
    
                    }
    
    
                });
    

    【讨论】:

      【解决方案4】:

      请尝试使用此代码:

      LoginManager.getInstance().logInWithReadPermissions(Activity.this, Arrays.asList("public_profile","email"));

                      LoginManager.getInstance().registerCallback(callbackManager,
                              new FacebookCallback<LoginResult>() {
      
                                  public void onSuccess(LoginResult loginResult) {
                                      if (AccessToken.getCurrentAccessToken() != null) {
      
          Log.e("idfb",""+loginResult.getAccessToken().getUserId());
      
          GraphRequest request = GraphRequest.newMeRequest(
                  loginResult.getAccessToken(),
                  new GraphRequest.GraphJSONObjectCallback() {
                    @Override
                    public void onCompleted(JSONObject object, GraphResponse response) {
                      // Application code
                      try {
                        Log.i("Response",response.toString());
      
                        String email = response.getJSONObject().getString("email");
                        String name = response.getJSONObject().getString("name");
                        String id = response.getJSONObject().getString("id");
      
                       String imgUrl = "https://graph.facebook.com/" + id + "/picture?type=large";
      
                        Log.i("Login" + "Email", "");
                        Log.i("Login"+ "FirstName", name);
                        Log.i("Login" + "Id", id);
      
      
      
                      } catch (JSONException e) {
                        e.printStackTrace();
                        Log.e("errorfb",""+e);
                      }
                    }
                  });
          Bundle parameters = new Bundle();
          parameters.putString("fields", "id,email,name,link");
          request.setParameters(parameters);
          request.executeAsync();
      
                                  }
      
                                 }
                                 @Override
                                  public void onCancel() {
      
                                  }
                                  @Override
                                  public void onError(FacebookException exception) {
      
                                  }
                              });
      

      【讨论】:

      • 虽然此代码可以回答问题,但提供有关 如何为什么 解决问题的附加上下文将提高​​答案的长期价值。
      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多