Java Can';无法使用Facebook API获取位置和电子邮件
在我的Android应用程序中,我开发了这段代码以使用我的帐户登录,并获取用户名、位置和电子邮件等用户属性。问题是我可以得到名字,但我不能得到电子邮件和地址。当我在没有尝试的情况下尝试我的代码时,请在Java Can';无法使用Facebook API获取位置和电子邮件,java,android,facebook-graph-api,Java,Android,Facebook Graph Api,在我的Android应用程序中,我开发了这段代码以使用我的帐户登录,并获取用户名、位置和电子邮件等用户属性。问题是我可以得到名字,但我不能得到电子邮件和地址。当我在没有尝试的情况下尝试我的代码时,请在getproperty(“email”)和getlocation()中捕获应用程序崩溃和我的日志点。当我使用时,请尝试。应用程序正常工作,但没有电子邮件或位置 public class Share extends Fragment {private static final String TAG =
getproperty(“email”)
和getlocation()
中捕获应用程序崩溃和我的日志点。当我使用时,请尝试。应用程序正常工作,但没有电子邮件或位置
public class Share extends Fragment {private static final String TAG ="Share";private UiLifecycleHelper uiHelper;
private View otherView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// To maintain FB Login session
uiHelper = new UiLifecycleHelper(getActivity(), callback);
uiHelper.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.share, container, false);
// Looks for Login button
LoginButton authButton = (LoginButton) view.findViewById(R.id.authButton);
authButton.setFragment(this);
// Set View that should be visible after log-in invisible initially
otherView = view.findViewById(R.id.other_views);
otherView.setVisibility(View.GONE);
//authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday"));
return view;
}
// Called when session changes
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state,Exception exception) {
onSessionStateChange(session, state, exception);
}
};
// When session is changed, this method is called from callback method
private void onSessionStateChange(Session session, SessionState state,Exception exception) {
final TextView name = (TextView) getView().findViewById(R.id.name);
final TextView mail = (TextView) getView().findViewById(R.id.mail);
final TextView location = (TextView) getView().findViewById(R.id.location);
final TextView locale = (TextView) getView().findViewById(R.id.locale);
final TextView info = (TextView)getView().findViewById(R.id.msginfo);
final LinearLayout views= (LinearLayout)getView().findViewById(R.id.other_views);
if (state.isOpened()) {
Log.i(TAG, "Logged in...");
// make request to the /me API to get Graph user
views.setVisibility(View.VISIBLE);
info.setText("You can now share images in facebook ");
Request.newMeRequest(session, new Request.GraphUserCallback() {
// callback after Graph API response with user
// object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) {
try {
// Set view visibility to true
otherView.setVisibility(View.VISIBLE);
// Set User name
name.setText("Hello " + user.getName());
// Set Email
mail.setText("Your Email: " + user.getProperty("email").toString());
locale.setText("Locale: " + user.getProperty("locale").toString());
location.setText("Your Current Location: " + user.getLocation().getProperty("name").toString());
}
catch(Exception e) {
e.printStackTrace();
}
}
}
}).executeAsync();
} else if (state.isClosed()) {
views.setVisibility(View.INVISIBLE);
info.setText("If you want to share images in Facebook, please Login");
Log.i(TAG, "Logged out...");
otherView.setVisibility(View.GONE);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
uiHelper.onActivityResult(requestCode, resultCode, data);
Log.i(TAG, "OnActivityResult...");
}
@Override
public void onResume() {
super.onResume();
uiHelper.onResume();
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
uiHelper.onSaveInstanceState(outState);
}
}
问题是您没有请求权限:
authButton.setReadPermissions(Arrays.asList("user_likes", "user_status","email","user_birthday"));
但是,您使用的是较旧的Facebook SDK,而。下面,我将基于最新的API为您提供Facebook登录的完整示例代码。请记住,正如前面提到的,您首先必须在developers.facebook
中添加应用程序
public class LoginActivity extends ActionBarActivity{
@Override
protected void onActivityResult(int requestCode, int responseCode, Intent data)
{
super.onActivityResult(requestCode, responseCode, data);
callbackManager.onActivityResult(requestCode, responseCode, data);
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());
setContentView(R.layout.activity_login);
callbackManager = CallbackManager.Factory.create();
loginButton = (LoginButton) findViewById(R.id.loginFaceBook_button);
List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile");
loginButton.setReadPermissions(permissionNeeds);
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
{
@Override
public void onSuccess(LoginResult loginResult)
{
System.out.println("onSuccess");
GraphRequest request = GraphRequest.newMeRequest
(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback()
{
@Override
public void onCompleted(JSONObject object, GraphResponse response)
{
// Application code
Log.v("LoginActivity", response.toString());
//System.out.println("Check: " + response.toString());
try
{
String id = object.getString("id");
String name = object.getString("name");
String email = object.getString("email");
String gender = object.getString("gender");
String birthday = object.getString("birthday");
System.out.println(id + ", " + name + ", " + email + ", " + gender + ", " + birthday);
}
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()
{
System.out.println("onCancel");
}
@Override
public void onError(FacebookException exception)
{
System.out.println("onError");
Log.v("LoginActivity", exception.getCause().toString());
}
});
}
}
您还需要向应用程序添加一个散列键。以下是使用代码执行此操作的方法:
try
{
//paste Your package name at the first parameter
PackageInfo info = getPackageManager().getPackageInfo("PUT_YOUR_PACKAGE_NAME_HERE",
PackageManager.GET_SIGNATURES);
for (android.content.pm.Signature signature : info.signatures)
{
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String sign = Base64.encodeToString(md.digest(), Base64.DEFAULT);
Log.e("MY KEY HASH:", sign);
Toast.makeText(getApplicationContext(),sign, Toast.LENGTH_LONG).show();
}
}
catch (PackageManager.NameNotFoundException e)
{
}
catch (NoSuchAlgorithmException e)
{
}
在它打印出散列密钥后,您可以将其复制粘贴到项目所在的facebook.developer
帐户
在grandle中,您应该在repositories
中添加jcenter
,并在dependecies
中添加compile'com.facebook.android:facebook android sdk:4.0.0'
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.1.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects
{
repositories {
jcenter()
/*more project attrs..*/
}
}
还有另一个grandle文件:
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "YOUR_PACKAGE_NAME"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
}
编辑:
为了跟踪用户的位置,你需要一个GPS跟踪器,比如
“user\u location”
权限不会返回lon,lat
,而是返回一个对象,我认为这不是您想要的。因此,您的权限应该是List permissionNeeds=Arrays.asList(“用户照片”、“电子邮件”、“用户生日”、“公共档案”)
现在你应该可以检索用户的电子邮件了你要求权限了吗?我只需要互联网权限。我可以登录并拥有我的图像和用户名,所以我认为问题不在于权限。我说的是Facebook权限!啊,是的,我有我的身份证,这是我放在舱单上的:那是你的身份证,我不是在说这个。在您的代码//authButton.setReadPermissions(Arrays.asList(“用户喜欢”、“用户状态”、“电子邮件”、“用户生日”))中选中此项代码>谢谢。我升级到最新的facebook sdk,但是我对build.gradle有问题。你能把你的gradle发送给我吗?@user3921905我确实添加了build.grandle文件com.facebook.android:facebook安卓sdk:4.0.0'
应该在这里完成这项工作。让我知道,如果这解决了你的问题,也是关于清单和grandle设置的完整文档。我尝试了你的代码,但我不知道为什么我的电子邮件总是返回null。当我使用username.setText(name)时,textview中没有任何内容,但我可以在调试代码时看到结果?@user3921905,这样您就可以在控制台中看到所有结果,但您在将其设置为textview
时遇到问题?然后确保在textview上有一个引用,例如:textview mTextView=(textview)findViewById(R.id.mTextView)
。因为代码运行,所以这将是唯一的情况。。另外,如果您正在对片段运行代码,请确保在权限行之后有这行代码:loginButton.setFragment(this)代码>获得引用后,写:username.setText(String.valueOf(name))
apply plugin: 'com.android.application'
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "YOUR_PACKAGE_NAME"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
}