在我的Android应用程序中,我开发了此代码以使用我的帐户登录并获取用户属性,例如名称,位置和电子邮件。问题是我可以获取名称,但无法获取电子邮件和位置。当我不加尝试地尝试代码时,发现应用程序崩溃并且我的登录点位于getproperty("email")和getlocation()。当我使用尝试。该应用程序可以运行,但是没有电子邮件或位置。
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。+。下面,我将基于最新的API为您提供Facebook登录的完整示例代码。请记住,developers.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()); } }); } }
如果要使用Fragment而不是ActionBarActivity,只需loginButton.setFragment(this);在权限行之后添加即可。
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的项目所在的帐户中。
facebook.developer
在grandle,你应该添加jcenter的repositories,也可以添加compile 'com.facebook.android:facebook-android-sdk:4.0.0'在dependecies。
jcenter
repositories
compile 'com.facebook.android:facebook-android-sdk:4.0.0'
dependecies
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..*/ } }
还有另一个文件:
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");,现在您应该能够检索用户的电子邮件
"user_location"
lon, lat
List<String>permissionNeeds=Arrays.asList("user_photos", "email", "user_birthday","public_profile");