2015-04-15 5 views
1

В настоящее время я создаю приложение для Android. Я понимаю основы, и я сделал несколько приложений, но теперь мой проект больше. Мое приложение включает в себя несколько экранов с включенным NavigationDrawer, что заставляет меня использовать расширение класса Fragment для каждого класса, который я хочу отобразить в своем приложении. Вот моя проблема - некоторое время назад я создаю приложение простой одностраничный экран карт Google, и он работает отлично. Я хочу сделать то же самое в приложении, в котором я сейчас работаю, но все, что он дает мне, когда я иду на страницу, - это журнал google на нижнем левом экране, а остальное серый, как вид (карта не отображается) .I искал решение во многих местах, включая этот сайт, и я мог получить ответ, так как это может иметь отношение к моему API-ключу, предоставленному мне google.I ckecked, и я уверен, что это не из-за ключа, потому что Я применил его в своем приложении для одной страницы google map, и он работал отлично. У меня также есть все необходимые разрешения. Я проверил это как 6 раз. Итак, мой вывод: в коде есть что-то, что препятствует отображению карты.android google maps issues

Вот мой код:

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentActivity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 

public class guide extends Fragment { 



    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // inflat and return the layout 
     View v = inflater.inflate(R.layout.test, container, 
       false); 

     return v; 
    } 

    class HoldFragmentPlace extends FragmentActivity{ 

     private GoogleMap mMap; 

     public HoldFragmentPlace(){ 

     } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // inflat and return the layout 
     View v = inflater.inflate(R.layout.test, container, 
       false); 

     return v; 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     setUpMapIfNeeded(); 
    } 

    private void setUpMapIfNeeded() { 
     // Do a null check to confirm that we have not already instantiated the map. 
     if (mMap == null) { 
      // Try to obtain the map from the SupportMapFragment. 
      mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
        .getMap(); 
      // Check if we were successful in obtaining the map. 
      if (mMap != null) { 
       setUpMap(); 
      } 
     } 
    } 

     private void setUpMap() { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
     } 


    } 

} 

Мне нужно, что расширение Fragment для моего NavigationDrawer работать, поэтому я создать внутренний класс, и применяется код для карты там.

Вот что я имею в своем манифесте:

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

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission   android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

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

А вот мой XML для карты:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.google.android.gms.maps.MapView 
     android:id="@+id/mapView" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_marginTop="-470dp" /> 

</LinearLayout> 

Я также попробовал несколько других вариантов кода Java некоторые из них не включает внутренний класс, и результат все тот же. Я либо пропущу что-то очень фундаментальное, либо я недопонимаю какую-то концепцию об Android. Если вы прочитали все это, спасибо за потраченное время!

ответ

0

Проверьте подписание APK. Вы должны назначить ключ API отладки при тестировании и ключ API выпуска при выпуске APK. Вставьте правильный ключ API, очистите и перестройте проект.

Я был там год, и я могу заверить, что это была проблема. Дважды проверьте свой ключ, и если это отладочный ключ или релиз.

Еще одна вещь, которую нужно проверить, это имя пакета вашего приложения ... Дайте мне знать, если вы сделали, и все еще получить серый вид вместо

UPDATE:

Я пытался включить все, когда я понял, что ваша проблема только в фазе подписания.

Вам нужно только, чтобы получить SHA-1 отпечатка пальца из отладки и хранилище положить его в Key диалоге API. И поверьте мне, я ничего не могу написать, что может быть более ясным и информативным, чем документация Google.

Выполните действия, описанные в этом link, чтобы получить отладки сертификата и SHA-1 отпечатка пальца.

UPDATE 2:

Для того, чтобы получить SHA-1 из хранилища ключей вы можете проверить это thread.

+0

Я запустил приложение для отладки и получил эту ошибку: – user2961062

+0

04-15 12: 42: 28.960 1961-2088/******************** E/API Android для Google Maps: сбой авторизации. Для правильной настройки карты см. Https://developers.google.com/maps/documentation/android/start. 04-15 12: 42: 28.960 1961-2088/**************** E/API для Google Maps Android: в консоли разработчика Google (https: //console.developers. google.com) Убедитесь, что включен «Google Maps Android API v2». Убедитесь, что существует следующий Android-ключ: Ключ API: ***************** Приложение для Android (; <имя_пакета>): ******* ************************* – user2961062

+0

, а также API Android API для Android: Не удалось загрузить карту. Ошибка при обращении к серверам Google. Вероятно, это проблема аутентификации (но может быть из-за сетевых ошибок). – user2961062

0

Я подозреваю, что какая-то часть недостающую:

(1) Объявляет разрешение на использование MAPS_RECEIVE:

<permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> 
<!-- after declare use this --> 
<uses-permission android:name="com.example.yourpackage.permission.MAPS_RECEIVE"/> 

(2) Отсутствует Объявить GMS версию переменный:

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

(3) API_KEY может возникнуть проблема с генерацией:

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

Пожалуйста, свяжитесь с выше 3 подозреваемых первых: тогда, если все-таки ошибка есть вы можете повторно подтвердить шаги, чтобы включить Google Maps из here

Проверить вещи, связанные с api_key тщательно

0

Вы можете использовать SupportMapFragment для отображения карты в вашем фрагменте.

XML-должен быть изменен на

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 


<fragment 
android:id="@+id/mapView" 
android:layout_marginTop="-470dp" 
class="com.google.android.gms.maps.SupportMapFragment" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/> 

</LinearLayout> 

и ваш класс будет, как показано ниже

public class guide extends Fragment { 

private GoogleMap mMap; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // inflat and return the layout 
    View v = inflater.inflate(R.layout.test, container, false); 

    ((SupportMapFragment) getFragmentManager() 
      .findFragmentById(R.id.mapView)).getMapAsync (new OnMapReadyCallback(){ 
       @Override 
       public void onMapReady(final GoogleMap map) { 
        this.mMap = map; 
        mMap.setMyLocationEnabled(true); 
        setUpMap(); 
       } 
      }); 


    return v; 
} 

private void setUpMap() { 
     mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker")); 
    } 

} 

Примечание: Пожалуйста, обновите ваш Google Play услуги, если вы не находите метод getMapAsync для вашего SupportMapFragment.