Java 实现Facebook登录v2.3并获取用户数据

Java 实现Facebook登录v2.3并获取用户数据,java,android,facebook,facebook-graph-api,Java,Android,Facebook,Facebook Graph Api,我正在尝试实现facebook登录。我从这里开始跟踪一切 我正在尝试调用Graph API来检索用户数据;然而,当我这样做的时候,我得到了这个 Warning: Request without access token missing application ID or client token. 我相信我已经正确地实现了这个登录,并遵循了所有步骤 我对此做了一些研究,由于会话在当前的Facebook API版本中被弃用,因此没有任何帮助 我的实现是否有任何明显的错误,导致Facebook登

我正在尝试实现facebook登录。我从这里开始跟踪一切

我正在尝试调用Graph API来检索用户数据;然而,当我这样做的时候,我得到了这个

Warning: Request without access token missing application ID or client token.
我相信我已经正确地实现了这个登录,并遵循了所有步骤

我对此做了一些研究,由于会话在当前的Facebook API版本中被弃用,因此没有任何帮助

我的实现是否有任何明显的错误,导致Facebook登录无法为用户验证

package com.ro.hitup1_0;

import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Bundle;
import android.util.Base64;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

import org.json.JSONArray;
import org.json.JSONObject;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class LoginActivity extends Activity {

    //Give your SharedPreferences file a name and save it to a static variable
    public static final String PREFS_NAME = "MyPrefsFile";
    //Facebook button
    LoginButton loginButton;
    Button email_button;
    Button google_button;
    CallbackManager callbackManager;
    AccessTokenTracker accessTokenTracker;
    ProfileTracker profileTracker;
    JSONArray userInformation;


    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        FacebookSdk.sdkInitialize(getApplicationContext());
        callbackManager = CallbackManager.Factory.create();





        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_login);
        loginButton = (LoginButton) findViewById(R.id.login_button);


        loginButton.setReadPermissions(Arrays.asList("public_profile", "email", "user_friends"));
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        // App code
                        Log.e("loginResult: ", loginResult.getAccessToken().getToken());
                        //LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this, Arrays.asList("public_profile", "email", "user_friends"));

                        GraphRequest request = GraphRequest.newMeRequest(
                                loginResult.getAccessToken(),
                                new GraphRequest.GraphJSONObjectCallback() {
                                    @Override
                                    public void onCompleted(
                                            JSONObject object,
                                            GraphResponse response) {
                                        // Application code
                                        response.getError();
                                        Log.e("JSON: ", object.toString());




                                    }
                                });
                        Bundle parameters = new Bundle();
                        parameters.putString("fields", "id,name,link");
                        request.setParameters(parameters);
                        //Log.e(" About to Graph Call", " ");
                        request.executeAsync();
                        //Log.e(" Finished Graph Call", " ");


                    }

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

                    @Override
                    public void onError(FacebookException exception) {
                        // App code
                        Log.e("Facebook exception: ", exception.getMessage());
                    }
                });




        // Callback registration
        //make sure to redirect to main page
        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(
                    AccessToken oldAccessToken,
                    AccessToken currentAccessToken) {

                // App code
            }
        };

        profileTracker = new ProfileTracker() {
            @Override
            protected void onCurrentProfileChanged(
                    Profile oldProfile,
                    Profile currentProfile) {
                // App code
            }

        };


        google_button=(Button)findViewById(R.id.google_button);
        google_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        });

        email_button= (Button)findViewById(R.id.email_button);
        email_button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        });


        try {
            PackageInfo info = getPackageManager().getPackageInfo(
                    "com.ro.hitup1_0",
                    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) {

        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_login, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

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

    }

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





}
package com.ro.hitup1\u 0;
导入android.app.Activity;
导入android.content.Intent;
导入android.content.pm.PackageInfo;
导入android.content.pm.PackageManager;
导入android.content.pm.Signature;
导入android.os.Bundle;
导入android.util.Base64;
导入android.util.Log;
导入android.view.Menu;
导入android.view.MenuItem;
导入android.view.view;
导入android.view.Window;
导入android.view.WindowManager;
导入android.widget.Button;
导入com.facebook.AccessToken;
导入com.facebook.AccessTokenTracker;
导入com.facebook.CallbackManager;
导入com.facebook.facebook回调;
导入com.facebook.facebook异常;
导入com.facebook.FacebookSdk;
导入com.facebook.GraphRequest;
导入com.facebook.GraphResponse;
导入com.facebook.Profile;
导入com.facebook.ProfileTracker;
导入com.facebook.login.LoginManager;
导入com.facebook.login.LoginResult;
导入com.facebook.login.widget.LoginButton;
导入org.json.JSONArray;
导入org.json.JSONObject;
导入java.security.MessageDigest;
导入java.security.NoSuchAlgorithmException;
导入java.util.array;
公共类LoginActivity扩展了活动{
//为SharedReferences文件指定一个名称,并将其保存到静态变量中
公共静态最终字符串PREFS\u NAME=“MyPrefsFile”;
//Facebook按钮
登录按钮登录按钮;
按钮email_按钮;
按钮google_按钮;
CallbackManager CallbackManager;
AccessTokenTracker AccessTokenTracker;
轮廓跟踪器;
JSONArray用户信息;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
sdkinInitialize(getApplicationContext());
callbackManager=callbackManager.Factory.create();
requestWindowFeature(窗口。功能\u无\u标题);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_全屏);
setContentView(R.layout.activity\u登录);
loginButton=(loginButton)findviewbyd(R.id.login_按钮);
setReadPermissions(Arrays.asList(“public_profile”、“email”、“user_friends”));
LoginManager.getInstance().registerCallback(callbackManager,
新建FacebookCallback(){
@凌驾
成功时公共无效(LoginResult LoginResult){
//应用程序代码
Log.e(“loginResult:,loginResult.getAccessToken().getToken());
//LoginManager.getInstance().logInWithReadPermissions(LoginActivity.this、Arrays.asList(“公共配置文件”、“电子邮件”、“用户朋友”);
GraphRequest请求=GraphRequest.newmereRequest(
loginResult.getAccessToken(),
新建GraphRequest.GraphJSONObjectCallback(){
@凌驾
公共空间未完成(
JSONObject对象,
GraphResponse(反应){
//应用程序代码
response.getError();
Log.e(“JSON:,object.toString());
}
});
Bundle参数=新Bundle();
parameters.putString(“字段”、“id、名称、链接”);
请求。设置参数(参数);
//Log.e(“即将进行图形调用”,”);
request.executeAsync();
//Log.e(“完成的图形调用”,”);
}
@凌驾
公开作废{
//应用程序代码
}
@凌驾
public void onError(facebook异常){
//应用程序代码
Log.e(“Facebook异常:,异常.getMessage());
}
});
//回调注册
//确保重定向到主页面
accessTokenTracker=新的accessTokenTracker(){
@凌驾
更改CurrentAccessToken时受保护的void(
AccessToken oldAccessToken,
AccessToken(当前AccessToken){
//应用程序代码
}
};
profileTracker=新的profileTracker(){
@凌驾
更改CurrentProfile时受保护的无效(
配置文件oldProfile,
配置文件(当前配置文件){
//应用程序代码
}
};
google_按钮=(按钮)findviewbyd(R.id.google_按钮);
google_button.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
意向意向=新意向(LoginActivity.this、MainActivity.class);
星触觉(意向);
完成();
}
});
email_按钮=(按钮)findviewbyd(R.id.email_按钮);
email_按钮.setOnClickListener(新视图.OnClickListener(){
公共void onClick(视图v){
意向意向=新意向(LoginActivity.this、MainActivity.class);
星触觉(意向);