无法使用Facebook API获取位置和电子邮件
在我的Android应用程序中,我开发了这个代码,用我的账户login并获取用户名,地址和电子邮件等属性。 问题是我可以得到的名称,但我无法得到电子邮件和位置。 当我尝试我的代码而不尝试赶上应用程序粉碎和我的日志点在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,而最新的SDK是4.0。+ 。 下面,我会给你一个完整的Facebooklogin代码示例,基于最新的API。 请记住,您首先必须在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()); } }); } }
如果你想使用Fragment
而不是ActionBarActivity
,只需要添加loginButton.setFragment(this);
在你的许可线之后。
manifest.xml文件:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <application <!-- your other attrs..--> <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> <!-- Get this one from developers.facebook --> <activity android:name="com.facebook.FacebookActivity" android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" android:theme="@android:style/Theme.Translucent.NoTitleBar" android:label="@string/app_name"/>
您还需要向应用程序添加散列键 。 这是一个使用代码的方法:
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_location"
权限不会返回lon, lat
,而是一个Page对象,我认为这不是您想要的。 所以,你的权限应该是List<String> permissionNeeds = Arrays.asList("user_photos", "email", "user_birthday", "public_profile");
现在你应该能够检索用户的电子邮件
一切都很好去,但我得到不同的fbid。 这是我的代码。
Profile profile = Profile.getCurrentProfile(); if (profile != null) { Log.e("profile.getId()" , "profile.getId()" + profile.getId()); } else { Log.e("profile.getId()" , "profile.getId() not available"); } Thanks in advance.