理由はわかりませんが、ユーザーのプロフィール写真を取得しようとすると、常にnullになります。アクセスするには特定の許可を設定する必要がありますか?
以下は私の方法です:
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);
Nullになっています。理由はわかりませんか?すべてのヘルプはかなりのものです。
これは動作するはずです:
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」を使用して修正されます。
imageviewの代わりにfacebook ProfilePictureViewを使用します
<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
のサイズをsmall/normal/large/customに設定できます。
Picassoを使用するだけです。 Picasso Libraryを追加してから、次の簡単なラインコードを使用します。
userpicture = (ImageView) row.findViewById(R.id.postuserid);
Picasso.with(context)
.load("https://graph.facebook.com/" + userID+ "/picture?type=large")
.into(userpicture);
プロフィール画像のURLを取得する最良の方法
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.with(this).load(profilePictureUri)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.into(profilePictureView);
これ以上ハードコードされた文字列はありません
現在のプロフィール画像のURLを取得するには、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();
私はそれが役立つことを願っています!
注:2018年3月26日から、手動リンクに関連するすべてのソリューションが機能しなくなりました
公式ガイドはこちら に従う必要があります
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;
}
このURLを使用しているユーザーIDを確認してください
imgurl="https://graph.facebook.com/"+user.getId()+"/picture";
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();
問題は
imageURL = "**http**://graph.facebook.com/"+userID+"/picture?type=large";
https
の代わりにhttp
を使用します
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";
次にPicasso.with(getApplicationContext()).load(imgUrl).into(imageView);
Bundle bundle = new Bundle();
bundle.putString ("fields", "full_picture,message");
new GraphRequest(
AccessToken.getCurrentAccessToken(),
"{page-id}/feed",
bundle,
HttpMethod.GET,
new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
/* handle the result */
Log.e("TAG", response.toString());
}
}
).executeAsync();
new AsyncTask<String, Void, Bitmap>() {
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
try {
String imageURL = "https://graph.facebook.com/" + mFbUserId +"/picture?width=150&width=150";
URL imageURI = new URL(imageURL);
bitmap = BitmapFactory.decodeStream(imageURI.openConnection().getInputStream());
} catch (Exception e) {
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
super.onPostExecute(bitmap);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
}.execute();
グライド の場合:
userId = loginResult.getAccessToken().getUserId();
その後;
Glide.with(this)
.load("https://graph.facebook.com/" + userId+ "/picture?type=large")
.into(imgProfile);
imgUrl = "https://graph.facebook.com/" + user_id + "/picture?type=large";
これを試して
これで解決するはずです。ただし、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);
お役に立てれば
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);
}
}
Facebook APIグラフバージョン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
このようなリクエストを行う場合:
http://graph.facebook.com/103407310026838/picture?type=square&type=large
他のURLへのリダイレクトを行います。
Getリクエストで追加のパラメータを追加する必要があります
redirect=false
このような
http://graph.facebook.com/103407310026838/picture?type=square&type=large&redirect=false
そして、実画像のURLを含む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-> urlで見つかった画像を取得する新しいリクエストを作成します
すべてのモードを検索して、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);
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;
}
このコードを使用します.....
私はこのコードを使用して、プロフィール写真を得ました、
fbUsrPicURL = "http://graph.facebook.com" + File.separator
+ String.valueOf(fbUID) + File.separator + "picture?type=large";
私のグラフでは、疑問符のためにAPIが機能していませんでした
画像の後に1台の乳母車を使用している場合は、
picture&type=large
2つのパラメーターには、疑問符を使用します
picture?type=large&redirect=false
それが役に立てば幸い!
これはおそらく、メインスレッドでメソッドを実行していることでしょう
if( Android.os.Build.VERSION.SDK_INT > 9 )
{
try
{
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy( policy );
}
}
URLは問題ないようです。
そのため、接続に問題があります。 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();
}
URL.openConnection()(または画像を取得するその他のメカニズム)の呼び出しが非同期であるため、nullになります。次の行の後に戻ります:return bitmap;
。したがって、ビットマップは常にnullです。
代わりにコールバックを使用することをお勧めします。
これは私がやったことです:
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クエリを使用すると、さまざまな形式(バイト配列、ビットマップなど)で画像を取得できます。他にもライブラリがありますが、考え方は同じです。
私はこのようにしました:
取得ビットマップからイメージURL of Facebook:
String imageUrl = "http://graph.facebook.com/103407310026838/picture?type=large&width=1000&height=1000";
Bitmap bitmap = getFacebookProfilePicture(imageUrl);
関数 for ビットマップ:
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;
}
終わった。
私のために働いた完全なソリューション!
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);
}
}