2016-07-17 5 views
1

Ich versuche, ein Bild von Firebase abrufen und dann in Markersymbol hochladen. Basierend auf dem Beispiel aus dem Firebase-Tutorial gelang es mir, das Bild uri abrufen und ich kann setzen, wenn ich die URI in eine Bildansicht bekomme funktioniert es gut, dann habe ich versucht, es in das Symbol der Markierung, aber ich bekomme den Fehler:Bild von Firebase-Speicher in Google Map Marker

D/AndroidRuntime: Shutting down VM 
E/UncaughtException: java.lang.NullPointerException 
         at maps.f.g.a(Unknown Source) 
         at maps.af.g$a.<init>(Unknown Source) 
         at maps.af.g.a(Unknown Source) 
         at maps.af.R.<init>(Unknown Source) 
         at maps.af.t.a(Unknown Source) 
         at vl.onTransact(:com.google.android.gms.DynamiteModulesB:167) 
         at android.os.Binder.transact(Binder.java:380) 
         at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source) 
         at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) 
         at com.htaka.mywall.MapsActivity$3.onSuccess(MapsActivity.java:142) 
         at com.htaka.mywall.MapsActivity$3.onSuccess(MapsActivity.java:137) 
         at com.google.android.gms.tasks.zze$1.run(Unknown Source) 
         at android.os.Handler.handleCallback(Handler.java:739) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:135) 
         at android.app.ActivityThread.main(ActivityThread.java:5421) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 
I/DynamiteModule: Considering local module com.google.android.gms.tagmanager:3 and remote module com.google.android.gms.tagmanager:3 
I/DynamiteModule: Selected local version of com.google.android.gms.tagmanager 
W/GoogleTagManager: Tag Manager's event handler WILL NOT be installed (no container loaded) 
I/GoogleTagManager: Tag Manager initilization took 29ms 
D/FirebaseCrashApiImpl: throwable java.lang.NullPointerException 
E/AndroidRuntime: FATAL EXCEPTION: main 
        Process: com.htaka.mywall, PID: 1013 
        java.lang.NullPointerException 
         at maps.f.g.a(Unknown Source) 
         at maps.af.g$a.<init>(Unknown Source) 
         at maps.af.g.a(Unknown Source) 
         at maps.af.R.<init>(Unknown Source) 
         at maps.af.t.a(Unknown Source) 
         at vl.onTransact(:com.google.android.gms.DynamiteModulesB:167) 
         at android.os.Binder.transact(Binder.java:380) 
         at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addMarker(Unknown Source) 
         at com.google.android.gms.maps.GoogleMap.addMarker(Unknown Source) 
         at com.htaka.mywall.MapsActivity$3.onSuccess(MapsActivity.java:142) 
         at com.htaka.mywall.MapsActivity$3.onSuccess(MapsActivity.java:137) 
         at com.google.android.gms.tasks.zze$1.run(Unknown Source) 
         at android.os.Handler.handleCallback(Handler.java:739) 
         at android.os.Handler.dispatchMessage(Handler.java:95) 
         at android.os.Looper.loop(Looper.java:135) 
         at android.app.ActivityThread.main(ActivityThread.java:5421) 
         at java.lang.reflect.Method.invoke(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:372) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:914) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:707) 
W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 
I/Process: Sending signal. PID: 1013 SIG: 9 
Application terminated. 

ich weiß nicht, was das Problem ist ... das ist der Code mit denen ich arbeite und die Klasse I loadimage verwenden sie es in ein Imageview zu setzen:

public void setMarkers(DataSnapshot dS ,boolean re) { 
     if(re) {mMap.clear();} 

     post = dS.getValue(Post.class); 

     storageRef.child("mountains.jpg").getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() { 
      @Override 
      public void onSuccess(Uri uri) { 
       ImageView im=new ImageView(MapsActivity.this); 
       GlideUtil.loadImage(uri.toString(),im); 
       marker = mMap.addMarker(new MarkerOptions() 
         .position(new LatLng(post.latitude, post.longitude)) 
         .title(post.title) 
         .icon(BitmapDescriptorFactory.fromBitmap(im.getDrawingCache())) 
       ); 

      } 
     }).addOnFailureListener(new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception exception) { 
       System.out.print("image "+exception.getMessage()); 
       marker = mMap.addMarker(new MarkerOptions() 
         .position(new LatLng(post.latitude, post.longitude)) 
         .title(post.title) 
       ); 
      } 
     }); 

PS: falls ich Entfernen Sie das Symbol (BitmapDescriptorFactry ......) die App läuft wie es sollte.

hier ist das loadImage, ich habe es aus dem Beispiel in der Firebase GitHub Abschnitt, ich habe es getestet und es hat funktioniert, Sie senden grundsätzlich uri mit dem Imageview und es lädt es in die Bildansicht, falls jemand interessiert ist: Gradle: kompilieren 'com.github.bumptech.glide: glide: 3.6.0'

public class GlideUtil { 
    public static void loadImage(String url, ImageView imageView) { 
     Context context = imageView.getContext(); 
     ColorDrawable cd = new ColorDrawable(ContextCompat.getColor(context, R.color.wallet_holo_blue_light)); 
     Glide.with(context) 
       .load(url) 
       .placeholder(cd) 
       .crossFade() 
       .centerCrop() 
       .into(imageView); 
    } 

Antwort

0

ich denke, das Problem ist, dass Ihre im.getDrawingCache() Methode null zurück, weil Ihre ImageView noch nicht gemessen worden war, bei der Moment, wenn du es nennst. Anstatt also können Sie versuchen, preload() Methode von Glide mit RequestListener zu verwenden und stellen Sie Ihre geladenen Bitmap als Ikone der Marker:

@Override 
public void onSuccess(Uri uri) { 
    ColorDrawable cd = new ColorDrawable(ContextCompat.getColor(MapsActivity.this, R.color.wallet_holo_blue_light)); 
    Glide.with(MapsActivity.this) 
     .load(uri.toString()) 
     .asBitmap() 
     .listener(new RequestListener<String, Bitmap>() { 
      @Override 
      public boolean onException(Exception e, String model, Target<Bitmap> target, boolean isFirstResource) { 
       return false; 
      } 

      @Override 
      public boolean onResourceReady(Bitmap resource, String model, Target<Bitmap> target, boolean isFromMemoryCache, boolean isFirstResource) { 
       marker = mMap.addMarker(new MarkerOptions() 
        .position(new LatLng(post.latitude, post.longitude)) 
        .title(post.title) 
        .icon(BitmapDescriptorFactory.fromBitmap(resource)) 
       ); 
       return true; 
      } 
     }) 
     .placeholder(cd) 
     .centerCrop() 
     .preload();  
} 
+0

Dank einer Tonne! beste Antwort werde ich bekommen, kopiert und funktioniert wie ein Zauber. –