6

我一直在尝试解决这一段时间。我想在我的动态壁纸中使用MapView v2,到目前为止,我的结果是底部带有谷歌徽标的黑色屏幕。在动态壁纸中使用谷歌的MapView v2

results

我的清单已经所需的权限:

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

和元数据:

<meta-data 
     android:name="com.google.android.maps.v2.API_KEY" 
     android:value="@string/google_maps_key" /> 

<meta-data 
     android:name="com.google.android.gms.version" 
     android:value="@integer/google_play_services_version" /> 

而且我也试过在其他一些MapView的相关问题,建议将硬件加速:

android:hardwareAccelerated="false" 

而且我可以证实,Maps API密钥的确是正确的,因为我有一个正确呈现(而不是在wallaper服务,但在测试活动)一MapFragment:

MapFragment

WallpaperService.Engine代码:

private class ENGINE extends Engine implements OnMapReadyCallback, 
GoogleMap.SnapshotReadyCallback { 

    private final String LOG_TAG = ENGINE.class.getSimpleName(); 
    private int width = 0; 
    private int height = 0; 
    private SurfaceHolder holder; 
    private boolean visible; 
    private Bitmap bitmap; 

    private final Handler handler = new Handler(); 
    private final Runnable drawRunner = new Runnable() { 
     @Override 
     public void run() { 
      draw(); 
     } 
    }; 

    MapView mapView; 
    GoogleMap map; 
    private static final int FPS = 5000; 

    @Override 
    public void onCreate(SurfaceHolder surfaceHolder) { 
     super.onCreate(surfaceHolder); 
     this.holder = surfaceHolder; 


     this.width = getDesiredMinimumWidth(); 
     this.height = getDesiredMinimumHeight(); 

     int margin = 100; 
     Rect rect = new Rect(); 
     rect.set(margin, margin, width, height); 


     mapView = new MapView(getApplicationContext()); 
     mapView.onCreate(new Bundle()); // could this be the problem? 
     // since onCreate(null) has exact same result 

     int widthSpec = View.MeasureSpec.makeMeasureSpec(rect.width(), View.MeasureSpec.EXACTLY); 
     int heightSpec = View.MeasureSpec.makeMeasureSpec(rect.height(), View.MeasureSpec.EXACTLY); 

     mapView.measure(widthSpec, heightSpec); 
     mapView.layout(0, 0, rect.width(), rect.height()); 


     Log.d(LOG_TAG, "Width: " + mapView.getMeasuredWidth()); 
     Log.d(LOG_TAG, "Height: " + mapView.getMeasuredHeight()); 

     mapView.onResume(); 
     try { 
      MapsInitializer.initialize(getApplicationContext()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     mapView.getMapAsync(this); 
    } 

    public ENGINE() { 
    } 

    @Override 
    public void onVisibilityChanged(boolean visible) { 
     this.visible = visible; 
     if (visible) { 
      handler.post(drawRunner); 
      mapView.onResume(); 
     } else { 
      handler.removeCallbacks(drawRunner); 
      mapView.onPause(); 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mapView.onDestroy(); 
     handler.removeCallbacks(drawRunner); 
    } 

    private void draw() { 
     final Canvas canvas = holder.lockCanvas(); 
     try { 
      if (canvas != null) { 
       if (mapView != null) { 
        mapView.draw(canvas); 
        Log.d(LOG_TAG, "Drawing Map view on the canvas"); 
       } else { 
        Paint paint = new Paint(); 
        paint.setColor(getColor(R.color.colorAccent)); 
        paint.setStyle(Paint.Style.FILL); 
        canvas.drawPaint(paint); 
       } 
      } 
     } finally { 
      if (canvas != null) 
       holder.unlockCanvasAndPost(canvas); 
     } 

     handler.removeCallbacks(drawRunner); 
     if (visible) { 
      handler.postDelayed(drawRunner, FPS); 
     } 
    } 

    @Override 
    public void onSnapshotReady(Bitmap bitmap) { 
     // never reaches here 
     this.bitmap = bitmap; 
     Log.d(LOG_TAG, "Bitmap ready"); 
    } 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     this.map = googleMap; 

     //this.map.setMyLocationEnabled(true); 

     this.map.getUiSettings().setZoomControlsEnabled(true); 
     this.map.getUiSettings().setMyLocationButtonEnabled(true); 
     this.map.getUiSettings().setCompassEnabled(true); 
     this.map.getUiSettings().setRotateGesturesEnabled(false); 
     this.map.getUiSettings().setZoomGesturesEnabled(false); 

     Log.d(LOG_TAG, "Map is ready"); 


     double latitude = 56.875300; 
     double longitude = -76.783658; 


     LatLng marker = new LatLng(latitude, longitude); 
     this.map.addMarker(new MarkerOptions().position(marker).title("Marker Title")); 


     this.map.snapshot(this); 
     // I tried using map's snapshot to render it, however this callback never returns a value 
    } 

} 

logcat中不显示在可能是什么问题

07-14 10:26:39.213 3167-3167/removed.for.privacy I/Google Maps 
Android API: Google Play services package version: 11055440 

07-14 10:26:39.398 3167-3195/removed.for.privacy D/OpenGLRenderer: 
endAllActiveAnimators on 0x75f689e800 (RippleDrawable) with handle 
0x75f65bede0 

07-14 10:27:02.772 3167-3167/removed.for.privacy I/Google Maps 
Android API: Google Play services package version: 11055440 

07-14 10:27:02.838 3167-3167/removed.for.privacy 
D/ENGINE : Width: 980 

07-14 10:27:02.838 3167-3167/removed.for.privacy 
D/ENGINE : Height: 1820 

07-14 10:27:02.867 3167-3167/removed.for.privacy 
D/ENGINE : Map is ready 

07-14 10:27:02.885 3167-3195/removed.for.privacy D/OpenGLRenderer: 
endAllActiveAnimators on 0x75f689ec00 (RippleDrawable) with handle 
0x75e6820020 

07-14 10:27:02.900 3167-3167/removed.for.privacy 
D/ENGINE : Drawing Map view on the canvas 

07-14 10:27:07.955 3167-3167/removed.for.privacy 
D/ENGINE : Drawing Map view on the canvas 
任何错误,也没有任何提示

我知道WallpaperService并不是用于常规用户界面元素,但是可以使用它们,并且我可以成功使用TextView等。这是否是对MapView的有意限制,我打死了一匹死马?谢谢

回答

-2

如果您想拍摄地图,可以使用以下方法。通过定义变量“路径”,您可以保存图片并在其他地方重复使用。 替代方法:您可以在内部保存位图并也可以重新使用它。

public void savePhoto(){ 
    mMap.snapshot(new GoogleMap.SnapshotReadyCallback() { 
     @Override 
     public void onSnapshotReady(Bitmap bitmap) { 
      FileOutputStream out = null; 
      try { 
       out = new FileOutputStream(new File(path), true); 
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); 
      } 
      catch (Exception e) {e.printStackTrace();} 
      finally { 
       try {if (out != null) {out.close();}} 
       catch (IOException e) {e.printStackTrace();} 
       saveForm(isArea, datum, path); 
      } 
     } 
    }); 
} 

它来调用该方法这个方法非常重要OnMapLoadedCallback喜欢:

mMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { 
    @Override 
    public void onMapLoaded() {savePhoto();} 
});