Showing current location on android Google Map v2, But app crashes

血红的双手。 提交于 2019-12-02 15:31:44

问题


Here is my Activity code

package com.example1.heartconnect;

import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;

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


public class Maps extends FragmentActivity {

GoogleMap map;

@Override
protected void onCreate(Bundle arg0) {
    // TODO Auto-generated method stub
    super.onCreate(arg0);
    setContentView(R.layout.maps);

    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.gmap)).getMap();
    map.setMyLocationEnabled(true);
    map.setMapType(map.MAP_TYPE_NORMAL);

    Location loc = map.getMyLocation();

    double lat = loc.getLatitude();
    double lon = loc.getLongitude();
    LatLng position = new LatLng(lat, lon);

    Marker marker = map.addMarker(new MarkerOptions()
    .title("Your Location")
    .icon(BitmapDescriptorFactory
         .defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
    .position(position));

    map.moveCamera(CameraUpdateFactory.newLatLngZoom(position, 10));


}
}

This is the XML file

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

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

And this is the Manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example1.heartconnect"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />
<permission
    android:name="com.example1.heartconnect.permission.MAPS_RECEIVE"
    android:protectionLevel="signature" />
<uses-permission android:name="com.example1.heartconnect.permission.MAPS_RECEIVE"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<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-feature
    android:glEsVersion="0x00020000"
    android:required="true"/>

<application
    android:allowBackup="true"
    android:icon="@drawable/heart_connect"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <uses-library android:name="com.google.android.maps" />
    <activity
        android:name="com.example1.heartconnect.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name="MyCircle"></activity>
    <activity android:name="Validate"></activity>
    <activity android:name="DisplayContacts"></activity>
    <activity android:name="Maps"></activity>
    <receiver android:name=".SMSBroadcastReceiver">
        <intent-filter>
            <action android:name="android.provider.telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
    <meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />   
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyDUFZIRGsVVpvJxHvjjoUV4G44-43JTnEw"/>  
</application>

</manifest>

When I remove these 2 lines and provide Latittude & Longitude manually, the app works and I'm able to see the bare Google Map with a marker at that LatLng

double lat = loc.getLatitude();
double lon = loc.getLongitude();

I've also tried to find the current location in following way :

LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);

But the app crashes here too. Plz can anyone suggest me the modifications needed so that I can see my current location on the map... Thnxx in advance :)


回答1:


This is the code for getting current location on the map.

public class ShowMap extends FragmentActivity implements LocationListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_location_map);

        getMap();

  }
  public void getMap(){

      int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getBaseContext());

        // Showing status
        if(status!=ConnectionResult.SUCCESS){ // Google Play Services are not available

            int requestCode = 10;
            Dialog dialog = GooglePlayServicesUtil.getErrorDialog(status, this, requestCode);
            dialog.show();

        }else { // Google Play Services are available

            // Getting reference to the SupportMapFragment of activity_main.xml
            SupportMapFragment fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
            // Getting GoogleMap object from the fragment
            googleMap = fm.getMap();

            // Enabling MyLocation Layer of Google Map
           googleMap.setMyLocationEnabled(true);
        }
    }


   @Override
   public void onLocationChanged(Location location) {
   // Getting latitude of the current location
   double latitude = location.getLatitude();

   // Getting longitude of the current location
   double longitude = location.getLongitude();

   // Creating a LatLng object for the current location
   LatLng latLng = new LatLng(latitude, longitude);

   // Showing the current location in Google Map
   googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

   // Zoom in the Google Map
   googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));


   }

   @Override
   public void onProviderDisabled(String arg0) {
      // TODO Auto-generated method stub

   }

   @Override
   public void onProviderEnabled(String arg0) {
       // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
       // TODO Auto-generated method stub

  }

and you need to import google play store into your project as a library. and add support v4 into your project like Right click your project -> select properties ->java build path -> select Libraries Tab -> click Add External JARs, and give path of your support v4 jar.

I am sure this step will help you.




回答2:


Location loc = map.getMyLocation(); didn't wait for your current location

See the example: http://developer.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/

Also see this: http://developer.android.com/training/location/retrieve-current.html



来源:https://stackoverflow.com/questions/26098791/showing-current-location-on-android-google-map-v2-but-app-crashes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!