Graph Api not getting location from Facebook SDK in Android

I use the Facebook SDK in my Android app. And I need to get all the user information. To date, I can get the Birthday ID of the name and user profile. The last thing I need to get is the location or current location of the user. I am using this code below.

if(fb.isSessionValid()){ button.setImageResource(R.drawable.logout_button); JSONObject obj = null; URL img = null; try { String jsonUser = fb.request("me"); obj = Util.parseJson(jsonUser); String id = obj.optString("id"); String name = obj.optString("name"); String bday = obj.optString("birthday"); String address = obj.optString("location"); String email = obj.optString("email"); ((TextView) findViewById(R.id.txt)).setText("Welcome! "+name); ((TextView) findViewById(R.id.txtbday)).setText("Birthday: "+bday); ((TextView) findViewById(R.id.txtaddress)).setText("Address: "+address); ((TextView) findViewById(R.id.txtemail)).setText("Email: "+email); img = new URL("http://graph.facebook.com/"+id+"/picture?type=normal"); Bitmap bmp = BitmapFactory.decodeStream(img.openConnection().getInputStream()); pic.setImageBitmap(bmp); } catch (FacebookError e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ button.setImageResource(R.drawable.login_button); } } 

Here are the permissions

 fb.authorize(MainActivity.this,new String[] {"email", "user_location", "user_birthday","publish_stream"}, new DialogListener() { public void onFacebookError(FacebookError e) { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), ""+e, Toast.LENGTH_SHORT).show(); e.printStackTrace(); } public void onError(DialogError e) { // TODO Auto-generated method stub //Toast.makeText(getApplicationContext(), "Error", Toast.LENGTH_SHORT).show(); } public void onComplete(Bundle values) { // TODO Auto-generated method stub Editor editor = sp.edit(); editor.putString("access_token", fb.getAccessToken()); editor.putLong("access_expires", fb.getAccessExpires()); editor.commit(); updateButtonImage(); } public void onCancel() { // TODO Auto-generated method stub Toast.makeText(getApplicationContext(), "Cancel", Toast.LENGTH_SHORT).show(); } }); } 

Thanks, who will help in advanced.

+4
source share
2 answers

The Graph APIs tool is a great way to see what an API graph endpoint response is. Just request the correct permissions (for example, user_location ) by clicking on β€œGet access token” and looking at the output of β€œ/ me”. When I get an access token with user_location permission, I can see the current

https://developers.facebook.com/tools/explorer/?method=GET&path=me

To get your current location, follow these steps:

 String currentCity = obj.getJSONObject("location").getString("name"); 

With the newer SDKs, you can get location information by passing, as shown below, using the graph API object

 graphObject.getInnerJSONObject().getJSONObject("location").getString("id")) 
+6
source

Download the source code from here ( Get the location of the facebook user using the Graph API in android )

activity_main.xml

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"> <ImageView android:layout_width="100dp" android:layout_height="100dp" android:id="@+id/iv_image" android:layout_marginTop="10dp" android:layout_marginBottom="10dp" android:layout_gravity="center_horizontal" android:src="@drawable/profile"/> <LinearLayout android:layout_width="match_parent" android:orientation="horizontal" android:layout_height="wrap_content"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Name" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:text="Name" android:textSize="15dp" android:id="@+id/tv_name" android:gravity="center_vertical" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Email" android:gravity="center_vertical" android:textSize="15dp" android:layout_below="@+id/tv_name" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="Email" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_email" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="DOB" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="DOB" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_dob" android:layout_toRightOf="@+id/tv_email" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="100dp" android:layout_height="40dp" android:text="Location" android:gravity="center_vertical" android:textSize="15dp" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> <TextView android:layout_width="wrap_content" android:layout_height="40dp" android:layout_below="@+id/tv_name" android:text="location" android:gravity="center_vertical" android:textSize="15dp" android:id="@+id/tv_location" android:textColor="#000000" android:layout_marginLeft="10dp" android:layout_marginTop="10dp"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:background="#6585C8" android:id="@+id/ll_facebook" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:layout_marginTop="40dp" android:layout_height="50dp"> <ImageView android:layout_width="50dp" android:src="@drawable/facebook" android:id="@+id/iv_facebook" android:layout_height="50dp" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Login with Facebook" android:textSize="20dp" android:textColor="#FFFFFF" android:textStyle="bold" android:id="@+id/tv_facebook" android:layout_marginLeft="20dp" android:gravity="center" android:layout_gravity="center" /> </LinearLayout> </LinearLayout> 

MainActivity.java

 package facebooklocation.facebooklocation; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.Signature; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Base64; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.bumptech.glide.Glide; import com.facebook.AccessToken; 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.HttpMethod; import com.facebook.login.LoginManager; import com.facebook.login.LoginResult; import org.json.JSONObject; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class MainActivity extends AppCompatActivity implements View.OnClickListener { CallbackManager callbackManager; ImageView iv_image, iv_facebook; TextView tv_name, tv_email, tv_dob, tv_location, tv_facebook; LinearLayout ll_facebook; String str_facebookname, str_facebookemail, str_facebookid, str_birthday, str_location; boolean boolean_login; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); getKeyHash(); listener(); } private void init() { iv_image = (ImageView) findViewById(R.id.iv_image); iv_facebook = (ImageView) findViewById(R.id.iv_facebook); tv_name = (TextView) findViewById(R.id.tv_name); tv_email = (TextView) findViewById(R.id.tv_email); tv_dob = (TextView) findViewById(R.id.tv_dob); tv_location = (TextView) findViewById(R.id.tv_location); tv_facebook = (TextView) findViewById(R.id.tv_facebook); ll_facebook = (LinearLayout) findViewById(R.id.ll_facebook); FacebookSdk.sdkInitialize(this.getApplicationContext()); } private void listener() { tv_facebook.setOnClickListener(this); ll_facebook.setOnClickListener(this); iv_facebook.setOnClickListener(this); } private void facebookLogin() { callbackManager = CallbackManager.Factory.create(); LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() { @Override public void onSuccess(LoginResult loginResult) { Log.e("ONSUCCESS", "User ID: " + loginResult.getAccessToken().getUserId() + "\n" + "Auth Token: " + loginResult.getAccessToken().getToken() ); GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() { @Override public void onCompleted(JSONObject object, GraphResponse response) { try { boolean_login = true; tv_facebook.setText("Logout from Facebook"); Log.e("object", object.toString()); str_facebookname = object.getString("name"); try { str_facebookemail = object.getString("email"); } catch (Exception e) { str_facebookemail = ""; e.printStackTrace(); } try { str_facebookid = object.getString("id"); } catch (Exception e) { str_facebookid = ""; e.printStackTrace(); } try { str_birthday = object.getString("birthday"); } catch (Exception e) { str_birthday = ""; e.printStackTrace(); } try { JSONObject jsonobject_location = object.getJSONObject("location"); str_location = jsonobject_location.getString("name"); } catch (Exception e) { str_location = ""; e.printStackTrace(); } fn_profilepic(); } catch (Exception e) { } } }); Bundle parameters = new Bundle(); parameters.putString("fields", "id, name, email,gender,birthday,location"); request.setParameters(parameters); request.executeAsync(); } @Override public void onCancel() { if (AccessToken.getCurrentAccessToken() == null) { return; // already logged out } new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest .Callback() { @Override public void onCompleted(GraphResponse graphResponse) { LoginManager.getInstance().logOut(); LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email")); facebookLogin(); } }).executeAsync(); } @Override public void onError(FacebookException e) { Log.e("ON ERROR", "Login attempt failed."); AccessToken.setCurrentAccessToken(null); LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday")); } }); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); try { callbackManager.onActivityResult(requestCode, resultCode, data); } catch (Exception e) { } } private void getKeyHash() { // Add code to print out the key hash try { PackageInfo info = getPackageManager().getPackageInfo("facebooklocation.facebooklocation", 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) { } } private void fn_profilepic() { Bundle params = new Bundle(); params.putBoolean("redirect", false); params.putString("type", "large"); new GraphRequest( AccessToken.getCurrentAccessToken(), "me/picture", params, HttpMethod.GET, new GraphRequest.Callback() { public void onCompleted(GraphResponse response) { Log.e("Response 2", response + ""); try { String str_facebookimage = (String) response.getJSONObject().getJSONObject("data").get("url"); Log.e("Picture", str_facebookimage); Glide.with(MainActivity.this).load(str_facebookimage).skipMemoryCache(true).into(iv_image); } catch (Exception e) { e.printStackTrace(); } tv_name.setText(str_facebookname); tv_email.setText(str_facebookemail); tv_dob.setText(str_birthday); tv_location.setText(str_location); } } ).executeAsync(); } @Override public void onClick(View view) { if (boolean_login) { boolean_login = false; LoginManager.getInstance().logOut(); tv_location.setText(""); tv_dob.setText(""); tv_email.setText(""); tv_name.setText(""); Glide.with(MainActivity.this).load(R.drawable.profile).into(iv_image); tv_facebook.setText("Login with Facebook"); } else { LoginManager.getInstance().logInWithReadPermissions(MainActivity.this, Arrays.asList("public_profile,email,user_birthday,user_location")); facebookLogin(); } } @Override protected void onDestroy() { super.onDestroy(); LoginManager.getInstance().logOut(); } } 

Thanks!

0
source

Source: https://habr.com/ru/post/1445926/


All Articles