2016-05-26 9 views
1

Ich versuche, ein Facebook-Profilbild in meiner Android App auf dem oberen Teil einer Navigationsschublade zu laden, aber scheinen eine Ausnahme zu bekommen. Ich habe durch Stapelüberläufe gegossen, die erklären, wie man das Bild mit Bitmap, Picasso usw. lädt, aber aus irgendeinem Grund noch nicht geladen werden konnte. Ich glaube, das Problem ist ein Netzwerk-Thread-Problem, aber ich dachte, dass, weil ich die Methode mit .executeAsync() ausführen, dass es keine Rolle spielen würde. Hier ist die xml, wo ich das Bild zu erklären, dass ein Profilbild sein (nav_header_main.xml): bekommen Ausnahmen beim Laden von Facebook Profilbild in Android mit Facebook SDK 4+

<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> 

Hier ist der Ausschnitt aus meiner Tätigkeit, wo ich das Bild anfordern (auf Erfolg von 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(); 
    } 


} 

ich auch diese Hilfsmethode verwenden:

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; 
} 

Hier meine Ausnahme: 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. w/System.err drücken: bei 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: bei java.net.InetAddress.getAllByName (InetAddress.java:215) 05- 26 14: 20: 05.751 11101-11101/com.android.press.press W/System.err: unter com.android.okhttp.HostResolver $ 1.getAllByName (HostResolver.java:29) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: unter com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress (RouteSelector.java:232) 05- 26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: unter 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: bei 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: bei 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: unter com.android.okhttp.internal.http.HttpURLConnectionImpl.execute (HttpURLConnectionImpl.java:373) 05-26 14: 20: 05.752 11101-11101/com. android.pre ss.press W/System.err: unter 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/System .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: bei 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: 0 5.752 11101-11101/com.android.press.press W/System.err: unter 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: um com.facebook.GraphRequest $ 5.run (GraphRequest.java:1379) 05-26 14: 20: 05.752 11101-11101/com.android.press.drücken Sie W/System.err: bei android.os.Handler.handleCallback (Handler.java:739) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: bei android .os.Handler.dispatchMessage (Handler.java:95) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: bei android.os.Looper.loop (Looper. java: 135) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: bei 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 (systemeigene Methode) 05-26 14: 20: 05.752 11101-11101/com. android.press.press W/System.err: at java.lang.reflect.Method.invoke (Methode.java:372) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: at com.android.internal.os.ZygoteInit $ MethodAndArgs Caller.run (ZygoteInit.java:899) 05-26 14: 20: 05.752 11101-11101/com.android.press.press W/System.err: bei com.android.internal.os.ZygoteInit.main (ZygoteInit .java: 694)

Bitte lassen Sie mich wissen, wenn ich etwas falsch mache. Ich habe eine Vielzahl von Quellen versucht, aber das scheint die beliebteste Antwort zu sein. Ich würde die Hilfe sehr schätzen. Vielen Dank im Voraus

Antwort

0

Statt eines Eingangsstroms von unter Verwendung der in dieser Zeile verwendet

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

Sie Picasso Bibliothek zeigen Bilder in Image verwenden sollten, vorbei an der url (ohne Verbindung zu initiieren und ohne mit dem Eingangsstrom, sondern nur mit dem url, die von Facebook) empfangen wurde:

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

als gezeigt in this answer.

Verwandte Themen