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 gerektirdiizinleri:
<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:
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