Skip to main content

How to create google map with drag marker to get user location with auto correct location edit text ...


For drag and drop with user location You have to create a google map fragment activity

below are the xml code of google map xml

<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:app="http://schemas.android.com/apk/res-auto"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".GetUserLocationActivity">


    <fragment        android:id="@+id/mapuserloc"        android:name="com.google.android.gms.maps.SupportMapFragment"        android:layout_width="match_parent"        android:layout_height="522dp"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintStart_toStartOf="parent"        app:layout_constraintTop_toTopOf="parent" />


    <androidx.cardview.widget.CardView        android:id="@+id/idCardView"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_marginStart="16dp"        android:layout_marginTop="18dp"        android:layout_marginEnd="16dp"        app:cardCornerRadius="8dp"        android:elevation="10dp"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintStart_toStartOf="parent"        app:layout_constraintTop_toTopOf="parent">

        <fragment            android:id="@+id/autocomplete_fragment"            android:name="com.google.android.libraries.places.widget.AutocompleteSupportFragment"            android:layout_width="match_parent"            android:layout_height="wrap_content" />

    </androidx.cardview.widget.CardView>

    <androidx.constraintlayout.widget.ConstraintLayout        android:id="@+id/linearLayout2"        android:layout_width="match_parent"        android:layout_height="0dp"        android:elevation="10dp"        android:background="@color/white"        app:layout_constraintBottom_toBottomOf="parent"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintHorizontal_bias="1.0"        app:layout_constraintStart_toStartOf="parent"        app:layout_constraintTop_toBottomOf="@+id/mapuserloc">

        <!--        <TextView-->        <!--            android:id="@+id/textView28"-->        <!--            android:layout_width="match_parent"-->        <!--            android:layout_height="wrap_content"-->        <!--            android:text="TextView" />-->

        <TextView            android:id="@+id/movemarker"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginStart="16dp"            android:layout_marginTop="16dp"            android:layout_marginEnd="16dp"            android:layout_weight="1"            android:fontFamily="@font/lato_medium"            android:padding="3dp"            android:text="MOVE MARKER TO SET LOCATION"            android:textColor="@color/extraLightBlack"            android:textSize="10sp"            app:layout_constraintEnd_toEndOf="parent"            app:layout_constraintHorizontal_bias="0.0"            app:layout_constraintStart_toStartOf="parent"            app:layout_constraintTop_toTopOf="parent" />

        <TextView            android:id="@+id/area"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:layout_marginStart="16dp"            android:fontFamily="@font/lato_heavy"            android:padding="3dp"            android:text="Locating ..."            android:textColor="@color/black"            android:textSize="22sp"            android:textStyle="bold"            app:layout_constraintStart_toStartOf="parent"            app:layout_constraintTop_toBottomOf="@+id/movemarker" />

        <TextView            android:id="@+id/fullAdress"            android:layout_width="0dp"            android:layout_height="wrap_content"            android:layout_marginEnd="16dp"            android:layout_weight="1"            android:fontFamily="@font/lato_regular"            android:padding="3dp"            android:text="..."            android:maxLines="3"            android:ellipsize="end"            android:textColor="@color/mediumBlack"            android:textSize="14sp"            app:layout_constraintEnd_toEndOf="parent"            app:layout_constraintStart_toStartOf="@+id/area"            app:layout_constraintTop_toBottomOf="@+id/area" />

        <Button            android:id="@+id/btn_userloc"            android:layout_width="match_parent"            android:layout_height="50dp"            android:layout_marginStart="16dp"            android:layout_marginEnd="16dp"            android:layout_marginBottom="18dp"            android:background="@drawable/locate_button"            android:text="Confirm Location"            android:textSize="13sp"            app:layout_constraintBottom_toBottomOf="parent"            app:layout_constraintEnd_toEndOf="parent"            app:layout_constraintStart_toStartOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

    <ImageView        android:id="@+id/imageView7"        android:layout_width="32dp"        android:layout_height="35dp"        android:layout_marginBottom="34dp"        app:layout_constraintBottom_toBottomOf="@+id/mapuserloc"        app:layout_constraintEnd_toEndOf="parent"        app:layout_constraintStart_toStartOf="@+id/mapuserloc"        android:contentDescription="shoop look user location image"        app:layout_constraintTop_toTopOf="@+id/mapuserloc"        app:srcCompat="@drawable/ic_placeholder" />


</androidx.constraintlayout.widget.ConstraintLayout>



Then create java class for  it 

like this 

package in.shoplook.shoplookUser;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;


import com.google.android.gms.common.api.Status;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.libraries.places.api.Places;
import com.google.android.libraries.places.api.model.Place;
import com.google.android.libraries.places.api.net.PlacesClient;
import com.google.android.libraries.places.widget.AutocompleteSupportFragment;
import com.google.android.libraries.places.widget.listener.PlaceSelectionListener;


import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;

import im.delight.android.location.SimpleLocation;

public class GetUserLocationActivity extends AppCompatActivity implements OnMapReadyCallback  {

    private GoogleMap mMap;
    View mapView;
    private SimpleLocation location;
    LatLng userLocation;
    Marker currentmarker;
    TextView area, fullAdress;
    String TAG = "GetUserLoca";
    Button btn_userloc;
    Intent intent;
    ShopLook app;
    double platitude , plongitude;

    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_user_location);
        location = new SimpleLocation(this);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.mapuserloc);
        mapView = mapFragment.getView();
        mapFragment.getMapAsync(this);
        app = (ShopLook) getApplication();
        fullAdress = findViewById(R.id.fullAdress);
        area = findViewById(R.id.area);

        // Initialize the AutocompleteSupportFragment.        AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
                getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);
        autocompleteFragment.getView().setBackgroundColor(getResources().getColor(R.color.white));

        btn_userloc  = findViewById(R.id.btn_userloc);
        btn_userloc.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View v) {

                intent = new Intent();
                Log.d(TAG, "onCreatelatLong" + platitude + "longitude"+plongitude);
                app.saveIntoPrefs("User_address" , fullAdress.getText().toString());
                app.saveDoubleIntoPrefs("latitude" , platitude);
                app.saveDoubleIntoPrefs("longitude",plongitude);
                intent.putExtra("fulladdress", fullAdress.getText().toString());
                setResult(300, intent);
                finish();
            }
        });
        Places.initialize(getApplicationContext(), "AIzaSyCapAUHyXfl64wsdoKESgDMIrFCembNeoA");

// Create a new Places client instance        PlacesClient placesClient = Places.createClient(this);
        // Specify the types of place data to return.        autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.LAT_LNG));

// Set up a PlaceSelectionListener to handle the response.        autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
            @Override            public void onPlaceSelected(Place place) {
                // TODO: Get info about the selected place.                LatLng nlatlong = place.getLatLng();
                Log.d(TAG, "onPlaceSelected: " + place.getAddress());

                mMap.clear();

//                mMap.addMarker(new MarkerOptions().position(nlatlong));                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(nlatlong, 16));
                Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());
            }

            @Override            public void onError(Status status) {
                // TODO: Handle the error.                Log.i(TAG, "An error occurred: " + status);
            }
        });

    }


    @Override    public void onMapReady(GoogleMap googleMap) {

        mMap = googleMap;
        mMap.setMyLocationEnabled(true);

//        LatLng sydney = new LatLng(-34, 151);//        mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));//        mMap.moveCamera(CameraUpdateFactory.newLatLng(sydney));
        View locationButton = ((View) mapView.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2"));
        RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams();
// position on right bottom        rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, 0);
        rlp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, RelativeLayout.TRUE);
        rlp.setMargins(0, 1000, 180, 0);
//        if(app.getDoubleFromPrefs("latitude") != 0.0)//        {//            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(app.getDoubleFromPrefs("latitude"), app.getDoubleFromPrefs("longitude")), 15.0f));//        }
            userLocation = new LatLng(location.getLatitude(), location.getLongitude());
            final MarkerOptions curentoption = new MarkerOptions();
            curentoption.position(userLocation).title("your location");
            currentmarker = mMap.addMarker(curentoption);
            currentmarker.setVisible(false);
            if(app.getDoubleFromPrefs("latitude") != 0.0)
            {
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(app.getDoubleFromPrefs("latitude"), app.getDoubleFromPrefs("longitude")), 15.0f));
            }
            else {
                mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(location.getLatitude(), location.getLongitude()), 15.0f));
            }
            mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
                @Override                public void onCameraIdle() {

                    if (currentmarker != null) {
                        LatLng center = mMap.getCameraPosition().target;
                        getAddressFromLocation(center.latitude, center.longitude, GetUserLocationActivity.this, new GeocoderHandler());

                    }

                }
            });

    }

    public static void getAddressFromLocation(final double latitude, final double longitude,
                                              final Context context, final Handler handler) {
        Thread thread = new Thread() {
            @Override            public void run() {
                Geocoder geocoder = new Geocoder(context, Locale.getDefault());
                String result = null;
                String subloc ="";
                try {
                    List<Address> addressList = geocoder.getFromLocation(
                            latitude, longitude, 1);
                    if (addressList != null && addressList.size() > 0) {
                        Address address = addressList.get(0);
                        String TAG = "loc";
                        Log.d(TAG, "run: " + address);
                        StringBuilder sb = new StringBuilder();
                        for (int i = 0; i < address.getMaxAddressLineIndex(); i++) {
                            sb.append(address.getAddressLine(i)).append("\n");
                        }

                        sb.append(address.getAddressLine(0)).append("\n");
                        subloc = address.getSubLocality();
//                        sb.append(address.getLocality()).append("\n");//                        sb.append(address.getPostalCode()).append("\n");//                        sb.append(address.getCountryName());                        result = sb.toString();
                    }
                } catch (IOException e) {
//                    Log.e(TAG, "Unable connect to Geocoder", e);                } finally {
                    Message message = Message.obtain();
                    message.setTarget(handler);
                    if (result != null) {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = result;
                        bundle.putString("address", result);
                        bundle.putString("sublloc", subloc);
                        bundle.putDouble("latitude" , latitude);
                        bundle.putDouble("longitude" , longitude);
                        message.setData(bundle);
                    } else {
                        message.what = 1;
                        Bundle bundle = new Bundle();
                        result = "Latitude: " + latitude + " Longitude: " + longitude +
                                "\n Unable to get address for this lat-long.";
                        bundle.putString("address", result);
                        message.setData(bundle);
                    }
                    message.sendToTarget();
                }
            }
        };
        thread.start();

}

    @Override    public void onBackPressed() {


//        intent = new Intent();//        intent.putExtra("fulladdress", fullAdress.getText().toString());////        setResult(3000, intent);//        finish();        super.onBackPressed();
    }

//    @Override//    public void onTextClear() {////    }
//    @Override//    public void onItemSelected(Place selectedPlace) {////        mMap.clear();//        mMap.addMarker(new MarkerOptions().position(selectedPlace.getLatLng()));//        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(selectedPlace.getLatLng(), 16));//    }
    private class GeocoderHandler extends Handler {
        @Override        public void handleMessage(Message message) {
            String locationAddress;
            String subloc="not found";
//            double latitude = Double.parseDouble(null);//            double longitude = Double.parseDouble(null);            switch (message.what) {
                case 1:
                    Bundle bundle = message.getData();
                    locationAddress = bundle.getString("address");
                    subloc = bundle.getString("sublloc");
                    platitude = bundle.getDouble("latitude");
                    plongitude = bundle.getDouble("longitude");
                    break;
                default:
                    locationAddress = null;
            }
            Log.d(TAG, "handleMessage: "+ locationAddress);
            if(subloc != null) {
                area.setText(subloc);
                fullAdress.setText(locationAddress);
//                platitude = latitude;//                plongitude = longitude;            }
            else{
                area.setText("Locating");
                fullAdress.setText("...");
            }
        }
    }
}

for this you need following depandancy 

below are the depandancy :

implementation 'com.google.code.gson:gson:2.3.1'
implementation 'com.google.android.gms:play-services-maps:17.0.0'
implementation 'com.github.delight-im:Android-SimpleLocation:v1.0.1'
implementation 'com.google.android.gms:play-services-places:17.0.0'implementation 'com.google.android.libraries.places:places:2.0.0'

Popular posts from this blog

How to setup wifi ADB debugger for android studio

How to setup wifi ADB debugger for android studio  Firstly set your adb path Which you can find here Step 1:  Goto your  Android sdk folder -> platform tools  and copy the whole path For example:  C:\Program Files (x86)\Android\android-sdk\platform-tools Step 2:  Goto command prompt or Android studio terminal cd C:\Program Files (x86)\Android\android-sdk\platform-tools and presss enter Step 3:  Connect your device & system with same wifi. Step 4:  Type  adb tcpip 5555  and press  Enter . Step 5:  Type  adb connect x.x.x.x:5555 , replacing the  x.x.x.x  with your phone IP address. find out phone IP address Settings -> About phone -> Status  (some phones may be vary) Note: Incase if you connect more than one devices disconnect other phones except which one you need to connect

create MVVM Architecture Pattern for my android app

Here is an example of how you could implement the MVVM (Model-View-ViewModel) architecture pattern in an Android app using Java: Create a View class, for example MainActivity that extends AppCompatActivity and is responsible for handling user interactions and displaying data to the user. public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; private MainViewModel viewModel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = DataBindingUtil.setContentView(this, R.layout.activity_main); viewModel = new ViewModelProvider(this).get(MainViewModel.class); binding.setViewModel(viewModel); binding.setLifecycleOwner(this); } } } } Create a ViewModel class, for example MainViewModel that extends AndroidViewModel and is responsible for holding and processing the data for the View , as well as handling any business logicy code public cla...