Использование Google MapView v2 в Live Wallpaper

Я пытался это решить какое-то время. Я хотел бы использовать MapView v2 с обоими Live, пока мои результаты – черный экран с логотипом google внизу.

Результаты

Мой манифест требует разрешения:

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

Также я могу подтвердить, что ключ карты Api действительно правильный, так как у меня есть MapFragment, который правильно отображается (не в службе wallaper, а в тестовой активности):

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 не предназначен для использования с регулярными элементами интерфейса, однако их можно использовать, и я успешно сделал это с помощью TextViews и т. Д. Является ли это ограничение на MapView целенаправленно, и я избиваю мертвую лошадь? спасибо

В любом случае, вы можете использовать Google Static Maps API для получения изображения обоев (например, как в этом запросе: https://maps.googleapis.com/maps/api/staticmap?center=0,0&zoom=1&scale=1&size=300×500&maptype=roadmap&format = Png & visual_refresh = true ), тогда просто покажите его на обоях (и перезагрузите и обновите экран по таймеру или действию, если вам нужно).

Если вы пытаетесь сделать снимок вашей карты, вы можете использовать следующий метод. Определив переменную «путь», вы можете сохранить изображение и повторно использовать его в другом месте. Альтернатива: вы можете сохранить Bitmap внутренне и повторно использовать его также.

 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();} }); 
Intereting Posts
Является ли одноразовая потеря ссылки на выделенную память для людей с помощью приложения Android большой сделкой? Функция не реализована nodejs xmpp android Как язык ярлыков карт установлен в Google Maps Android API v2 Бинарная строка XML-файла # 2: ошибка раздувания класса <unknown> Остановить или убить службу Каков правильный способ получить данные у поставщика контента, если у вас есть строка uri? Консоль разработчика Android показывает нулевые поддерживаемые устройства Как создать Spinner для использования в качестве элемента действия? Не удалось загрузить новый файл APK в магазин Android Play API Fused Location дает неточный Lat, Long при построении карты на карте, он немного удален от дорожного пути даже для низкой точности Имитирующий навигационный ящик приложения youtube / gmail Эффективное передача данных пользовательских объектов между действиями Android Что представляют собой различные состояния вызовов в стеке телефонии Android? Нарисуйте текст вертикально на холсте Есть ли способ найти, что представляет собой анимация перехода по умолчанию по умолчанию?