Reputation: 99
I am developing an app,In this i am using google map to show user current location.The problem is when i open the app first time it shows blue map screen, and now i open the map again 2nd time then at this time map shows correct result with current location.This happen in targetsdkversion>23 and targetsdkversion<23 both the versions.Only the first time dosenot shows the correct map.Following is the code i am using.And how i validate the map whether map shows correct location or not ?
//java
public class Start_Activity1 extends FragmentActivity implements
OnMapReadyCallback,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
GoogleMap.OnMarkerDragListener,
GoogleMap.OnMapLongClickListener,
View.OnClickListener {
//Our Map
private GoogleMap mMap;
public static final int REQUEST_ID_ACCESS_COURSE_FINE_LOCATION = 100;
//To store longitude and latitude from map
private double longitude;
private double latitude;
String caddress;
EditText eddate;
EditText edtime;
EditText seats1 ;
public static TextView tvtime,tvdate;
Button btime,bdate;
//Buttons
private ImageButton buttonSave;
private ImageButton buttonCurrent;
private ImageButton buttonView;
private Button btnProceed, btnskip, btnClocation;
String strAdd, start_point, start_time, no_seats, mob_no, stime, seats;
TextView tvmap,textview;
int mYear, mMonth, mDay, mHour, mMinute;
private boolean loggedIn = false;
public static String email;
public static final int MY_PERMISSIONS_REQUEST_LOCATION = 100;
private ProgressDialog myProgress;
//Google ApiClient
private GoogleApiClient googleApiClient;
SupportMapFragment mapFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
tvmap=(TextView)findViewById(R.id.tv_map);
textview=(TextView)findViewById(R.id.textView_euser);
tvdate=(TextView)findViewById(R.id.textView_sdate);
// tvtime=(TextView)findViewById(R.id.textView_stime);
seats1=(EditText)findViewById(R.id.editText_nseats);
//date and time
// datetime();
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss a", Locale.getDefault());
tvdate.setText(cal.getTime().toLocaleString());
// tvtime.setText(sdf.format(cal.getTime()));
//progress bar
myProgress = new ProgressDialog(this);
myProgress.setTitle("Map Loading ...");
myProgress.setMessage("Please wait...");
myProgress.setCancelable(true);
// Display Progress Bar.
myProgress.show();
// Obtain the SupportMapFragment and get notified when the map is ready to be used.
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
btnProceed=(Button)findViewById(R.id.button_sproceed);
// btnskip=(Button)findViewById(R.id.button_skip);
// btnClocation=(Button)findViewById(R.id.button_clocation);
btnProceed.setOnClickListener(this);
// btnClocation.setOnClickListener(this);
}
@Override
protected void onResume() {
LocationManager mlocManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
boolean enabled = mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
if(!enabled) {
showDialogGPS();
}
super.onResume();
}
private void showDialogGPS() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setCancelable(false);
builder.setTitle("Enable GPS");
builder.setMessage("Please enable GPS");
builder.setInverseBackgroundForced(true);
builder.setPositiveButton("Enable", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
startActivity(
new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
getCurrentLocation();
moveMap();
}
});
builder.setNegativeButton("Ignore", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
}
@Override
public void onClick(View v) {
if(v == btnProceed){
SharedPreferences sharedPreferences = getSharedPreferences(Config.SHARED_PREF_NAME, Context.MODE_PRIVATE);
loggedIn = sharedPreferences.getBoolean(Config.LOGGEDIN_SHARED_PREF, false);
mob_no = sharedPreferences.getString(Config.PHONE_SHARED_PREF, "Not Available");
textview.setText(String.valueOf(mob_no));
// getCurrentLocation();
// moveMap();
if (loggedIn) {
//We will start the Profile Activity
submitForm();
hsubmitForm();
Intent i=new Intent(Start_Activity1.this,Index_Activity.class);
startActivity(i);
// smsForm();
// Toast.makeText(Start_Activity.this, "You Submitted Details Successfully", Toast.LENGTH_LONG).show();
}
}
}
//saving to database
private void submitForm() {
start_point = tvmap.getText().toString();
start_time = tvdate.getText().toString();
no_seats = seats1.getText().toString();
mob_no = textview.getText().toString();
// Toast.makeText(this, "Signing up...", Toast.LENGTH_SHORT).show();
new StartAsync(this).execute(start_point, start_time, no_seats, mob_no);
}
//saving to database
private void hsubmitForm() {
start_point = tvmap.getText().toString();
stime = tvdate.getText().toString();
seats = seats1.getText().toString();
mob_no = textview.getText().toString();
// Toast.makeText(this, "Signing up...", Toast.LENGTH_SHORT).show();
new SHistoryAsync(this).execute(mob_no, start_point, seats, stime);
}
private void smsForm() {
mob_no = textview.getText().toString();
// Toast.makeText(this, "Signing up...", Toast.LENGTH_SHORT).show();
new SmsAsync(this).execute(mob_no);
}
@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(getApplicationInfo().targetSdkVersion>=23) {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// 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.//
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
MY_PERMISSIONS_REQUEST_LOCATION);
return;
}
}
else 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;
}
Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);
if (location != null) {
//Getting longitude and latitude
longitude = location.getLongitude();
latitude = location.getLatitude();
// tvmap.setText("Latitude:" + location.getLatitude() + ", Longitude:" + location.getLongitude());
// strAdd = getCompleteAddressString(latitude, longitude);
// tvmap.setText("Current Address : " + strAdd);
getCompleteAddressString(latitude, longitude);
//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));
}
@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();
myProgress.dismiss();
}
@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();
}
@SuppressLint("LongLogTag")
private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {
String strAdd = "";
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
try {
List<Address> addresses = geocoder.getFromLocation(LATITUDE, LONGITUDE, 1);
if (addresses != null) {
Address returnedAddress = addresses.get(0);
StringBuilder strReturnedAddress = new StringBuilder("Address:");
for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {
strReturnedAddress.append(returnedAddress.getAddressLine(i)).append("\n");
}
strAdd = strReturnedAddress.toString();
tvmap.setText(strAdd);
Log.w("My Current loction address", "" + strReturnedAddress.toString());
} else {
Log.w("My Current loction address", "No Address returned!");
}
} catch (Exception e) {
e.printStackTrace();
Log.w("My Current loction address", "Canont get Address!");
}
return strAdd;
}
@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
// contacts-related task you need to do.
// getCurrentLocation();
// moveMap();
} else {
// permission denied, boo! Disable the
// functionality that depends on this permission.
Toast.makeText(Start_Activity1.this, "Permission denied", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
}
Upvotes: 0
Views: 105
Reputation: 863
the 'blue screen' is the atlantic ocean. it's because the first time the current location is 0,0. Out of this reason you should get the current location before starting the map.
Upvotes: 2