Java 实现Facebook登录v2.3并获取用户数据
我正在尝试实现facebook登录。我从这里开始跟踪一切 我正在尝试调用Graph API来检索用户数据;然而,当我这样做的时候,我得到了这个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登
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);
星触觉(意向);