2017-03-03 153 views
14

我想在GOOGLE MAP中移動標記,而gps位置更改就像在UBER應用中一樣。我找到了一些解決方案,但無法解決我的問題。該解決方案是12在谷歌地圖中使用gps移動標記android

下面是我onLocationChange()方法

public void onLocationChanged(Location location) { 

    double lattitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    mLastLocation = location; 
    if (mCurrLocationMarker != null) { 
     mCurrLocationMarker.remove(); 
    } 
    //Place current location marker 
    LatLng latLng = new LatLng(lattitude, longitude); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title("I am here"); 
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); 

    mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 

    tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); 

    //move map camera 
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 

} 

更新1(重新編輯)

更多的瞭解我加入一些代碼,但首先我要告訴我在我的應用程序中使用選項卡。第一個tab是我的地圖。所以我正在使用它的片段。

public class MyLocation extends Fragment implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, 
LocationListener{ 

GoogleMap mGoogleMap; 
SupportMapFragment mapFrag; 
LocationRequest mLocationRequest; 
GoogleApiClient mGoogleApiClient; 
Location mLastLocation; 
Marker mCurrLocationMarker=null; 
TextView tv_loc; 
private static View view; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    if(view != null) 
    { 
     ViewGroup viewGroupParent = (ViewGroup)view.getParent(); 
     if(viewGroupParent !=null) 
     { 
      viewGroupParent.removeView(viewGroupParent); 
     } 
    } 
    try{ 
     view = inflater.inflate(R.layout.my_location,container, false); 
    }catch (Exception e) 
    { 
     /* map is already there, just return view as it is */ 
     return view; 
    } 

    // inflat and return the layout 
    //View rootView = inflater.inflate(R.layout.my_location, container, false); 

    tv_loc = (TextView)view.findViewById(R.id.textView); 
    mapFrag = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map); 
    mapFrag.getMapAsync(this); 

    return view; 

} 

@Override 
public void onPause() { 
    super.onPause(); 

    //stop location updates when Activity is no longer active 
    if(mGoogleApiClient !=null) 
    { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 

} 


@Override 
public void onMapReady(GoogleMap googleMap) { 
    mGoogleMap=googleMap; 
    mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

    //Initialize Google Play Services 
    if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(getActivity(), 
       Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      //Location Permission already granted 
      buildGoogleApiClient(); 
      mGoogleMap.setMyLocationEnabled(true); 
     } else { 
      //Request Location Permission 
      checkLocationPermission(); 
     } 
    } 
    else { 
     buildGoogleApiClient(); 
     mGoogleMap.setMyLocationEnabled(true); 
    } 
} 

protected synchronized void buildGoogleApiClient() { 

    mGoogleApiClient = new GoogleApiClient.Builder(getActivity()) 
      .addConnectionCallbacks(this) 
      .addOnConnectionFailedListener(this) 
      .addApi(LocationServices.API) 
      .build(); 
    mGoogleApiClient.connect(); 
} 

@Override 
public void onConnected(Bundle bundle) { 

    mLocationRequest = new LocationRequest(); 
    mLocationRequest.setInterval(1000); 
    mLocationRequest.setFastestInterval(1000); 
    mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY); 
    if (ContextCompat.checkSelfPermission(getActivity(), 
      Manifest.permission.ACCESS_FINE_LOCATION) 
      == PackageManager.PERMISSION_GRANTED) { 
     LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
    } 

} 

@Override 
public void onConnectionSuspended(int i) { 

} 


@Override 
public void onLocationChanged(Location location) { 

    double lattitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    //Place current location marker 
    LatLng latLng = new LatLng(lattitude, longitude); 


    if(mCurrLocationMarker!=null){ 
     mCurrLocationMarker.setPosition(latLng); 
    }else{ 
     mCurrLocationMarker = mGoogleMap.addMarker(new MarkerOptions() 
       .position(latLng) 
       .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) 
       .title("I am here")); 
    } 

    tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); 
    mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 
    /*double lattitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    mLastLocation = location; 
    if (mCurrLocationMarker != null) { 
     //mGoogleMap.clear(); 
     mCurrLocationMarker.remove(); 
    } 
    //Place current location marker 
    LatLng latLng = new LatLng(lattitude, longitude); 
    MarkerOptions markerOptions = new MarkerOptions(); 
    markerOptions.position(latLng); 
    markerOptions.title("I am here"); 
    markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)).draggable(true); 

    mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 
    mCurrLocationMarker.setPosition(new LatLng(lattitude,longitude)); 

    tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); 

    //move map camera 
    mGoogleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(15)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    }*/ 
} 

public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
private void checkLocationPermission() { 

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), 
       Manifest.permission.ACCESS_FINE_LOCATION)) { 

      // Show an explanation to the user *asynchronously* -- don't block 
      // this thread waiting for the user's response! After the user 
      // sees the explanation, try again to request the permission. 
      new AlertDialog.Builder(getActivity()) 
        .setTitle("Location Permission Needed") 
        .setMessage("This app needs the Location permission, please accept to use location functionality") 
        .setPositiveButton("OK", new DialogInterface.OnClickListener() { 
         @Override 
         public void onClick(DialogInterface dialogInterface, int i) { 
          //Prompt the user once explanation has been shown 
          ActivityCompat.requestPermissions(getActivity(), 
            new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
            MY_PERMISSIONS_REQUEST_LOCATION); 
         } 
        }) 
        .create() 
        .show(); 


     } else { 
      // No explanation needed, we can request the permission. 
      ActivityCompat.requestPermissions(getActivity(), 
        new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 
        MY_PERMISSIONS_REQUEST_LOCATION); 
     } 
    } 
} 


@Override 
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { 

    /*super.onRequestPermissionsResult(requestCode, permissions, grantResults);*/ 
    switch (requestCode) { 
     case MY_PERMISSIONS_REQUEST_LOCATION: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       // permission was granted, yay! Do the 
       // location-related task you need to do. 
       if(ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) 
         == PackageManager.PERMISSION_GRANTED) 
       { 
        if(mGoogleApiClient == null) 
        { 
         buildGoogleApiClient(); 
        } 
        mGoogleMap.setMyLocationEnabled(true); 
       } 

      } else { 
       // permission denied, boo! Disable the 
       // functionality that depends on this permission. 
       //finish(); 
       Toast.makeText(getActivity(), "permission denied", Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 
     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 


@Override 
public void onResume() 
{ 
    super.onResume(); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
public void onLowMemory() { 
    super.onLowMemory(); 
} 


@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 

}} 

任何幫助將高度讚賞

+0

嘗試'mGoogleMap.clear()'代替'mCurrLocationMarker.remove()' –

+0

嘗試過,但沒有用 – faisal1208

+0

快問,哪裏是這種方法嗎?在活動,服務,應用程序中?如果在一個活動中,它會工作,直到你重新開始活動,或者根本不工作?我們需要看到更多的代碼才能真正幫助你。主要是這個方法所在的位置。 –

回答

9

您可以使用下面的代碼來更新標記

public void onLocationChanged(Location location) { 

    double lattitude = location.getLatitude(); 
    double longitude = location.getLongitude(); 

    //Place current location marker 
    LatLng latLng = new LatLng(lattitude, longitude); 


    if(mCurrLocationMarker!=null){ 
     mCurrLocationMarker.setPosition(latLng); 
    }else{ 
     mCurrLocationMarker = mGoogleMap.addMarker(new MarkerOptions() 
           .position(latLng) 
           .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)) 
           .title("I am here"); 
    } 

    tv_loc.append("Lattitude: " + lattitude + " Longitude: " + longitude); 
    gMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 15)); 

    //stop location updates 
    if (mGoogleApiClient != null) { 
     LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this); 
    } 

} 

你並不需要清除每一次地圖的位置。您可以通過將標記添加到地圖時返回的標記對象來完成。 希望它能幫助你。

+0

嘗試了您的代碼,但仍然藍標移動時標記位於同一位置。當它移動時,引腳應該設置在藍色點上 – faisal1208

+0

您可以檢查onLocationChanged事件是否被調用?藍色引腳也是默認映射,它們可以使用不同的邏輯來改變位置。您可以通過硬編碼值來檢查setPostion方法,並檢查位置是否更改。我也嘗試過,它正在改變。 –

+0

'停止位置更新'這停止位置更新,所以我認爲這就是爲什麼標記不移動。這是我的想法可能是我錯了 – faisal1208

2

這可以使用CameraPosition,googleMap.animateCamera和使用線性插值器的標記運動動畫完成。

你可以看看這個教程here和各自的github page

本教程使用谷歌地圖v2。希望這可以幫助。如果你想添加一個新的

private Marker currentPositionMarker = null; 

@Override 
    public void onLocationChanged(Location location) { 

     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(latLng).zoom(14).build(); 

     // mMap.clear(); // Call if You need To Clear Map 
     if (currentPositionMarker == null) 
      currentPositionMarker = mMap.addMarker(new MarkerOptions() 
        .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) 
        .position(latLng) 
        .zIndex(20)); 
     else 
      currentPositionMarker.setPosition(latLng); 


     mMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 
    } 

或:

3

首先在你的活動實施LocationListener的那麼

如果需要只顯示一個標記(標記的更新位置),使用此標記每次:

@Override 
    public void onLocationChanged(Location location) { 

     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     CameraPosition cameraPosition = new CameraPosition.Builder() 
       .target(latLng).zoom(14).build(); 

     mMap.addMarker(new MarkerOptions() 
       .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_YELLOW)) 
       .position(latLng) 
       .zIndex(20)); 

     mMap.animateCamera(CameraUpdateFactory 
       .newCameraPosition(cameraPosition)); 
    } 

如果位置被迅速改變,這將需要幾秒鐘的時間您的應用程序,以更新其位置標記

3

使用本

地圖中的活動

實施LocationListener ,GoogleMap.OnMyLocationChangeListener然後利用位置變化監聽

@Override 
public void onMyLocationChange(Location location) { //mMap.clear //if you want refresh map remove comand 
    // 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); //your_text_view.settext(latitude+","+longtitudde) 

    // Showing the current location in Google Map 
    mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); 
    mMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.destination_marker)).position(latLng).title(maping_status)); 

    // Zoom in the Google Map 
    mMap.animateCamera(CameraUpdateFactory.zoomTo(20)); 
} 
+0

試過了,標記確實會移動,每次移動前一個仍然會顯示,而且我正在使用文本視圖來顯示當前的「緯度」和「經度」。所以文本視圖不斷重複,而前一個仍然存在。 – faisal1208

+0

你使用'mMap.clear()'這樣的標記清除選項。添加上面的代碼之前,從我的位置得到拉長。 –

+0

我希望這會幫助你@ faisal1208 –

2

中序動畫只是調用這個方法(animateMarker)與以前的位置和新的位置以及標記對象

private Marker mCurrentMarker; 
private float ZOOMLEVEL=18.0f; 
private LatLng previousLatLon; 
private Handler mLocalHandler; 
private GoogleMap mGoogleMap; 

public void animateMarker(final Marker marker, final LatLng toPosition,final LatLng fromPosition) { 


     final long duration = 500; 
     final Interpolator interpolator = new LinearInterpolator(); 

     mLocalHandler.post(new Runnable() { 
      @Override 
      public void run() { 
       long elapsed = SystemClock.uptimeMillis() - mStartTime; 
       float t = interpolator.getInterpolation((float) elapsed 
         /duration); 
       marker.setPosition(toPosition); 
       marker.setAnchor(Constants.MAPANCHOR, Constants.MAPANCHOR); 
       mGoogleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(toPosition, ZOOMLEVEL)); 
       if (t < 1.0) { 
        // Post again 16ms later. 
        mLocalHandler.postDelayed(this, 16); 
       } else { 
        marker.setVisible(true); 
       } 
       } 
      } 
     }); 
     previousLatLon=toPosition;// reassign the previous location to current location 
    } 
0

在清單中添加這些行

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

,然後使用這個類

public class MainActivity extends AppCompatActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, LocationListener { 

GoogleMap mgoogleMap; 
GoogleApiClient mgoogleApi; 
Context context; 
Marker marker; 
LocationRequest locationrequest; 
public static final int map=1111; 
public static final int coarse=1112; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    if (googleServiceAvalable()) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     context = getApplicationContext(); 
     checkReadPermission(); 
     checkCoarsePermission(); 
     initMap(); 
    } else { 

    } 

} 
public boolean googleServiceAvalable() { 
    GoogleApiAvailability api = GoogleApiAvailability.getInstance(); 
    int isavailable = api.isGooglePlayServicesAvailable(this); 
    if (isavailable == ConnectionResult.SUCCESS) { 
     return true; 
    } else if (api.isUserResolvableError(isavailable)) { 
     Dialog dialog = api.getErrorDialog(this, isavailable, 0); 
     dialog.show(); 
    } else { 
     Toast.makeText(this, "cant connect to play services", Toast.LENGTH_LONG).show(); 
    } 
    return false; 
} 

private void initMap() { 
    MapFragment mapFragment = (MapFragment) getFragmentManager().findFragmentById(R.id.fragment); 
    mapFragment.getMapAsync(this); 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    mgoogleMap = googleMap; 
    if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){ 
     if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      // TODO: Consider calling 
      // ActivityCompat#requestPermissions 
      // here to request the missing permissions, and then overriding 
      // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
      //           int[] grantResults) 
      // to handle the case where the user grants the permission. See the documentation 
      // for ActivityCompat#requestPermissions for more details. 
      return; 
     } 
    } 
    mgoogleMap.setMyLocationEnabled(true); 

    if(checkCoarsePermission() && checkReadPermission()){ 
     mgoogleApi = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .build(); 

     mgoogleApi.connect(); 
    }else { 
     checkReadPermission(); 
     checkCoarsePermission(); 
    } 
} 

private void goToLocation(double latitude, double longitude, int i) { 
    LatLng ll = new LatLng(latitude, longitude); 
    CameraUpdate update = CameraUpdateFactory.newLatLngZoom(ll, i); 
    mgoogleMap.animateCamera(update); 

    if(marker !=null){ 
     marker.remove(); 
    } 

    MarkerOptions options =new MarkerOptions() 
      .title("Test") 
      .draggable(true) 
      .position(new LatLng(latitude,longitude)); 
    marker= mgoogleMap.addMarker(options); 
} 

@Override 
public void onConnected(@Nullable Bundle bundle) { 
    locationrequest = new LocationRequest().create(); 
    locationrequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
    locationrequest.setInterval(1000); 

    if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
     // TODO: Consider calling 
     // ActivityCompat#requestPermissions 
     // here to request the missing permissions, and then overriding 
     // public void onRequestPermissionsResult(int requestCode, String[] permissions, 
     //           int[] grantResults) 
     // to handle the case where the user grants the permission. See the documentation 
     // for ActivityCompat#requestPermissions for more details. 
     return; 
    } 
    LocationServices.FusedLocationApi.requestLocationUpdates(mgoogleApi, locationrequest, this); 
    Toast.makeText(context,"Location Connected and ready to publish",Toast.LENGTH_SHORT).show(); 
} 

@Override 
public void onConnectionSuspended(int i) { 
    Toast.makeText(context,"Location Connection Suspended",Toast.LENGTH_SHORT); 
} 

@Override 
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { 
    Toast.makeText(context,"Location Connection Failed"+connectionResult.getErrorMessage(),Toast.LENGTH_SHORT); 
} 

@Override 
public void onLocationChanged(Location location) { 
    if(location==null){ 
     Toast.makeText(context,"Cant Find User Location",Toast.LENGTH_SHORT); 
    }else { 
     LatLng ll=new LatLng(location.getLatitude(),location.getLongitude()); 
     goToLocation(ll.latitude,ll.longitude,18); 
    } 
} 

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
public boolean checkReadPermission() { 
    int currentAPIVersion = Build.VERSION.SDK_INT; 
    if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(getApplicationContext(), android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) MainActivity.this, android.Manifest.permission.ACCESS_FINE_LOCATION)) { 
       AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this); 
       alertBuilder.setCancelable(true); 
       alertBuilder.setTitle("Permission necessary"); 
       alertBuilder.setMessage("Read Internal Storage permission required to display images!!!"); 
       alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
        public void onClick(DialogInterface dialog, int which) { 
         ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, map); 
        } 
       }); 
       AlertDialog alert = alertBuilder.create(); 
       alert.show(); 
      } else { 
       ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, map); 
      } 
      return false; 
     } else { 
      return true; 
     } 
    } else { 
     return true; 
    } 
} 

@TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
public boolean checkCoarsePermission() { 
    int currentAPIVersion = Build.VERSION.SDK_INT; 
    if (currentAPIVersion >= android.os.Build.VERSION_CODES.M) { 
     if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      if (ActivityCompat.shouldShowRequestPermissionRationale((Activity) MainActivity.this, android.Manifest.permission.ACCESS_COARSE_LOCATION)) { 
       AlertDialog.Builder alertBuilder = new AlertDialog.Builder(MainActivity.this); 
       alertBuilder.setCancelable(true); 
       alertBuilder.setTitle("Permission necessary"); 
       alertBuilder.setMessage("Read Internal Storage permission required to display images!!!"); 
       alertBuilder.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() { 
        @TargetApi(Build.VERSION_CODES.JELLY_BEAN) 
        public void onClick(DialogInterface dialog, int which) { 
         ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, coarse); 
        } 
       }); 
       AlertDialog alert = alertBuilder.create(); 
       alert.show(); 
      } else { 
       ActivityCompat.requestPermissions((Activity) MainActivity.this, new String[]{android.Manifest.permission.ACCESS_COARSE_LOCATION}, coarse); 
      } 
      return false; 
     } else { 
      return true; 
     } 
    } else { 
     return true; 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, String[] permissions, 
             int[] grantResults) { 
    switch (requestCode) { 
     case map: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      } else { 
       Toast.makeText(context,"You have to give permission",Toast.LENGTH_SHORT).show(); 
      } 
      break; 

     case coarse: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

      } else { 
       Toast.makeText(context,"You have to give permission",Toast.LENGTH_SHORT).show(); 
      } 
      break; 


    } 
}} 
0

如果你仍然在尋找解決方案,希望這個https://www.youtube.com/watch?v=WKfZsCKSXVQ會幫助你。我在其中一個應用中使用了它,它可以幫助將標記從一個位置移動到其他位置。 源代碼可以在這裏抓到https://gist.github.com/broady/6314689

您可能需要將旋轉添加到標記以顯示標記的確切方向。以下是我用來尋找方位的代碼塊。

private float bearingBetweenLatLngs(LatLng begin, LatLng end) { 
     Location beginL = convertLatLngToLocation(begin); 
     Location endL = convertLatLngToLocation(end); 

     return beginL.bearingTo(endL); 
    }