我不知道为什么,但是当我试图获取用户的个人资料照片时,我总是变空。我是否需要设置一些特定权限才能获得访问权限?
以下是我的方法:
public static Bitmap getFacebookProfilePicture(String userID) throws SocketException, SocketTimeoutException, MalformedURLException, IOException, Exception
{
String imageURL;
Bitmap bitmap = null;
imageURL = "http://graph.facebook.com/"+userID+"/picture?type=large";
InputStream in = (InputStream) new URL(imageURL).getContent();
bitmap = BitmapFactory.decodeStream(in);
return bitmap;
}
Bitmap bitmap = getFacebookProfilePicture(userId);
我变空了。我不知道原因是什么?任何帮助都很明显。
答案 0 :(得分:66)
这应该有效:
public static Bitmap getFacebookProfilePicture(String userID){
URL imageURL = new URL("https://graph.facebook.com/" + userID + "/picture?type=large");
Bitmap bitmap = BitmapFactory.decodeStream(imageURL.openConnection().getInputStream());
return bitmap;
}
Bitmap bitmap = getFacebookProfilePicture(userId);
正如@dvpublic在评论中所建议的那样,使用“https”来修复未下载图像的问题,而使用“http”。
答案 1 :(得分:52)
使用facebook ProfilePictureView而不是Imageview
<com.facebook.login.widget.ProfilePictureView
android:id="@+id/friendProfilePicture"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
facebook:preset_size="small"/>
之后你可以在代码中设置这样的facebook id
ProfilePictureView profilePictureView;
profilePictureView = (ProfilePictureView) findViewById(R.id.friendProfilePicture);
profilePictureView.setProfileId(userId);
它有效..
您也可以将ProfilePictureView
答案 2 :(得分:29)
只需使用毕加索。添加Picasso Library,然后使用这个简单的行代码:
userpicture = (ImageView) row.findViewById(R.id.postuserid);
Picasso.with(context)
.load("https://graph.facebook.com/" + userID+ "/picture?type=large")
.into(userpicture);
答案 3 :(得分:15)
您必须调用GraphRequest API来获取当前个人资料图片的网址。
Bundle params = new Bundle();
params.putString("fields", "id,email,picture.type(large)");
new GraphRequest(AccessToken.getCurrentAccessToken(), "me", params, HttpMethod.GET,
new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
if (response != null) {
try {
JSONObject data = response.getJSONObject();
if (data.has("picture")) {
String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
Bitmap profilePic = BitmapFactory.decodeStream(profilePicUrl.openConnection().getInputStream());
// set profilePic bitmap to imageview
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).executeAsync();
我希望它有所帮助!
答案 4 :(得分:14)
获取个人资料图片网址的最佳方式
int dimensionPixelSize = getResources().getDimensionPixelSize(com.facebook.R.dimen.com_facebook_profilepictureview_preset_size_large);
Uri profilePictureUri= Profile.getCurrentProfile().getProfilePictureUri(dimensionPixelSize , dimensionPixelSize);
或
Uri profilePictureUri = ImageRequest.getProfilePictureUri(Profile.getCurrentProfile().getId(), dimensionPixelSize , dimensionPixelSize );
使用Glide显示图像
Glide.with(this).load(profilePictureUri)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(profilePictureView);
没有更多硬编码的字符串
答案 5 :(得分:4)
注意:从2018年3月26日起,所有与手动链接相关的解决方案都不再适用
您应该遵循official guide here
private static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
private static String FACEBOOK_FIELDS = "fields";
private void getFacebookData() {
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(),
(object, response) -> {
updateAvatar(getImageUrl(response));
});
Bundle parameters = new Bundle();
parameters.putString(FACEBOOK_FIELDS, FACEBOOK_FIELD_PROFILE_IMAGE);
request.setParameters(parameters);
request.executeAsync();
}
private static String FACEBOOK_FIELD_PICTURE = "picture";
private static String FACEBOOK_FIELD_DATA = "data";
private static String FACEBOOK_FIELD_URL = "url";
private String getImageUrl(GraphResponse response) {
String url = null;
try {
url = response.getJSONObject()
.getJSONObject(FACEBOOK_FIELD_PICTURE)
.getJSONObject(FACEBOOK_FIELD_DATA)
.getString(FACEBOOK_FIELD_URL);
} catch (Exception e) {
e.printStackTrace();
}
return url;
}
答案 6 :(得分:4)
检查用户ID是否使用此网址
imgurl="https://graph.facebook.com/"+user.getId()+"/picture";
答案 7 :(得分:4)
我总是收到一条声明FACEBOOK_NON_JSON_RESULT
的回复。回顾Facebook的图形API浏览器,我注意到一个带有重定向标签的复选框。一些谷歌搜索告诉我,我需要为我的GraphRequest
提供不允许重定向的参数。因此,正确的请求必须是:
Bundle params = new Bundle();
params.putBoolean("redirect", false);
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"me/picture",
params,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
try {
String picUrlString = (String) response.getJSONObject().getJSONObject("data").get("url");
//Load picture url in imageView
Glide.with(this).load(picUrlString).diskCacheStrategy(DiskCacheStrategy.SOURCE).into(profilePictureView);
} catch (JSONException | IOException e) {
e.printStackTrace();
}
}
}
).executeAsync();
答案 8 :(得分:2)
List<int> l = new List<int> { 1, 2, 4 };
List<int> s = new List<int> { 1, 2, 3 };
var result = s.Where(x => l.Contains(x));
答案 9 :(得分:2)
使用Glide:
userId = loginResult.getAccessToken().getUserId();
然后;
Glide.with(this)
.load("https://graph.facebook.com/" + userId+ "/picture?type=large")
.into(imgProfile);
答案 10 :(得分:2)
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";
然后Picasso.with(getApplicationContext()).load(imgUrl).into(imageView);
答案 11 :(得分:2)
我认为问题在于
imageURL = "**http**://graph.facebook.com/"+userID+"/picture?type=large";
使用https
http
内容
答案 12 :(得分:2)
<div>
<div class="row">
<div class="col-md-6"></div>
<div class="col-md-6"></div>
</div>
<div class="row">
<div class="col-md-6"></div>
<div class="col-md-6"></div>
</div>
</div>
答案 13 :(得分:2)
...
COALESCE(sfo.coupon_code,'no Code') AS Coupon
...
GROUP BY Coupon
试试这个
答案 14 :(得分:1)
这应该解决它。但一定要静态访问setfollowredirects,即HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeStream(input, null, options);
// Calculate inSampleSize
options.inSampleSize = calculateInSampleSize(options, 300, 300);
// Decode bitmap with inSampleSize set
options.inJustDecodeBounds = false;
options.inPreferredConfig = Config.RGB_565;
myBitmap= BitmapFactory.decodeStream(input, null, options);
或
url = new URL("https://graph.facebook.com/ID/picture?type=small");
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); HttpURLConnection.setFollowRedirects(HttpURLConnection.getFollowRedirects());
connection.setDoInput(true);
connection.connect();
input = connection.getInputStream();
myBitmap= BitmapFactory.decodeStream(input);
希望这有帮助
答案 15 :(得分:1)
private void importFbProfilePhoto() {
if (AccessToken.getCurrentAccessToken() != null) {
GraphRequest request = GraphRequest.newMeRequest(
AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject me, GraphResponse response) {
if (AccessToken.getCurrentAccessToken() != null) {
if (me != null) {
String profileImageUrl = ImageRequest.getProfilePictureUri(me.optString("id"), 500, 500).toString();
Log.i(LOG_TAG, profileImageUrl);
}
}
}
});
GraphRequest.executeBatchAsync(request);
}
}
答案 16 :(得分:1)
当您提出这样的请求时:
http://graph.facebook.com/103407310026838/picture?type=square&type=large
它会重定向到其他网址。
您需要在Get request
上添加额外的参数redirect=false
喜欢这个
http://graph.facebook.com/103407310026838/picture?type=square&type=large&redirect=false
你会得到一个带有Real Image网址的Json ..
像这样:
{
"data": {
"is_silhouette": true,
"url": "https://scontent.xx.fbcdn.net/v/t1.0-1/s200x200/1379841_10150004552801901_469209496895221757_n.jpg?oh=4234dcdfc832a58b9ef7a31c7896c73c&oe=57DD01F8"
}
}
最后提出新请求以获取您在data-&gt; url
中找到的图片答案 17 :(得分:0)
Facebook API Graph版本3.2
我已经实现了此实现:
首先请确保您具有在“ onStart”或“ onCreate”中添加的此权限 (这避免了NetworkOnMainThreadException)。
StrictMode.ThreadPolicy policy = new
StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
之后,您可以使用下一个功能:
//Next lines are Strings used as params
public static String FACEBOOK_FIELD_PROFILE_IMAGE = "picture.type(large)";
public static String FACEBOOK_FIELDS = "fields";
//A function that can be accessed from OnCreate (Or a similar function)
private void setImageProfileFacebook(){
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
if(isLoggedIn) {
//If the user is LoggedIn then continue
Bundle parameters = new Bundle();
parameters.putString(Util.FACEBOOK_FIELDS, Util.FACEBOOK_FIELD_PROFILE_IMAGE);
/* make the API call */
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"me",
parameters,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
if (response != null) {
try {
JSONObject data = response.getJSONObject();
//Log.w(TAG, "Data: " + response.toString());
if (data.has("picture")) {
boolean is_silhouette = data.getJSONObject("picture").getJSONObject("data").getBoolean("is_silhouette");
if (!is_silhouette) {
//Silhouette is used when the FB user has no upload any profile image
URL profilePicUrl = new URL(data.getJSONObject("picture").getJSONObject("data").getString("url"));
InputStream in = (InputStream) profilePicUrl.getContent();
Bitmap bitmap = BitmapFactory.decodeStream(in);
imageViewProfileFisio.setImageBitmap(bitmap);
}
}
} catch (Exception e) {
e.printStackTrace();
}
} else {
Log.w(TAG, "Response null");
}
}
}
).executeAsync();
}
}
我的示例是使用官方文档创建的: https://developers.facebook.com/docs/graph-api/reference/profile-picture-source/?locale=es_LA
答案 18 :(得分:0)
在我的图表上,由于问号
,api无法正常工作如果您在照片后使用1张婴儿车,那么
picture&type=large
对于两个参数,我们将使用问号
picture?type=large&redirect=false
希望它有帮助!
答案 19 :(得分:0)
我搜索所有模式以在API 15上进行此操作只有这种方法对我来说适用于Volley:
String url = "https://graph.facebook.com/"+ fid +"/picture?type=square";
ImageRequest request = new ImageRequest(url,
new Response.Listener<Bitmap>() {
@Override
public void onResponse(Bitmap bitmap) {
imageView.setImageBitmap(bitmap);
}
}, 0, 0, null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show();
}
});
AppController.getInstance().addToRequestQueue(request);
答案 20 :(得分:0)
一个对我有用的完整解决方案!
import android.app.Dialog;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
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.login.LoginResult;
import com.facebook.login.widget.LoginButton;
import com.facebook.login.widget.ProfilePictureView;
import com.facebook.share.model.ShareLinkContent;
import com.facebook.share.widget.ShareDialog;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
CallbackManager callbackManager;
Button share,details;
ShareDialog shareDialog;
LoginButton login;
ProfilePictureView profile;
Dialog details_dialog;
TextView details_txt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(getApplicationContext());
setContentView(R.layout.activity_main);
callbackManager = CallbackManager.Factory.create();
login = (LoginButton)findViewById(R.id.login_button);
profile = (ProfilePictureView)findViewById(R.id.picture);
shareDialog = new ShareDialog(this);
share = (Button)findViewById(R.id.share);
details = (Button)findViewById(R.id.details);
login.setReadPermissions("public_profile email");
share.setVisibility(View.INVISIBLE);
details.setVisibility(View.INVISIBLE);
details_dialog = new Dialog(this);
details_dialog.setContentView(R.layout.dialog_details);
details_dialog.setTitle("Details");
details_txt = (TextView)details_dialog.findViewById(R.id.details);
details.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
details_dialog.show();
}
});
if(AccessToken.getCurrentAccessToken() != null){
RequestData();
share.setVisibility(View.VISIBLE);
details.setVisibility(View.VISIBLE);
}
login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(AccessToken.getCurrentAccessToken() != null) {
share.setVisibility(View.INVISIBLE);
details.setVisibility(View.INVISIBLE);
profile.setProfileId(null);
}
}
});
share.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
ShareLinkContent content = new ShareLinkContent.Builder().build();
shareDialog.show(content);
}
});
login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
if(AccessToken.getCurrentAccessToken() != null){
RequestData();
share.setVisibility(View.VISIBLE);
details.setVisibility(View.VISIBLE);
}
}
@Override
public void onCancel() {
}
@Override
public void onError(FacebookException exception) {
}
});
}
public void RequestData(){
GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject object,GraphResponse response) {
JSONObject json = response.getJSONObject();
try {
if(json != null){
String text = "<b>Name :</b> "+json.getString("name")+"<br><br><b>Email :</b> "+json.getString("email")+"<br><br><b>Profile link :</b> "+json.getString("link");
details_txt.setText(Html.fromHtml(text));
profile.setProfileId(json.getString("id"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
Bundle parameters = new Bundle();
parameters.putString("fields", "id,name,link,email,picture");
request.setParameters(parameters);
request.executeAsync();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
}
答案 21 :(得分:0)
我这样做了:
从 Facebook 的图片网址获取位图:
String imageUrl = "http://graph.facebook.com/103407310026838/picture?type=large&width=1000&height=1000";
Bitmap bitmap = getFacebookProfilePicture(imageUrl);
位图的功能:
private Bitmap getFacebookProfilePicture(String url){
Bitmap bitmap = null;
HttpGet httpRequest = new HttpGet(URI.create(url));
HttpClient httpclient = new DefaultHttpClient();
HttpResponse mResponse;
try {
mResponse = (HttpResponse) httpclient.execute(httpRequest);
HttpEntity entity = mResponse.getEntity();
BufferedHttpEntity bufHttpEntity = new BufferedHttpEntity(entity);
bitmap = BitmapFactory.decodeStream(bufHttpEntity.getContent());
httpRequest.abort();
}
catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
它完成了。
答案 22 :(得分:0)
网址似乎没问。
问题在于您的连接。 URL.getContent()真的返回流吗?因为如果BitmapFactory变为null,它也会返回null。
试试这个:
Bitmap bitmap = null;
URL url = new URL(http://graph.facebook.com/"+userID+"/picture?type=large);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
bitmap = BitmapFactory.decodeStream(in);
}
finally {
urlConnection.disconnect();
}
答案 23 :(得分:0)
您将获得null,因为对URL.openConnection()(或任何其他获取图像的机制)的调用是异步的。它会在您的行后返回:return bitmap;
。因此位图始终为空。
我建议改为使用回调。
这就是我所做的:
final AQuery androidQuery = new AQuery(this);
AjaxCallback<byte[]> imageCallback = new AjaxCallback<byte[]>() {
@Override
public void callback(String url, byte[] avatar, AjaxStatus status) {
if (avatar != null) {
save(avatar);
} else {
Log.e(TAG, "Cannot fetch third party image. AjaxStatus: " + status.getError());
}
}
};
androidQuery.ajax(imageUrl, byte[].class, imageCallback);
Android查询允许您以不同的格式(例如字节数组,位图等)获取图像。还有其他图书馆,但想法是一样的。
答案 24 :(得分:0)
public static Bitmap getFacebookProfilePicture(String userID)
throws SocketException, SocketTimeoutException,
MalformedURLException, IOException, Exception {
String imageURL;
Bitmap bitmap = null;
imageURL = "http://graph.facebook.com/" + userID
+ "/picture?type=large";
URL url1 = new URL(imageURL);
HttpURLConnection ucon1 = (HttpURLConnection) url1.openConnection();
ucon1.setInstanceFollowRedirects(false);
URL secondURL1 = new URL(ucon1.getHeaderField("Location"));
InputStream in = (InputStream) new URL(imageURL).getContent();
bitmap = BitmapFactory.decodeStream(in);
return bitmap;
}
使用此代码.....
答案 25 :(得分:0)
这可能是你在主线程中运行你的方法 使用
if( android.os.Build.VERSION.SDK_INT > 9 )
{
try
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy( policy );
}
}
答案 26 :(得分:-1)
我使用了这段代码,我得到了个人资料图片,
fbUsrPicURL = "http://graph.facebook.com" + File.separator
+ String.valueOf(fbUID) + File.separator + "picture?type=large";
答案 27 :(得分:-1)
从here
下载源代码添加此依赖项:
compile 'com.facebook.android:facebook-android-sdk:4.0.1'
<强> 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();
}
}