【问题标题】:Image from firebase storage into google map marker从 Firebase 存储到谷歌地图标记的图像
【发布时间】:2016-11-20 04:53:02
【问题描述】:

我正在尝试从 firebase 检索图像,然后将其上传到标记图标中。 根据firebase教程中的示例,我成功检索了图像uri,当我将uri放入图像视图时,它工作得很好,然后我尝试将它放入标记的图标中,但我得到了错误:

   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.

我不知道是什么问题...这是我正在使用的代码以及我使用 loadImage 将其设置为 imageview 的类:

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:如果我删除图标(BitmapDescriptorFactry......),应用程序会正常运行。

这是 loadImage,我从 firebase github 部分的示例中得到它,我对其进行了测试并且它工作正常,你基本上将 uri 与 imageview 一起发送并将它加载到 imageview 中,以防有人感兴趣: Gradle : 编译 '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);
    }

【问题讨论】:

    标签: java android google-maps marker firebase-storage


    【解决方案1】:

    我猜问题是你的im.getDrawingCache() 方法返回null,因为你的ImageView 在你调用它的那一刻还没有被测量。因此,您可以尝试将Glidepreload() 方法与RequestListener 一起使用,并将加载的Bitmap 设置为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();    
    }
    

    【讨论】:

    • 非常感谢!最好的答案我会得到,复制它并像魅力一样工作。
    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2018-09-01
    • 2013-07-20
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多