6

Bunu bir süredir çözmeye çalışıyorum. Canlı duvar kağıdımı ile bir MapView v2 kullanmak istiyorum. Şimdiye kadar yaptığım sonuçlar altta google logolu siyah bir ekran.Google'ın MapView v2'sini Canlı Duvar Kağıdında Kullanma

Benim tezahür gerektirdi

results

izinleri:

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

ve meta-veriler:

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

Ve ayrıca diğer bazı MapView ilgili sorular önerildiği üzere değişen donanım hızlandırmayı çalıştı:

android:hardwareAccelerated="false" 

Ayrıca ben, haritalar Api anahtarı gerçekten doğru olduğunu teyit edebilir ben (değil wallaper hizmetinde fakat bir test aktivitesinde) Düzgün şekilde oluşturulan bir MapFragment beri:

MapFragment

WallpaperService.Engine kodu :

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 sorunu

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 
ne olabileceğini üzerine herhangi bir hata ne de herhangi bir ipucu göstermez

WallpaperService'nin normal UI öğeleriyle kullanılmak üzere tasarlanmadığını anlıyorum, ancak bunları kullanmak mümkün ve bunu TextViews ve benzeriyle başarılı bir şekilde yaptım. MapView'a bilerek yerleştirilmiş bir sınırlama var mı ve ölü bir atı döverim mi? Teşekkürler

cevap

-2

Haritanızın resmini çekmeye çalışıyorsanız, aşağıdaki yöntemi kullanabilirsiniz. "Yol" değişkenini tanımlayarak, resmi kaydedebilir ve başka bir yerde yeniden kullanabilirsiniz. Alternatif: Bitmap'i dahili olarak kaydedebilir ve ayrıca yeniden kullanabilirsiniz.

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

Onun yönteminden bu yöntemi çağırmak için çok önemli mi OnMapLoadedCallback:

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