【问题标题】:how to fetch image and display in image view from facebook如何从 Facebook 获取图像并在图像视图中显示
【发布时间】:2015-08-17 10:00:59
【问题描述】:
loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            @Override
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    userName.setText("Hello, " + user.getName());

                    Bitmap bitmap1 = getFacebookProfilePicture(user.getId());

                    imgview.setImageBitmap(bitmap1);
                } else {
                    userName.setText("You are not logged");
                }
            }
        });
public Bitmap getFacebookProfilePicture(String userID) {

        try {
            URL imageURL = new URL("https://graph.facebook.com/" + userID
                    + "/picture?type=large");
            bitmap = BitmapFactory.decodeStream(imageURL.openConnection()
                    .getInputStream());

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return bitmap;

    }

这是我的代码,我正在尝试从 Facebook 获取个人资料图片并将其显示在我的应用程序的图像视图上,我可以从 Facebook 获取名称,但是当我输入获取个人资料图片的代码时,我无法获取图片在android中请告诉我哪里做错了给我解决方案如何设置这个代码。

【问题讨论】:

  • 您正在尝试在 UI 线程上发出 HTTP 请求 [getFacebookProfilePicture]... 查看 Logcat 错误

标签: android facebook


【解决方案1】:

使用此方法从Url获​​取Bitmap。

 /**
     * Download image from server url and return bitmap
     *
     * @param stringUrl Imaage download url
     * @return Bitmap receieved from server
     */
    private Bitmap downloadImage(String stringUrl) {
        URL url;
        Bitmap bm = null;
        try {
            url = new URL(stringUrl);
            URLConnection ucon = url.openConnection();
            InputStream is;
            if (ucon instanceof HttpURLConnection) {
                HttpURLConnection httpConn = (HttpURLConnection) ucon;
                int statusCode = httpConn.getResponseCode();
                if (statusCode == 200) {
                    is = httpConn.getInputStream();
                    BitmapFactory.Options options = new BitmapFactory.Options();
                    options.inSampleSize = 8;
                    BufferedInputStream bis = new BufferedInputStream(is, 8192);
                    ByteArrayBuffer baf = new ByteArrayBuffer(1024);
                    int current = 0;
                    while ((current = bis.read()) != -1) {
                        baf.append((byte) current);
                    }
                    byte[] rawImage = baf.toByteArray();
                    bm = BitmapFactory.decodeByteArray(rawImage, 0, rawImage.length);
                    bis.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bm;
    }

像这样将 Facebook 个人资料图片 url 传递给此方法,并将下载的位图设置为 imageview。

 URL imageURL = new URL("https://graph.facebook.com/" + userID
                    + "/picture?type=large");

 imgview.setImageBitmap(downloadImage(imageURL));

希望对你有帮助!

【讨论】:

  • 这已被弃用 我猜新的 SDK 使用了更安全的 GraphAPI
  • 问题是没有从 url 获取头像。这与 GraphAPI 无关
  • 它是完全相关的,因为 URL [ new URL("graph.facebook.com" + userID + "/picture?type=large");] 已经被弃用并且他们使用带有图片的 JSON 响应this { "id": "8169595750129122", "name": "用户名", "picture": { "data": { "is_silhouette": false, "url": "fbcdn-profile-a.akamaihd.net/hprofile-ak-xtp1/v/t1.0-1/p50x50/…" } } }跨度>
  • pastebin.com/qSt8FkVb 看看我的代码哪里做错了,我按照你的回答
  • 请发布生成的网址并尝试在浏览器中打开并检查照片是否显示在浏览器中。
【解决方案2】:

使用回调,它们更容易。 如下创建回调;

private FacebookCallback<LoginResult> callback = new FacebookCallback<LoginResult>() {

    @Override
    public void onSuccess(LoginResult loginResult) {

        GraphRequest request = GraphRequest.newMeRequest(loginResult.getAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
            @Override
            public void onCompleted(JSONObject jsonObject, GraphResponse graphResponse) {
                if(jsonObject != null){
                    try {
                        String name = jsonObject.getString("name");
                        String email = jsonObject.getString("email");
                        String id = jsonObject.getString("id");

                        saveCurrentProfileInfo(id, name, email);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }
        });

        Bundle parameters = new Bundle();
        parameters.putString("fields", "id, email, name");
        request.setParameters(parameters);
        request.executeAsync();
    }

    @Override
    public void onCancel() {
        createSnackBar("Facebook login cancelled");
    }

    @Override
    public void onError(FacebookException e) {
        createSnackBar("Error logging in to Facebook");
    }
};

然后在你的 oncreate 方法上,初始化一个 CallbackManager

CallbackManager callbackManager = CallbackManager.Factory.create();

loginButton.registerCallback(callbackManager, callback);

然后,您可以像以前一样使用检索到的 id 来获取个人资料图片。

【讨论】:

    【解决方案3】:

    假设您获得了正确的访问令牌,更新后的 API 在 JSON 中显示图片字段,如下所示:

    {
    "id": "8169595750129122",
    "name": "A user name",
    "picture": {
        "data": {
            "is_silhouette": false,
            "url": "https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xtp1/v/t1.0-1/p50x50/11150668_881451758563505_2749775492727269008_n.jpg?oh=35239d96bf3a6d34bd455c51218412d9&oe=56487861&__gda__=1446869670_cd2511b71fc9b8809d6b52bdbb451ff0"
        }
      }
    }
    

    如果你想在登录后例如获取图片的url

    LoginButton login_button = (LoginButton) view.findViewById(R.id.login_button);
    
    
        callbackManager = CallbackManager.Factory.create();
        login_button.setFragment(this);
        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
    
                        GraphRequest request = GraphRequest.newMeRequest(
                                AccessToken.getCurrentAccessToken(),
                                new GraphRequest.GraphJSONObjectCallback() {
                                    @Override
                                    public void onCompleted(
                                            JSONObject object,
                                            GraphResponse response) {
                                        try {
    
    
    
     //THIS CONTAINS the URL String displaying it is up to you
    String PROFPIC_URL = object.getJSONObject("picture").getJSONObject("data").getString("url");
    String FIRSTNAME = object.getString("first_name");
    
    
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }
                                    }
                                });
                        Bundle parameters = new Bundle();
                        parameters.putString("fields", "id,name,picture,last_name,first_name");
                        request.setParameters(parameters);
                        request.executeAsync();
                    }
    
                    @Override
                    public void onCancel() {
                        textview.setText("Facebook Login Cancelled");
                    }
    
                    @Override
                    public void onError(FacebookException exception) {
                        textview.setText("Facebook Login Error");
                    }
                });
    

    你可以在这里https://developers.facebook.com/tools/explorer/做价值观实验

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-16
      • 1970-01-01
      相关资源
      最近更新 更多