简体   繁体   English

使用facebook sdk 4+在Android中加载facebook个人资料图片时遇到异常

[英]getting exceptions when loading facebook profile picture in android with facebook sdk 4+

im trying to load a facebook profile picture in my android app on thee top portion of a navigation drawer, but seem to be getting an exception. 我试图在我的Android应用程序中加载导航抽屉顶部的Facebook个人资料图片,但似乎得到一个例外。 I have poured through stack overflows explaining how to load the image using bitmap, picasso, etc, but have been unable to load it for some reason still. 我已经通过堆栈溢出来解释如何使用位图,毕加索等加载图像,但由于某种原因仍然无法加载它。 I believe the issue is some network thread issue, but i thought that because i execute the method with .executeAsync() that it would not matter. 我认为问题是一些网络线程问题,但我认为,因为我用.executeAsync()执行方法,这没关系。 Here is the xml where i declare the image that is to be a profile picture (nav_header_main.xml): 这是我在xml中声明要成为个人资料图片的图像(nav_header_main.xml):

<de.hdodenhof.circleimageview.CircleImageView
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/profile_image"
    android:layout_width="70dp"
    android:layout_height="70dp"
    android:src="@drawable/hanger_circle"
    app:border_color="#FF000000"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="8dp"/>



</RelativeLayout>

Here is the snippet from my activity where i request the picture (on success of facebook login: 这是我活动的片段,我请求图片(登录成功:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    //initialize facebook sdk
    FacebookSdk.sdkInitialize(getApplicationContext());

    setContentView(R.layout.activity_login);
    //Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    //setSupportActionBar(toolbar);

    //call custom application class to initialize intercom (not login, just setup)
    ApplicationHelper helper = (ApplicationHelper)getApplicationContext();

    //create facebook button recognition
    callbackManager = CallbackManager.Factory.create();
    LoginManager.getInstance().registerCallback(callbackManager,
            new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    //facebook picture stuff
                    Bundle params = new Bundle();
                    params.putString("fields", "id,email,gender,cover,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");
                                                // set profile image to imageview using Picasso or Native methods
                                                Bitmap profilePic = getFacebookProfilePicture(profilePicUrl);
                                                ImageView mImageView = (ImageView) findViewById(R.id.profile_image);
                                                mImageView.setImageBitmap(profilePic);
                                            }
                                        } catch (Exception e) {
                                            e.printStackTrace();
                                        }

                                    }
                                }
                            }).executeAsync();



                    // launch next activity
                    Toast.makeText(getApplicationContext(), "SUCCESS", Toast.LENGTH_SHORT).show();
                    startActivity(new Intent(LoginActivity.this, MainActivity.class));
                    finish();

                }

                @Override
                public void onCancel() {
                    // App code
                    Toast.makeText(getApplicationContext(), "CANCEL", Toast.LENGTH_SHORT).show();

                }

                @Override
                public void onError(FacebookException exception) {
                    // App code
                    Toast.makeText(getApplicationContext(), "FAIL", Toast.LENGTH_SHORT).show();

                }
            });


    //check if facebook user is logged in already
    AccessToken token = AccessToken.getCurrentAccessToken();
    Profile prof = Profile.getCurrentProfile();
    if(token != null && prof != null){
        //log in
        //Toast.makeText(getApplicationContext(), token.getToken(), Toast.LENGTH_SHORT).show();
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
        finish();
    }
    //check if regular user is logged in already
    SharedPreferences shared = getSharedPreferences("shared", MODE_PRIVATE);
    if(shared.contains("username") && shared.contains("password")){
        //password exists in file so launch next activity (make sure there correct with API)
        startActivity(new Intent(LoginActivity.this, MainActivity.class));
        finish();
    }


}

I also use this helper method: 我也使用这个帮助方法:

public static Bitmap getFacebookProfilePicture(String url){
    URL facebookProfileURL= null;
    Bitmap bitmap = null;
    try {
        facebookProfileURL = new URL(url);
        bitmap = BitmapFactory.decodeStream(facebookProfileURL.openConnection().getInputStream());
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return bitmap;
}

Here is my exception: 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: android.os.NetworkOnMainThreadException 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147) 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: at java.net.InetAddress.lookupHostByName(InetAddress.java:418) 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: at java.net.InetAddress.getAllByNameImpl(InetAddress.java:252) 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: at java.net.InetAddress.getAllByName(InetAddress.java:215) 05-26 14:20:05.751 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.HostResolver$1.getAllByName(HostResolver.java:29) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232) 05-26 14:20:05.7 这是我的例外:05-26 14:20:05.751 11101-11101 / com.android.press.press W / System.err:android.os.NetworkOnMainThreadException 05-26 14:20:05.751 11101-11101 / com.android .press.press W / System.err:在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1147)05-26 14:20:05.751 11101-11101 / com.android.press.press W / System。错误:at java.net.InetAddress.lookupHostByName(InetAddress.java:418)05-26 14:20:05.751 11101-11101 / com.android.press.press W / System.err:at java.net.InetAddress.getAllByNameImpl (InetAddress.java:252)05-26 14:20:05.751 11101-11101 / com.android.press.press W / System.err:at java.net.InetAddress.getAllByName(InetAddress.java:215)05-26 14:20:05.751 11101-11101 / com.android.press.press W / System.err:at com.android.okhttp.HostResolver $ 1.getAllByName(HostResolver.java:29)05-26 14:20:05.752 11101- 11101 / com.android.press.press W / System.err:at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:232)05-26 14:20:05.7 52 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190) 05-26 14:20:05.752 11101-11101/com.android.press.press W/Syste 52 11101-11101 / com.android.press.press W / System.err:at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:124)05-26 14:20:05.752 11101-11101 /com.android.press.press W / System.err:at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:272)05-26 14:20:05.752 11101-11101 / com.android .press.press W / System.err:at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System。错误:at com.android.okhttp.internal.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:323)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com .android.okhttp.internal.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:190)05-26 14:20:05.752 11101-11101 / com.android.press.press W / Syste m.err: at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.press.press.LoginActivity.getFacebookProfilePicture(LoginActivity.java:215) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.press.press.LoginActivity$1$1.onCompleted(LoginActivity.java:85) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.facebook.GraphRequest$5.run(GraphRequest.java:1379) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at android.os.Handler.handleCallback(Handler.java:739) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) 05-26 14:20:05 m.err:at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getInputStream(DelegatingHttpsURLConnection.java:210)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:在com.android.okhttp.internal.http.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:25)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.android .press.press.LoginActivity.getFacebookProfilePicture(LoginActivity.java:215)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.android.press.press.LoginActivity $ 1 $ 1.onCompleted(LoginActivity.java:85)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.facebook.GraphRequest $ 5.run(GraphRequest.java: 1379)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at android.os.Handler.handleCallback(Handler.java:739)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at android.os.Handler.dispatchMessage(Handler.java:95)05-26 14:20:05 .752 11101-11101/com.android.press.press W/System.err: at android.os.Looper.loop(Looper.java:135) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at android.app.ActivityThread.main(ActivityThread.java:5221) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at java.lang.reflect.Method.invoke(Native Method) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at java.lang.reflect.Method.invoke(Method.java:372) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 05-26 14:20:05.752 11101-11101/com.android.press.press W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) .752 11101-11101 / com.android.press.press W / System.err:at android.os.Looper.loop(Looper.java:135)05-26 14:20:05.752 11101-11101 / com.android。 press.press W / System.err:在android.app.ActivityThread.main(ActivityThread.java:5221)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at java.lang.reflect.Method.invoke(Native Method)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at java.lang.reflect.Method.invoke(Method .java:372)05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:899 )05-26 14:20:05.752 11101-11101 / com.android.press.press W / System.err:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

Please let me know if im doing something wrong.I have tried a variety of sources but this seems to be the most popular answer. 如果我做错了,请告诉我。我尝试了各种各样的来源,但这似乎是最受欢迎的答案。 I would greatly appreciate the help. 我非常感谢你的帮助。 Thanks in advance 提前致谢

Instead of using an input stream as used in this line 而不是使用此行中使用的输入流

bitmap = BitmapFactory.decodeStream(facebookProfileURL.openConnection().getInputStream());

You should use Picasso Library to show images in ImageView, passing the url (without initiating any connection and without using the input stream, but only using the url that was received from Facebook): 你应该使用Picasso Library在ImageView中显示图像,传递url (不启动任何连接而不使用输入流,但只使用从Facebook收到的url ):

Picasso.with(this).load(/* url of image */).into(/*your imageview id*/);

as shown in this answer . 这个答案所示。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM