2016-05-25 5 views
0

Я хочу использовать GoogleMap в моем приложении, но при запуске приложения на многих устройств не показывает пустую страницу вместо карты.Google карта показывает пустой

Кактус: enter image description here.

MainActivity коды:

public class MainActivity extends AppCompatActivity implements RoutingListener, GoogleApiClient.OnConnectionFailedListener, GoogleApiClient.ConnectionCallbacks { 
    protected GoogleMap map; 
    protected LatLng start; 
    protected LatLng end; 
    @InjectView(R.id.start) 
    AutoCompleteTextView starting; 
    @InjectView(R.id.destination) 
    AutoCompleteTextView destination; 
    @InjectView(R.id.send) 
    ImageView send; 
    private static final String LOG_TAG = "MyActivity"; 
    protected GoogleApiClient mGoogleApiClient; 
    private PlaceAutoCompleteAdapter mAdapter; 
    private ProgressDialog progressDialog; 
    private List<Polyline> polylines; 
    private static final int[] COLORS = new int[]{R.color.primary_dark,R.color.primary,R.color.primary_light, 
      R.color.accent, R.color.primary_dark_material_light}; 


    private static final LatLngBounds BOUNDS_JAMAICA= new LatLngBounds(new LatLng(-57.965341647205726, 144.9987719580531), 
      new LatLng(72.77492067739843, -9.998857788741589)); 

    /** 
    * This activity loads a map and then displays the route and pushpins on it. 
    */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ButterKnife.inject(this); 
     getSupportActionBar().setDisplayShowHomeEnabled(true); 

     polylines = new ArrayList<>(); 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(Places.GEO_DATA_API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 
     MapsInitializer.initialize(this); 
     mGoogleApiClient.connect(); 

     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 

     if (mapFragment == null) { 
      mapFragment = SupportMapFragment.newInstance(); 
      getSupportFragmentManager().beginTransaction().replace(R.id.map, mapFragment).commit(); 
     } 
     map = mapFragment.getMap(); 

     mAdapter = new PlaceAutoCompleteAdapter(this, android.R.layout.simple_list_item_1, 
       mGoogleApiClient, BOUNDS_JAMAICA, null); 


     /* 
     * Updates the bounds being used by the auto complete adapter based on the position of the 
     * map. 
     * */ 
     map.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() { 
      @Override 
      public void onCameraChange(CameraPosition position) { 
       LatLngBounds bounds = map.getProjection().getVisibleRegion().latLngBounds; 
       mAdapter.setBounds(bounds); 
      } 
     }); 


     CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(18.013610, -77.498803)); 
     CameraUpdate zoom = CameraUpdateFactory.zoomTo(16); 

     map.moveCamera(center); 
     map.animateCamera(zoom); 

     LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 

     locationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, 5000, 0, 
       new LocationListener() { 
        @Override 
        public void onLocationChanged(Location location) { 

         CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(),location.getLongitude())); 
         CameraUpdate zoom = CameraUpdateFactory.zoomTo(16); 

         map.moveCamera(center); 
         map.animateCamera(zoom); 
        } 

        @Override 
        public void onStatusChanged(String provider, int status, Bundle extras) { 

        } 

        @Override 
        public void onProviderEnabled(String provider) { 

        } 

        @Override 
        public void onProviderDisabled(String provider) { 

        } 
       }); 


     locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
       3000, 0, new LocationListener() { 
        @Override 
        public void onLocationChanged(Location location) { 
         CameraUpdate center = CameraUpdateFactory.newLatLng(new LatLng(location.getLatitude(),location.getLongitude())); 
         CameraUpdate zoom = CameraUpdateFactory.zoomTo(16); 

         map.moveCamera(center); 
         map.animateCamera(zoom); 

        } 

        @Override 
        public void onStatusChanged(String provider, int status, Bundle extras) { 

        } 

        @Override 
        public void onProviderEnabled(String provider) { 

        } 

        @Override 
        public void onProviderDisabled(String provider) { 

        } 
       }); 

     /* 
     * Adds auto complete adapter to both auto complete 
     * text views. 
     * */ 
     starting.setAdapter(mAdapter); 
     destination.setAdapter(mAdapter); 


     /* 
     * Sets the start and destination points based on the values selected 
     * from the autocomplete text views. 
     * */ 

     starting.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       final PlaceAutoCompleteAdapter.PlaceAutocomplete item = mAdapter.getItem(position); 
       final String placeId = String.valueOf(item.placeId); 
       Log.i(LOG_TAG, "Autocomplete item selected: " + item.description); 

      /* 
      Issue a request to the Places Geo Data API to retrieve a Place object with additional 
       details about the place. 
       */ 
       PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
         .getPlaceById(mGoogleApiClient, placeId); 
       placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() { 
        @Override 
        public void onResult(PlaceBuffer places) { 
         if (!places.getStatus().isSuccess()) { 
          // Request did not complete successfully 
          Log.e(LOG_TAG, "Place query did not complete. Error: " + places.getStatus().toString()); 
          places.release(); 
          return; 
         } 
         // Get the Place object from the buffer. 
         final Place place = places.get(0); 

         start=place.getLatLng(); 
        } 
       }); 

      } 
     }); 
     destination.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

       final PlaceAutoCompleteAdapter.PlaceAutocomplete item = mAdapter.getItem(position); 
       final String placeId = String.valueOf(item.placeId); 
       Log.i(LOG_TAG, "Autocomplete item selected: " + item.description); 

      /* 
      Issue a request to the Places Geo Data API to retrieve a Place object with additional 
       details about the place. 
       */ 
       PendingResult<PlaceBuffer> placeResult = Places.GeoDataApi 
         .getPlaceById(mGoogleApiClient, placeId); 
       placeResult.setResultCallback(new ResultCallback<PlaceBuffer>() { 
        @Override 
        public void onResult(PlaceBuffer places) { 
         if (!places.getStatus().isSuccess()) { 
          // Request did not complete successfully 
          Log.e(LOG_TAG, "Place query did not complete. Error: " + places.getStatus().toString()); 
          places.release(); 
          return; 
         } 
         // Get the Place object from the buffer. 
         final Place place = places.get(0); 

         end=place.getLatLng(); 
        } 
       }); 

      } 
     }); 

     /* 
     These text watchers set the start and end points to null because once there's 
     * a change after a value has been selected from the dropdown 
     * then the value has to reselected from dropdown to get 
     * the correct location. 
     * */ 
     starting.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int startNum, int before, int count) { 
       if (start != null) { 
        start = null; 
       } 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     destination.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 


       if(end!=null) 
       { 
        end=null; 
       } 
      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

    } 

    @OnClick(R.id.send) 
    public void sendRequest() 
    { 
     if(Util.Operations.isOnline(this)) 
     { 
      route(); 
     } 
     else 
     { 
      Toast.makeText(this,"No internet connectivity",Toast.LENGTH_SHORT).show(); 
     } 
    } 

    public void route() 
    { 
     if(start==null || end==null) 
     { 
      if(start==null) 
      { 
       if(starting.getText().length()>0) 
       { 
        starting.setError("Choose location from dropdown."); 
       } 
       else 
       { 
        Toast.makeText(this,"Please choose a starting point.",Toast.LENGTH_SHORT).show(); 
       } 
      } 
      if(end==null) 
      { 
       if(destination.getText().length()>0) 
       { 
        destination.setError("Choose location from dropdown."); 
       } 
       else 
       { 
        Toast.makeText(this,"Please choose a destination.",Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
     else 
     { 
      progressDialog = ProgressDialog.show(this, "Please wait.", 
        "Fetching route information.", true); 
      Routing routing = new Routing.Builder() 
        .travelMode(AbstractRouting.TravelMode.DRIVING) 
        .withListener(this) 
        .alternativeRoutes(true) 
        .waypoints(start, end) 
        .build(); 
      routing.execute(); 
     } 
    } 


    @Override 
    public void onRoutingFailure(RouteException e) { 
     // The Routing request failed 
     progressDialog.dismiss(); 
     if(e != null) { 
      Toast.makeText(this, "Error: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
     }else { 
      Toast.makeText(this, "Something went wrong, Try again", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    public void onRoutingStart() { 
     // The Routing Request starts 
    } 

    @Override 
    public void onRoutingSuccess(List<Route> route, int shortestRouteIndex) 
    { 
     progressDialog.dismiss(); 
     CameraUpdate center = CameraUpdateFactory.newLatLng(start); 
     CameraUpdate zoom = CameraUpdateFactory.zoomTo(16); 

     map.moveCamera(center); 


     if(polylines.size()>0) { 
      for (Polyline poly : polylines) { 
       poly.remove(); 
      } 
     } 

     polylines = new ArrayList<>(); 
     //add route(s) to the map. 
     for (int i = 0; i <route.size(); i++) { 

      //In case of more than 5 alternative routes 
      int colorIndex = i % COLORS.length; 

      PolylineOptions polyOptions = new PolylineOptions(); 
      polyOptions.color(getResources().getColor(COLORS[colorIndex])); 
      polyOptions.width(10 + i * 3); 
      polyOptions.addAll(route.get(i).getPoints()); 
      Polyline polyline = map.addPolyline(polyOptions); 
      polylines.add(polyline); 

      Toast.makeText(getApplicationContext(),"Route "+ (i+1) +": distance - "+ route.get(i).getDistanceValue()+": duration - "+ route.get(i).getDurationValue(),Toast.LENGTH_SHORT).show(); 
     } 

     // Start marker 
     MarkerOptions options = new MarkerOptions(); 
     options.position(start); 
     options.icon(BitmapDescriptorFactory.fromResource(R.drawable.start_blue)); 
     map.addMarker(options); 

     // End marker 
     options = new MarkerOptions(); 
     options.position(end); 
     options.icon(BitmapDescriptorFactory.fromResource(R.drawable.end_green)); 
     map.addMarker(options); 

    } 

    @Override 
    public void onRoutingCancelled() { 
     Log.i(LOG_TAG, "Routing was cancelled."); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 

     Log.v(LOG_TAG,connectionResult.toString()); 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 

    } 
} 

MainActivity XML:

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

    <fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <android.support.v7.widget.CardView 
     android:id="@+id/cardview" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center_horizontal|bottom" 
     android:layout_marginBottom="20dp" 
     android:layout_marginLeft="20dp" 
     android:layout_marginRight="20dp" 
     android:elevation="100dp" 
     card_view:cardBackgroundColor="@android:color/white" 
     card_view:cardCornerRadius="8dp"> 

     <RelativeLayout 
      android:layout_width="fill_parent" 
      android:layout_height="match_parent" 
      > 

      <LinearLayout 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:orientation="vertical" 
       android:padding="20dp"> 

       <AutoCompleteTextView 
        android:id="@+id/start" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:layout_marginBottom="10dp" 
        android:background="@android:color/transparent" 
        android:hint="Choose a starting point..." /> 

       <View 
        android:layout_width="match_parent" 
        android:layout_height="5dp" 
        android:layout_marginBottom="5dp" 
        android:layout_marginRight="50dp" 
        android:layout_marginTop="5dp" 
        android:background="@drawable/dotted" /> 

       <AutoCompleteTextView 
        android:id="@+id/destination" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:background="@android:color/transparent" 
        android:hint="Choose a destination..." /> 
      </LinearLayout> 
      <ImageView 
       android:id="@+id/send" 
       android:layout_centerVertical="true" 
       android:layout_marginRight="20dp" 
       android:layout_alignParentRight="true" 
       android:layout_width="36dp" 
       android:src="@drawable/ic_send_grey600_48dp" 
       android:layout_height="36dp" /> 

     </RelativeLayout> 
    </android.support.v7.widget.CardView> 
</FrameLayout> 

Manifest:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.directions.sample" > 
    <!-- Copied from Google Maps Library/AndroidManifest.xml. --> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 
    <!-- External storage for caching. --> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <!-- Maps API needs OpenGL ES 2.0. --> 
    <uses-feature 
     android:glEsVersion="0x00020000" 
     android:required="true" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="AIzaSyCXb3CVEfeUQiT7-J-KOvKaqWILPVBkIqg"/> 

Для GeoAPI Я использую Place API.

Как исправить эту проблему?

+0

Вы проверили Logcat, если есть какие-либо ошибки? – HoseinIT

+0

Возможно, вы захотите проверить установленную или не установленную службу Google непосредственно перед началом просмотра карты Google. – HoseinIT

+0

Я думаю, что это неправильный Api Key в Google Console .. проблема только в режиме выпуска? В режиме отладки вы показываете карту? – Cliff

ответ

0

Как я вижу на скриншоте, который вы добавили, похоже, что ваш фрагмент карты уже загружен (отметьте логотип Google в нижнем левом углу). Из-за более медленного интернета, возможно, потребуется много времени для загрузки.

+0

Я жду до 10 минут и не загружаю карту! –

+0

или попробуйте изменить ваш манифест: android: name = "com.google.android.maps.v2.API_KEY" –

+0

Я должен использовать 'android: name =" com.google.android.geo.API_KEY ", потому что i получить имена мест из google –

0
<meta-data 
      android:name="com.google.android.geo.API_KEY" 
      android:value="AIzaSyCXb3CVEfeUQiT7-J-KOvKaqWILPVBkIqg"/> 

попробовать это:

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

Примечание: Как было показано выше, com.google.android.geo.API_KEY является рекомендуется имя метаданных для ключа API. Ключ с этим именем может быть , используемый для аутентификации на нескольких API на основе Google Maps на платформе Android , включая API Android для Google Maps. Для обратной совместимости API также поддерживает имя com.google.android.maps.v2.API_KEY. Это устаревшее имя позволяет использовать аутентификацию для Android Maps API v2. Приложение может указать только одно из имен метаданных ключевых ключей API. Если оба указаны, то API генерирует исключение.

+0

Я должен использовать 'android: name =" com.google.android.geo.API_KEY ", потому что i получить имена мест из google –

+0

Для обратной совместимости API также поддерживает имя com.google.android.maps.v2.API_KEY. – Cliff

Смежные вопросы