Loller _Toaster Loller _Toaster - 3 months ago 24
Android Question

Android - Why is my Current Location app always return 0 Latitude and 0 Longitude?

The return value whenever i call getCurrentLocation() function is always Latitude: 0.0 and Longitude: 0.0

The Output. The result is also the same as both on the emulator and on the phone.

I used an actual phone and the emulator, both of them still give 0 and 0.

These are in my AndroidManifest.xml



<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.thesis.adrianangub.myapplication" >

<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" />


<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme" >


<!--
The API key for Google Maps-based APIs is defined as a string resource.
(See the file "res/values/google_maps_api.xml").
Note that the API key is linked to the encryption key used to sign the APK.
You need a different API key for each encryption key, including the release key that is used to
sign the APK for publishing.
You can define the keys for the debug and release targets in src/debug/ and src/release/.
-->
<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="@string/google_maps_key" />

<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>


These are in my MapsActivity.java

package com.thesis.adrianangub.myapplication;
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback, GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener, GoogleMap.OnMarkerDragListener, GoogleMap.OnMapLongClickListener, View.OnClickListener
{

//Our Map
private GoogleMap mMap;

//To store longitude and latitude from map
private double longitude;
private double latitude;

//Buttons
private Button buttonSave;
private Button buttonCurrent;
private Button buttonView;

//Google ApiClient
private GoogleApiClient googleApiClient;


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);

//Initializing googleapi client
googleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();

//Initializing views and adding onclick listeners
buttonSave = (Button) findViewById(R.id.buttonSave);
buttonCurrent = (Button) findViewById(R.id.buttonCurrent);
buttonView = (Button) findViewById(R.id.buttonView);
buttonSave.setOnClickListener(this);
buttonCurrent.setOnClickListener(this);
buttonView.setOnClickListener(this);
}

@Override
protected void onStart() {
googleApiClient.connect();
super.onStart();
}

@Override
protected void onStop() {
googleApiClient.disconnect();
super.onStop();
}

//Getting current location
private void getCurrentLocation() {
mMap.clear();
//Creating a location object
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, 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;
}
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();

//moving the map to location
moveMap();
}
}

//Function to move the map
private void moveMap() {
//String to display current latitude and longitude
String msg = latitude + ", "+longitude;

//Creating a LatLng Object to store Coordinates
LatLng latLng = new LatLng(latitude, longitude);

//Adding marker to map
mMap.addMarker(new MarkerOptions()
.position(latLng) //setting position
.draggable(true) //Making the marker draggable
.title("Current Location")); //Adding a title

//Moving the camera
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

//Animating the camera
mMap.animateCamera(CameraUpdateFactory.zoomTo(15));

//Displaying current coordinates in toast
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}

@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
LatLng latLng = new LatLng(-34, 151);
mMap.addMarker(new MarkerOptions().position(latLng).draggable(true));
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.setOnMarkerDragListener(this);
mMap.setOnMapLongClickListener(this);
}

@Override
public void onConnected(Bundle bundle) {
getCurrentLocation();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(ConnectionResult connectionResult) {

}

@Override
public void onMapLongClick(LatLng latLng) {
//Clearing all the markers
mMap.clear();

//Adding a new marker to the current pressed position
mMap.addMarker(new MarkerOptions()
.position(latLng)
.draggable(true));
}

@Override
public void onMarkerDragStart(Marker marker) {

}

@Override
public void onMarkerDrag(Marker marker) {

}

@Override
public void onMarkerDragEnd(Marker marker) {
//Getting the coordinates
latitude = marker.getPosition().latitude;
longitude = marker.getPosition().longitude;

//Moving the map
moveMap();
}

@Override
public void onClick(View v) {
if(v == buttonCurrent){
getCurrentLocation();
moveMap();
}
}


}

And this is my activity_maps.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MapsActivity">

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/map"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.thesis.adrianangub.myapplication.MapsActivity" />

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="bottom"
android:orientation="vertical">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#cc3b60a7"
android:orientation="horizontal">

<Button
android:text="Curr"
android:id="@+id/buttonCurrent"
android:onClick="getCurrentLocation"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="15dp" />

<Button
android:text="Save"
android:id="@+id/buttonSave"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="15dp" />


<Button
android:text="View"
android:id="@+id/buttonView"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_margin="15dp"/>

</LinearLayout>
</LinearLayout>



Answer

You have to request permission for marshmallow device. Refer this docs

While coming to the first activity, add this below code:

put this below two variables to the top of onCreate() method:

  • You can add many number of permissions for marshmallow. Below I have added the five permissions in string array. With the help of this, I am granting permission outside the oncreate method.

  • What are the permissions we are adding in string array, it have to be added in manifest.

    String[] perms = {"android.permission.CAMERA",
            "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE",
             "android.permission.ACCESS_FINE_LOCATION", "android.permission.ACCESS_COARSE_LOCATION"};     
    
    int permsRequestCode = 200;
    

Put this below method inside onCreate() method :

if(canMakeSmores()){

        requestPermissions(perms, permsRequestCode);

    }

Put these below two methods outside onCreate() method:

private boolean canMakeSmores(){

    return(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP_MR1);

}       


 public void onRequestPermissionsResult(int permsRequestCode, String[] permissions, int[] grantResults){

    switch(permsRequestCode){

        case 200:

            if(grantResults.length > 0){

                boolean cameraAccepted = grantResults[0]==PackageManager.PERMISSION_GRANTED;

                if(cameraAccepted){

                }else {
                    requestPermissions(perms, permsRequestCode);
                }

                boolean writeAccepted = grantResults[1]==PackageManager.PERMISSION_GRANTED;

                if(writeAccepted){

                }else {
                    requestPermissions(perms, permsRequestCode);
                }

                boolean readAccepted = grantResults[2]==PackageManager.PERMISSION_GRANTED;

                if(readAccepted){

                }else {
                    requestPermissions(perms, permsRequestCode);
                }

                boolean fineLocationAccepted = grantResults[3]==PackageManager.PERMISSION_GRANTED;

                if(fineLocationAccepted){

                }else {
                    requestPermissions(perms, permsRequestCode);
                }

                boolean coarseLocationAccepted = grantResults[4]==PackageManager.PERMISSION_GRANTED;

                if(coarseLocationAccepted){

                }else {
                    requestPermissions(perms, permsRequestCode);
                }

            }

            break;

    }

}