Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Facebook onActivityResult数据返回空值_Android_Facebook_Android Intent_Facebook Android Sdk_Android Facebook - Fatal编程技术网

Android Facebook onActivityResult数据返回空值

Android Facebook onActivityResult数据返回空值,android,facebook,android-intent,facebook-android-sdk,android-facebook,Android,Facebook,Android Intent,Facebook Android Sdk,Android Facebook,我是安卓系统开发的新手,尝试整合Facebook登录。在入门之后,我成功地集成了Facebook登录按钮。Facebook登录按钮更改为注销。然后注销以按预期登录 现在问题出在onActivityResult,我接收的数据为空。我花了几个小时搜索了许多Stackoverflow链接,但没有一个我能理解或找到任何答案。我肯定我在某个地方出错了,但我似乎不知道在哪里。任何帮助都将不胜感激 当我尝试data.GetDataString时,我得到null 当我尝试 if(resultCode == R

我是安卓系统开发的新手,尝试整合Facebook登录。在入门之后,我成功地集成了Facebook登录按钮。Facebook登录按钮更改为注销。然后注销以按预期登录

现在问题出在onActivityResult,我接收的数据为空。我花了几个小时搜索了许多Stackoverflow链接,但没有一个我能理解或找到任何答案。我肯定我在某个地方出错了,但我似乎不知道在哪里。任何帮助都将不胜感激

当我尝试data.GetDataString时,我得到null

当我尝试

 if(resultCode == RESULT_OK){
        Bundle bundle = data.getExtras();

        String id = bundle.toString();
        System.out.println("I am inside resultcode " +id);
    }else
    {
        System.out.println("Not okay");
    }
在控制台中打印

Data is Bundle[{com.facebook.LoginActivity:Result=com.facebook.AuthorizationClient$Result@42a54038}]
然后,我尝试使用以下方法打印各个键

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}
private void onSessionStateChange(Session session, SessionState sessionState, Exception exception) {
    if (sessionState.isOpened()) {
        Log.i(TAG, "Logged in...");

        Request.newMeRequest(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {

                if(user != null){
                    String firstname = user.getFirstName();
                    String lastname = user.getLastName();
                    String id = user.getId();
                    String email = user.getProperty("email").toString();
                    String dob = user.getBirthday();
                    String username = user.getUsername();

                    Log.i(TAG, "id is " + id + " First name is " + firstname + " Lastname is " + lastname + " and email is " + email );

                }else
                {
                    Log.i(TAG, "Screwed :( ");
                }
            }
        }).executeAsync();

    } else if (sessionState.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}
然后我把这个放在控制台里

com.facebook.LoginActivity:Result is a key in the bundle
现在我的Facebook代码是

public class SignupActivity extends ActionBarActivity{

private static final String TAG = "Custom debug";
private UiLifecycleHelper uiHelper;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.test.testApp",
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    } catch (PackageManager.NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }

    setContentView(R.layout.activity_signup);

    LoginButton fbAuthBtn = (LoginButton) findViewById(R.id.fbSignupBtn);
    fbAuthBtn.setReadPermissions(Arrays.asList("public_profile","email"));

    uiHelper = new UiLifecycleHelper(this, callback);
    uiHelper.onCreate(savedInstanceState);



}

@Override
protected void onResume() {
    super.onResume();

    // Logs 'install' and 'app activate' App Events.
    AppEventsLogger.activateApp(this);
}

@Override
protected void onPause() {
    super.onPause();

    // Logs 'app deactivate' App Event.
    AppEventsLogger.deactivateApp(this);
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}


//Facebook methods
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}

private Session.StatusCallback callback = new Session.StatusCallback() {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        onSessionStateChange(session, state, exception);
    }
};

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
   uiHelper.onActivityResult(requestCode, resultCode, data);
    //Session.getActiveSession().onActivityResult(SignupActivity.this, requestCode, resultCode, data);



    Log.i(TAG, "Request code is " + requestCode + " ResultCode is " + resultCode + " And the data is " + data.getDataString());

    if(resultCode == RESULT_OK){
        Bundle bundle = data.getExtras();

        String fbData = bundle.toString();
        System.out.println("I am inside resultcode " +fbData);
    }else
    {
        System.out.println("I have no idea what is happening :(");
    }
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}
}

事先非常感谢。请让我知道,如果你们需要任何额外的信息

更新

我终于想出了解决办法。因此,我在这里添加了解决方案,这样它可以帮助像我这样的其他人,他们最终可以搜索几个小时或节省一些宝贵的时间。在上面的代码中,我试图在onActivityResult中打印数据。但这是不对的

uiHelper.onActivityResult(requestCode, resultCode, data);
上面的代码调用

 private void onSessionStateChange(Session session, SessionState state, Exception exception) {
    if (state.isOpened()) {
        Log.i(TAG, "Logged in...");
    } else if (state.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}
当调用onSessionSateChange时,将上述内容修改为以下内容

for (String key: bundle.keySet())
{
  Log.d ("myApplication", key + " is a key in the bundle");
}
private void onSessionStateChange(Session session, SessionState sessionState, Exception exception) {
    if (sessionState.isOpened()) {
        Log.i(TAG, "Logged in...");

        Request.newMeRequest(session, new Request.GraphUserCallback() {
            @Override
            public void onCompleted(GraphUser user, Response response) {

                if(user != null){
                    String firstname = user.getFirstName();
                    String lastname = user.getLastName();
                    String id = user.getId();
                    String email = user.getProperty("email").toString();
                    String dob = user.getBirthday();
                    String username = user.getUsername();

                    Log.i(TAG, "id is " + id + " First name is " + firstname + " Lastname is " + lastname + " and email is " + email );

                }else
                {
                    Log.i(TAG, "Screwed :( ");
                }
            }
        }).executeAsync();

    } else if (sessionState.isClosed()) {
        Log.i(TAG, "Logged out...");
    }
}
因此,从上面可以看出,如果会话被打开,Facebook的graph API将被调用,该API将在对NewMereRequest的onCompleted方法的回调中返回数据。这就是我们最终直接访问数据的地方。 我相信在onCompleted方法中,我们可以添加代码以继续进行进一步的活动

进一步研究后,可以直接检索类型化方法,如用户名、id、名字等。应使用getProperty方法检索非类型化方法,如电子邮件、区域设置等

最后,上面的代码在控制台上生成以下结果。 id是123456名字是Blahfirst Lastname是Blahlast电子邮件是blah@gmail.com

这里是Facebook的graph api调用的链接,以及有关如何检索数据的完整信息。


希望这个解决方案能帮助别人。我现在要做进一步的开发:

您的onActivityResult代码什么时候执行?我不太确定,因为这是我在Facebook开发者入门指南中遵循的代码。所以我不太确定。