带有 MapFragment 快照的活动

Posted

技术标签:

【中文标题】带有 MapFragment 快照的活动【英文标题】:Activity with MapFragment snapshot 【发布时间】:2015-10-16 06:22:36 【问题描述】:

我有一个 Activity,它在屏幕的一半上包含一个 MapFragment V2,而在另一半有更多的视图,例如带有详细信息的 TextViews。

屏幕是这样的:

现在,我想拍摄整个活动的快照,包括 MapFragment,但是当我尝试这样做时,我确实得到了一张图像,但地图部分是空白的(全黑)!

This is 我用来截屏的代码,效果很好!

我确实知道拍摄 MapFragment 快照的选项,但它只拍摄地图区域而没有屏幕的其余部分。 像这样的:

GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() 

            @Override
            public void onSnapshotReady(Bitmap snapshot) 
                // TODO Auto-generated method stub
                FileOutputStream out = null;
                boolean status = true;
                try 
                    out = new FileOutputStream(sharedImage);
                    snapshot = Bitmap.createScaledBitmap(snapshot, findViewById(R.id.trip_map).getWidth(),
                            findViewById(R.id.trip_map).getHeight(), true);
                    status = snapshot.compress(Bitmap.CompressFormat.JPEG, 100, out);
                    Toast.makeText(TripDetailsActivity.this, "save status: " + status, Toast.LENGTH_SHORT).show();
                    snapshot.recycle();
                    snapshot = null;
                    System.gc();
                 catch (Exception e) 
                    e.printStackTrace();
                 finally 
                    try 
                        out.flush();
                        out.close();
                     catch (Exception e) 
                        e.printStackTrace();
                    

                
                openShareImageDialog(sharedImage);
            
        ;
        mMap.snapshot(callback);

    
    return true;

有没有人知道当那里有 MapFragment 时如何拍摄整个屏幕快照?

【问题讨论】:

AFAIK Google 使用 OpenGL 来渲染地图,并且无法抓取 OpenGL 视图的屏幕截图(GoogleMap 拍摄快照除外)。 【参考方案1】:

在我的情况下试试这个,它对我有用,我知道两者都是一样的,但尝试使用 LinearLayout 作为父级,将所有元素保持在一个父级布局中,并在需要时截屏:

 public void getDrawingBitmap() throws Exception

 LinearLayout tabLayout = (LinearLayout)findViewById(R.id.screen_shot_layout);

    if (tabLayout != null) 

        Bitmap image = Bitmap.createBitmap(tabLayout.getWidth(),
                tabLayout.getHeight(), Config.ARGB_8888);
        Canvas b = new Canvas(image);
        tabLayout.draw(b);
        if (image!=null) 
            // here is your sceenshot
        else
            Toast.makeText(DashBord.this, "Unabel to take screen shot", Toast.LENGTH_LONG).show();
        
    




【讨论】:

谢谢,我会检查一下。 抱歉,这个解决方案对我不起作用。您确定将其与地图片段一起使用吗?你能分享你得到的图像吗?【参考方案2】:

你可以像这样使用谷歌地图回调函数:

GoogleMap.SnapshotReadyCallback callback = new GoogleMap.SnapshotReadyCallback() 
            @Override
            public void onSnapshotReady(Bitmap snapshot) 
                // create bitmap screen capture
                Bitmap bitmap = snapshot;

                OutputStream fout = null;
                File imageFile = new File(filePath);

                try 
                    fout = new FileOutputStream(imageFile);
                    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fout);
                    fout.flush();
                    fout.close();

                 catch (FileNotFoundException e) 
                    e.printStackTrace();
                 catch (IOException e) 
                    e.printStackTrace();
                
            
        ;

现在使用您的 Google 地图片段调用:

map.snapshot(callback);

【讨论】:

以上是关于带有 MapFragment 快照的活动的主要内容,如果未能解决你的问题,请参考以下文章

带有 CameraUpdateFactory.newLatLngBounds 的 moveCamera 崩溃

无法实例化 android.gms.maps.MapFragment

MapFragment 在 getMapAsync(this) 方法中导致 NullPointerException

每当我运行我的片段时,这行代码 mapFragment.setRetainInstance(true);正在崩溃我的应用程序? [关闭]

MapFragment Styled as Dialog 导致 TextView 透明

无法将类型“Android.Support.V4.App.Fragment”转换为“Android.Gms.Maps.MapFragment”