2017-11-25 20 views
0
public class MapsActivity extends AppCompatActivity 
     implements OnMapReadyCallback, 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener { 

    public static final int MY_PERMISSIONS_REQUEST_LOCATION = 99; 
    GoogleMap mGoogleMap; 
    SupportMapFragment mapFrag; 
    LocationRequest mLocationRequest; 
    GoogleApiClient mGoogleApiClient; 
    Location mLastLocation; 
    Marker mCurrLocationMarker; 
    MarkerOptions markerOptions; 
    EditText ed_place; 
    Button btn_getLocation; 
    Geocoder geocoder; 
    List<Address> addresses; 
    double lat, lng; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     ed_place = findViewById(R.id.ed_place); 
     btn_getLocation = findViewById(R.id.btn_getLocation); 
     getSupportActionBar().setTitle("Map Location Activity"); 

     mapFrag = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map); 
     mapFrag.getMapAsync(this); 
     geocoder = new Geocoder(this, Locale.getDefault()); 


    } 

    @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 (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(this, 
        android.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); 
     } 
     btn_getLocation.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       try { 
        addresses = geocoder.getFromLocationName(ed_place.getText().toString(), 1); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       if (addresses == null) { 
        Toast.makeText(getApplicationContext(), "Invalid address", Toast.LENGTH_SHORT).show(); 
       } else { 
        mGoogleMap.clear(); 
        lat = addresses.get(0).getLatitude(); 
        lng = addresses.get(0).getLongitude(); 
        LatLng position = new LatLng(lat, lng); 
        markerOptions = new MarkerOptions(); 
        markerOptions.position(position); 
        markerOptions.snippet("Latitude" + lat + "Longitude" + lng); 
        mGoogleMap.addMarker(markerOptions); 
        CameraUpdate updatePosition = CameraUpdateFactory.newLatLng(position); 
        mGoogleMap.moveCamera(updatePosition); 
        Toast.makeText(getApplicationContext(), lat + " :" + lng, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 

    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .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(this, 
       android.Manifest.permission.ACCESS_FINE_LOCATION) 
       == PackageManager.PERMISSION_GRANTED) { 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     mLastLocation = location; 
     if (mCurrLocationMarker != null) { 
      mCurrLocationMarker.remove(); 
     } 

     //Place current location marker 
     LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); 
     MarkerOptions markerOptions = new MarkerOptions(); 
     markerOptions.position(latLng); 
     markerOptions.title("Current Position"); 
     markerOptions.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)); 
     mCurrLocationMarker = mGoogleMap.addMarker(markerOptions); 

     //move map camera 
     mGoogleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 11)); 

    } 

    private void checkLocationPermission() { 
     if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) 
       != PackageManager.PERMISSION_GRANTED) { 

      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(this, 
        android.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(this) 
         .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(MapsActivity.this, 
             new String[]{android.Manifest.permission.ACCESS_FINE_LOCATION}, 
             MY_PERMISSIONS_REQUEST_LOCATION); 
          } 
         }) 
         .create() 
         .show(); 


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

    @Override 
    public void onRequestPermissionsResult(int requestCode, 
              String permissions[], int[] 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(this, 
          android.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. 
        Toast.makeText(this, "permission denied", Toast.LENGTH_LONG).show(); 
       } 
       return; 
      } 

     } 
    } 

} 

내지도 활동입니다. 위치 정보의 위도와 경도를 얻기 위해 지오 코딩을 사용합니다. 잘못된 위치 앱을 검색 할 때 충돌이 발생합니다. 잘못된 위치를 검색 할 때 오류 메시지를 설정하는 방법지도 활동에서 잘못된 위치를 검색 할 때 오류 메시지를 설정하는 방법

답변

0

사용이 코드가 작동

try { 
      Geocoder geoCoder = new Geocoder(this); 
      List<Address> matches = geoCoder.getFromLocation(lat, lng, 1); 
      Address bestMatch = (matches.isEmpty() ? null : matches.get(0)); 

      if (bestMatch != null) { 

       LatLng ltlng= new LatLng(bestMatch.getLatitude(),bestMatch.getLongitude()); 
       Searchmarker = mMap.addMarker(new MarkerOptions().position(ltlng)); 
       mMap.animateCamera(CameraUpdateFactory.newLatLng(ltlng)); 
      } else { 
       Toast.makeText(this, "No result found", Toast.LENGTH_LONG).show(); 
      } 
     }catch (Exception e){ 
      Toast.makeText(this, "Error search :- Wrong input", Toast.LENGTH_LONG).show(); 
     } 
+0

. 감사합니다 Ankesh :) –

0

예. Google지도에서 잘못된 위치를 검색하려고 할 때마다 발생합니다. 지오 코더를 사용하여 장소를 검색하는 코드를 넣고 블록을 잡아 예외를 처리하고 잘못된 검색을 위해 메시지를 표시 할 수 있습니다.