app crashes when intent passes variable to another activity - java

i am making a app that tracks the user and tracks another user which in theory would be an animal.
my app goes like this, you register a username and pass then when this is done the user can log into the map by reentering the correct username and password. This is where the issues begin.
upon creation of the screen the map loads with the users current location and auto sends a sms to the "animals" phone to request gps details, this then sends back 2 sms messages, 1 containing the gps information. i have a SmsReceiver class which reads this information and extracts the longitude and latitude data, converts it into a double then passes it to the map activity to be converted into a lnglat variable and displayed on the google map with a marker. Now the issue i am having is that it can take several minutes for the sms to return with the gps information, when this is done and the intent is used to send the coordinates to the map page a button must be clicked so that the longitude and latitude are combined into the AnimalCoordinate and the marker is shown, however because og the time gap its imposible to press the button at the same time the sms is retrieved and it causes a crash as the data is being sent from the smsreceiver class to nothing on the other side, and if i take the intent out of the onclick method the same thing happens but in reverse, the map runs the intent but the informaion is not there yet and it crashes.
any help would be greatly appreciated as this has been a nightmare.
i am also sorry if i overcomplicated the explanation, i wanted to ake sure it was explained as best i could.
the code is below for the two classes.
Map class
public class MainScreen extends FragmentActivity implements LocationListener {
private GoogleMap map;
private LocationManager locationManager;
private String provider;
final Context context = this;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_screen);
map = ((SupportMapFragment)getSupportFragmentManager().
findFragmentById(R.id.map)).getMap();
LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
boolean enabledGPS = service
.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean enabledWiFi = service
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
// Check if enabled and if not send user to the GSP settings
if (!enabledGPS) {
Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show();
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Define the criteria how to select the locatioin provider -> use
// default
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
// Initialize the location fields
if (location != null) {
Toast.makeText(this, "Selected Provider " + provider,
Toast.LENGTH_SHORT).show();
onLocationChanged(location);
} else {
//do something
}
// Sets the map type to be "hybrid"
map.setMapType(GoogleMap.MAP_TYPE_HYBRID);
Bundle b = getIntent().getExtras();
double lat = location.getLatitude();
double lng = location.getLongitude();
Toast.makeText(this, "Location " + lat+","+lng,
Toast.LENGTH_LONG).show();
LatLng Usercoordinate = new LatLng(lat, lng);
Marker User = map.addMarker(new MarkerOptions()
.position(Usercoordinate)
.title("You are here")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
//Move the camera instantly to user with a zoom of 15.
map.moveCamera(CameraUpdateFactory.newLatLngZoom(Usercoordinate, 15));
// Zoom in, animating the camera.
map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null);
//Sends sms to 'animal phone'
String phoneNo = "***********";
String sms = "GPSLocation";
try {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, sms, null, null);
Toast.makeText(getApplicationContext(), "SMS Sent!",
Toast.LENGTH_LONG).show();
} catch (Exception e) {
Toast.makeText(getApplicationContext(),
"SMS faild, please try again later!",
Toast.LENGTH_LONG).show();
e.printStackTrace();
}
}
public void map_help(View view) {
//method for the help button
AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
context);
// set title
alertDialogBuilder.setTitle("Help");
// set dialog message
alertDialogBuilder
.setMessage("Click the 'Pet' button to display the pets location." +
"This can take a few minutes to retrieve.")
.setCancelable(false)
.setPositiveButton("ok",new DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int id) {
// if this button is clicked, close
// current activity
dialog.cancel();
}
});
// create alert dialog
AlertDialog alertDialog = alertDialogBuilder.create();
// show it
alertDialog.show();
};
public void Find_Pet(View view)
{
//String phoneNo = "07516909014";
// String sms = "GPSLocation";
// try {
// SmsManager smsManager = SmsManager.getDefault();
//smsManager.sendTextMessage(phoneNo, null, sms, null, null);
//Toast.makeText(getApplicationContext(), "SMS Sent!",
// Toast.LENGTH_LONG).show();
// } catch (Exception e) {
// Toast.makeText(getApplicationContext(),
// "SMS faild, please try again later!",
//Toast.LENGTH_LONG).show();
// e.printStackTrace();
//}
}
public void Show_Pet(View view)
{
//gets coordinates from SmsReceiver
Bundle b = getIntent().getExtras();
double AnimalLat = b.getDouble("key");
Bundle d = getIntent().getExtras();
double AnimalLon = d.getDouble("key1");
LatLng Animalcoordinate = new LatLng(AnimalLat, AnimalLon);
//adds pets marker on map
Marker Animal = map.addMarker(new MarkerOptions()
.position(Animalcoordinate)
.title("Your pet is here")
.icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
}
/* Request updates at startup */
#Override
protected void onResume() {
super.onResume();
locationManager.requestLocationUpdates(provider, 400, 1, this);
}
/* Remove the locationlistener updates when Activity is paused */
#Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
#Override
public void onLocationChanged(Location location) {
}
#Override
public void onProviderDisabled(String provider) {
Toast.makeText(this, "Enabled new provider " + provider,
Toast.LENGTH_SHORT).show();
}
#Override
public void onProviderEnabled(String provider) {
Toast.makeText(this, "Disabled provider " + provider,
Toast.LENGTH_SHORT).show();
}
#Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
SmsReceiver class
public class SmsReceiver extends BroadcastReceiver
{
String lat = null;
String lon = null;
String message = null;
final SmsReceiver context = this;
#Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message passed in---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += msgs[i].getMessageBody().toString();
}}
message = str.toString();
String[] test = message.split("");
char[] test2 = test[1].toCharArray();
//if the first character of the sms is C then read gps information
if (test2[0] == 'C' || test2[0] =='c')
{
lat = message.substring(45, 56);
lon = message.substring(67, 78);
double AnimalLat=Double.parseDouble(lat);
double AnimalLon=Double.parseDouble(lon);
//Pass coordinates to MainScreen
Intent a = new Intent(getApplicationContext(), MainScreen.class);
Bundle b = new Bundle();
b.putDouble("key", AnimalLat);
a.putExtras(b);
startActivity(a);
Intent c = new Intent(getApplicationContext(), MainScreen.class);
Bundle d = new Bundle();
d.putDouble("key1", AnimalLon);
c.putExtras(d);
startActivity(c);
}else {
}
}
private void startActivity(Intent a) {
// TODO Auto-generated method stub
}
private Context getApplicationContext() {
// TODO Auto-generated method stub
return null;
}}
I also want to apologize for the layout of the code, this is the first time i have pasted code on this site.
Thanks again.

To be honest, I'm not sure which Button you are talking. The only one I saw was in the AlertDialog unless I missed something. Anyway, you can disable your Button until whatever data has a value or you can do nothing in the onClick() if it is null
//inside your Button
if (data != null)
{
...do stuff in here
}
If you need more clarification then please indicate in the code the data you are talking about and the Button but I think you get the idea.

Related

The app crashed after sending location to server Android Java

I am able to send the location (String address) + messages to my server; however, my app crashed after sending data to server. I used Volley library to make a POST request. Can someone help me fix this issue?
First I get the location and the list of the address.
public class MainActivity extends AppCompatActivity {
//Declare LocationManager and LocationListener
LocationManager locationManager;
LocationListener locationListener;
String address = "Unable to get the address!";
EditText Message;
AlertDialog.Builder builder;
String server_url ="https://schoolserver-tand089.c9users.io/Report.php";
//Process when users give the permission
#Override
public void onRequestPermissionsResult(int requestCode, #NonNull String[] permissions, #NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
//Start the location service
startListening();
}
}
//Checking permission granted method
public void startListening() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
}
}
//Update location method. 1 variable location
public void updatedLocationInfo(Location location) {
Log.i ("Location", location.toString());
//Cast the textViews
TextView latTextView = (TextView) findViewById(R.id.txtLat);
TextView lonTextView = (TextView) findViewById(R.id.txtLong);
TextView altTextView = (TextView) findViewById(R.id.txtAltitude);
TextView accTextView = (TextView) findViewById(R.id.txtAccuracy);
//get the string from location
latTextView.setText("Latitude: " + location.getLatitude());
lonTextView.setText("Longitude: " + location.getLongitude());
altTextView.setText("Altitude: " + location.getAltitude());
accTextView.setText("Accuracy: " + location.getAccuracy());
//Create Geocoder object to Get the address
Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault());
//Using try/catch to prevent the app from crashing when failing to get Addresses
try {
//Declare the error string
//String address = "Unable to get the address!";
List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
//Check if the address is valid
if (listAddresses != null && listAddresses.size() > 0) {
//Set address to empty string again when we know it is working
address = "Address: \n";
// Log.i("Address", listAddresses.get(0).toString());
//check for every item in the list Addresses is valid
if (listAddresses.get(0).getSubThoroughfare() != null) {
address += listAddresses.get(0).getSubThoroughfare() + " ";
}
//Street name
if (listAddresses.get(0).getThoroughfare() != null) {
address += listAddresses.get(0).getThoroughfare() + "\n";
}
//City name
if (listAddresses.get(0).getLocality() != null) {
address += listAddresses.get(0).getLocality() + "\n";
}
//Zip code
if (listAddresses.get(0).getPostalCode() != null) {
address += listAddresses.get(0).getPostalCode() + "\n";
}
//Country name
if (listAddresses.get(0).getCountryName() != null) {
address += listAddresses.get(0).getCountryName() + "\n";
}
TextView addressTextView = (TextView) findViewById(R.id.txtAddress);
//set the address into the text View
addressTextView.setText(address);
//Log.i("Address", address.toString());
}
} catch (IOException e) {
e.printStackTrace();
}
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//set up locationManager and locationListener above and cast them into their type
//Using built-in location service
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener() {
//Get the location when it changes
#Override
public void onLocationChanged(Location location) {
//call the updated location above
updatedLocationInfo(location);
}
//
#Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
#Override
public void onProviderEnabled(String provider) {
}
#Override
public void onProviderDisabled(String provider) {
}
};
//Check for the version of SDK
if (Build.VERSION.SDK_INT < 23) {
startListening();
} else {
// above 23 we need to check for permission
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
//ask for permission. Number 1 is just a request queue.
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 1);
}
//we have permission
else {
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
//Get the last location from the built-in GPS
Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
//In case location does not have lastknownlocation, we call the updatedLocation method above
if (location != null) {
updatedLocationInfo(location);
}
}
}
}
Next, I used the onClick method to send the Address and a message to server when user clicks the button.
// using onClick
public void bntTap (View bnt) {
Message = (EditText) findViewById(R.id.message);
//Hide virtual keyboard after click the button
InputMethodManager inputManager = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),
InputMethodManager.HIDE_NOT_ALWAYS);
final String message;
message = Message.getText().toString();
if (message.equals("")) {
builder.setTitle("Unable to report");
//Creating a AlertDialog to display errors
AlertDialog alertDialog = builder.create();
alertDialog.setMessage("Please Enter All Required Fields*");
alertDialog.show();
} else {
//Post request
StringRequest stringRequest = new StringRequest(Request.Method.POST, server_url,
new Response.Listener<String>() {
#Override
public void onResponse(String response) {
//get response form server to check if it is successfully submitted
builder.setTitle("Server Response");
builder.setMessage("Congratulation" + " " + response);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int which) {
Message.setText("");
}
});
AlertDialog alertDialog = builder.create();
alertDialog.show();
}
},
new Response.ErrorListener() {
#Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(MainActivity.this, "Error!!!", Toast.LENGTH_SHORT).show();
error.printStackTrace();
}
}) {
#Override
protected Map<String, String> getParams() throws AuthFailureError {
Map<String, String> params = new HashMap<String, String>();
//send data to mySQL server
//the keys must be same as field names in mySQL server
// get the list of the address
params.put("LOCATION", address);
params.put("MESSAGES", message);
return params;
}
};
MySingleton.getInstance(MainActivity.this).addTorequestqueue(stringRequest);
//Log.i("Address", address.toString());
}
}
All the data successfully sent to the server, but the app crashed.
Updated: logcat when crashing
logcat when crashing
You are getting an NPE, as you forgot to define builder. You have only declared it in your code as
AlertDialog.Builder builder;
Please define the builder as
builder = new AlertDialog.Builder(MainActivity.this);
in your onCreate().

how to get string from user and save it?

I found a project in github about location tracker.and I want to change it.
How do it work?
You install this application in your device.
and from another device you send a message to your device (your message must be Where are you?)(that device that you installed application before). when you send this message , after 1 minutes you receive a link that show the current location.
https://github.com/quentin7b/android-location-tracker(link of project)
Now I want to send any message . not limited to send just where are you?
Now I want to get string from user to save and then compare then IF there are equal send the location link.
In this activity I must get string to save.
here is the code:
public class LocationTrackerActivity extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
and here :
public class SMSReceiver extends BroadcastReceiver
{
LocationManager lm;
LocationListener locationListener;
String senderTel;
#Override
public void onReceive(Context context, Intent intent)
{
//---get the SMS message that was received---
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str="";
if (bundle != null)
{
senderTel = "";
//---retrieve the SMS message received---
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i<msgs.length; i++){
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
if (i==0) {
//---get the sender address/phone number---
senderTel = msgs[i].getOriginatingAddress();
}
//---get the message body---
str += msgs[i].getMessageBody().toString();
}
if (str.startsWith("Where are you?")) {
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
//---request location updates---
locationListener = new MyLocationListener();
lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
60000,
1000,
locationListener);
//---abort the broadcast; SMS messages won’t be broadcasted---
this.abortBroadcast();
}
}
}
private class MyLocationListener implements LocationListener
{
#Override
public void onLocationChanged(Location loc) {
if (loc != null) {
//---send a SMS containing the current location---
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(senderTel, null,
"http://maps.google.com/maps?q=" + loc.getLatitude() + "," +
loc.getLongitude(), null, null);
//---stop listening for location changes---
lm.removeUpdates(locationListener);
}
}
#Override
public void onProviderDisabled(String provider) {
}
#Override
public void onProviderEnabled(String provider) {
}
#Override
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
}
}
in this code it compare with Where are you ?
if (str.startsWith("Where are you?")) {
//---use the LocationManager class to obtain locations data---
lm = (LocationManager)
context.getSystemService(Context.LOCATION_SERVICE);
//---request location updates---
locationListener = new MyLocationListener();
lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
60000,
1000,
locationListener);
The point is that I am new with android. I don't which key word help me to search about my problem can help me.
please help
thanks in advance

Android drawing marker dynamically in bradcast receiver

I am sending latitude and longitude I received from my server and passing them to broadcastreceiver to draw a marker and update it's location continuously based on the updates it receives from the server. The location updates are coming from another device and I am tracking that device and display it's location in my app as follows:
#Override
public void onMessageReceived(String from, Bundle data) {
if (data != null && !data.isEmpty()) {
String lati = data.getString("lati");
String longi = data.getString("longi");
Intent mIntent = new Intent();
mIntent.putExtra(LOCATION, lati + "," + longi);
mIntent.setAction(UPDATE_COORDINATES); //should match the receiver intent filter at the registering
coordintesupdater.sendBroadcast(mIntent);
} else {
Log.i("Received", "empty message");
}
}
This is my broadcast receiver that is not being called nor does it receive the latitude and longitude.
private BroadcastReceiver locationupdatesreceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent intent) {
String messagestr = intent.getStringExtra(MyGcmListenerService.UPDATE_COORDINATES);
String latst = "", lonst = "";
double lati, longi;
if (messagestr != null && !messagestr.isEmpty()) {
String[] separated = messagestr.split(",");
latst = separated[0].trim();
lonst = separated[1].trim();
try {
lati = Double.parseDouble(separated[0].trim());
longi = Double.parseDouble(separated[1].trim());
//cLocation.setLatitude(lati);
//cLocation.setLongitude(longi);
LatLng updatedloc = new LatLng(lati, longi);
//draw the cab and update it's location periodically
drawLocationUpdatesonMap(updatedloc);
}catch (NumberFormatException nfe){
nfe.printStackTrace();
}
}
}
};
private void drawLocationUpdatesonMap(final LatLng newlocatioin){
GoogleMap.OnMyLocationChangeListener mLoChangeListnener = new OnMyLocationChangeListener() {
#Override
public void onMyLocationChange(Location location) {
//if (cMarker != null)
// cMarker.remove();
Log.i("device location", newlocatioin.toString());
cabMarker = map.addMarker(new MarkerOptions()
.position(newlocatioin)
.visible(true)
.icon(BitmapDescriptorFactory.fromResource(R.drawable.mmovingc))
.flat(true));
}
};
map.setOnMyLocationChangeListener(mLoChangeListnener);
}
FYI the GcmListenerservice is a nested class of my map activity.
It's so embarrassing. I forgot to register and unregister the broadcastreceiver in OnResume and Onpause respectively. It now works like a charm.

Passing object list to another activity

In my code I am creating an area object by placing markers on map and taking its values from user then storing it in a list. Then I used parcelableArrayList to pass this list to another activity. What I want is that user presses displayArea button only then this activity is launched and list is displayed in AllAreas activty. But my app crashes whenever I click that button
Code for mapActivity
public class MainActivity extends
FragmentActivity implements View.OnClickListener,MapDropdown.DialogListener {
public static final String mapLongitude="longitude";
public static final String mapLatitude="latitude";
FragmentManager fm = getSupportFragmentManager();
Button displayareas;
Switch deleteareas;
private boolean del = false;
private int set = 0;
public ArrayList<Area> areas;
private GoogleMap newmap; // Might be null if Google Play services APK is not available.
LatLng m;
float radius;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
displayareas = (Button) findViewById(R.id.display);
displayareas.setOnClickListener(this);
deleteareas = (Switch) findViewById(R.id.delete);
areas = new ArrayList<Area>();
deleteareas.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
#Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
del = true;
Toast.makeText(getApplicationContext(), "Deleting enabled", Toast.LENGTH_LONG).show();
} else {
del = false;
Toast.makeText(getApplicationContext(), "Deleting disabled", Toast.LENGTH_LONG).show();
}
}
});
Log.d("Map","MapCreated");
setUpMapIfNeeded();
}
#Override
public void onClick(View v) {
if (v.getId() == R.id.display) {
Intent intent = new Intent(getApplicationContext(),AllAreas.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", areas);
intent.putExtras(bundle);
startActivity(intent);
}
}
#Override
protected void onResume() {
super.onResume();
//setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the map.
if (newmap == null) {
// Try to obtain the map from the SupportMapFragment.
newmap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
.getMap();
// Check if we were successful in obtaining the map.
if (newmap != null) {
setUpMap();
Log.d("MAPS","Map working");
}
else Log.d("MAPS","not working");
}
}
private void setUpMap() {
newmap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker").snippet("Snippet"));
// Enable MyLocation Layer of Google Map
newmap.setMyLocationEnabled(true);
// Get LocationManager object from System Service LOCATION_SERVICE
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
// Create a criteria object to retrieve provider
Criteria criteria = new Criteria();
// Get the name of the best provider
String provider = locationManager.getBestProvider(criteria, true);
// Get Current Location
Location myLocation = locationManager.getLastKnownLocation(provider);
// set map type
newmap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
// Get latitude of the current location
double latitude = myLocation.getLatitude();
// Get longitude of the current location
double longitude = myLocation.getLongitude();
// Create a LatLng object for the current location
LatLng latLng = new LatLng(latitude, longitude);
// Show the current location in Google Map
newmap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
// Zoom in the Google Map
newmap.animateCamera(CameraUpdateFactory.zoomTo(20));
newmap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("My location"));
Log.d("LATITUDE",String.valueOf(latitude));
Log.d("LONGITUDE",String.valueOf(longitude));
GoogleMap.OnMarkerClickListener listener = new GoogleMap.OnMarkerClickListener() {
#Override
public boolean onMarkerClick(final Marker marker) {
if(del == false){
m=marker.getPosition();
MapDropdown dFragment = new MapDropdown();
// Show DialogFragment
dFragment.show(fm, "Dialog Fragment");}
else if(del == true){
marker.remove();
}
return true;
}
};
newmap.setOnMarkerClickListener(listener);
newmap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
#Override
public void onMapClick(LatLng latLng) {
// Creating a marker
MarkerOptions markerOptions = new MarkerOptions();
// Setting the position for the marker
markerOptions.position(latLng);
// Setting the title for the marker.
// This will be displayed on taping the marker
markerOptions.title(latLng.latitude + " : " + latLng.longitude);
// Animating to the touched position
newmap.animateCamera(CameraUpdateFactory.newLatLng(latLng));
// Placing a marker on the touched position
Marker mmarker = newmap.addMarker(markerOptions);
m = latLng;
Log.d("ADDED LATITUDE",String.valueOf(latLng.latitude));
Log.d("ADDED LONGITUDE",String.valueOf(latLng.longitude));
Toast.makeText(getApplicationContext(),"Block area updated",Toast.LENGTH_LONG).show();
}
});
}
#Override
public void onDialogPositiveClick(DialogFragment dialog , String s, String n){
Log.d("Button","positive");
Log.d("Name",n);
Log.d("Radius",s);
Log.d("On press LATITUDE",String.valueOf(m.latitude));
Log.d("On press LONGITUDE",String.valueOf(m.longitude));
Area newarea = new Area(n,m.latitude,m.longitude,Float.valueOf(s));
Log.d("object",newarea.getId());
Log.d("object",newarea.getName());
areas.add(newarea);
areas.get(0);
Log.d("areas",areas.get(0).getName());
}
#Override
public void onDialogNegativeClick(DialogFragment dialog){
Log.d("Button","negative");
}
}
Part of mainActivity.java adding to list is
#Override
public void onDialogPositiveClick(DialogFragment dialog , String s,
String n){
Log.d("Button","positive");
//areas is list name
//m is current marker
Area newarea = new Area(n,m.latitude,m.longitude,Float.valueOf(s));
areas.add(newarea);
}
And of passing list in mainactivity is
public void onClick(View v) {
//id of button that will launch Allareas activity
if (v.getId() == R.id.display) {
Intent intent = new Intent(getApplicationContext(),AllAreas.class);
Bundle bundle = new Bundle();
bundle.putParcelableArrayList("data", areas);
intent.putExtras(bundle);
startActivity(intent);
}
}
for AllAreas class
public class AllAreas extends ActionBarActivity {
//initial layout
private Area a;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.areas);
Bundle bundle = getIntent().getExtras();
ArrayList<Area> arealist = bundle.getParcelableArrayList("mylist");
if (arealist.isEmpty()) {
Log.d("area list lala", "is empty");
}
else {
for (int i = 0; i < arealist.size(); i++) {
a = arealist.get(0);
Log.d("area list lala", a.getName());
}
}
}
}
You are getting it with wrong key.you used the key "data" for putting it into bundle and trying to get it by the key "mylist"
bundle.putParcelableArrayList("data", areas);
change the line
ArrayList<Area> arealist = bundle.getParcelableArrayList("mylist");
to
ArrayList<Area> arealist = bundle.getParcelableArrayList("data");
let me know if it works.

Locationmanager getLastKnownLocation always null

i have a problem. When i test this. and i ask for the showCurrentLocation function it always returns null. It works in the emulator when i send the location after. But i need this to work on the phone, and there you can't send the location like in de DDNS window.
Here's my code
public class LbsGeocodingActivity extends Activity {
private static final long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
private static final long MINIMUM_TIME_BETWEEN_UPDATES = 1; // in Milliseconds
protected LocationManager locationManager;
protected Button retrieveLocationButton;
protected Button stopLocationButton;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
retrieveLocationButton = (Button) findViewById(R.id.retrieve_location_button);
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MINIMUM_TIME_BETWEEN_UPDATES,
MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
new MyLocationListener()
);
retrieveLocationButton.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
showCurrentLocation();
}
});
/*stopLocationButton.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
//locationManager.removeUpdates(MyLocationListener) ;
}
}); */
}
public String getMyPhoneNumber(){
TelephonyManager mTelephonyMgr;
mTelephonyMgr = (TelephonyManager)
getSystemService(Context.TELEPHONY_SERVICE);
return mTelephonyMgr.getLine1Number();
}
protected void showCurrentLocation() {
Criteria crit = new Criteria();
crit.setAccuracy(Criteria.ACCURACY_FINE);
String provider = locationManager.getBestProvider(crit, true);
Location loc = locationManager.getLastKnownLocation(provider);
if (loc != null) {
String longi = "" + loc.getLongitude();
String lat = "" + loc.getLatitude();
String num = getMyPhoneNumber();
String message = String.format(
"Current Location \n Longitude: %1$s \n Latitude: %2$s \n %3$s ",
longi,
lat,
num );
Toast.makeText(LbsGeocodingActivity.this, message,
Toast.LENGTH_LONG).show();
}
if (loc == null)Toast.makeText(LbsGeocodingActivity.this, "Null ",
Toast.LENGTH_LONG).show();
}
private class MyLocationListener implements LocationListener {
public void onLocationChanged(Location loc) {
String longi = "" + loc.getLongitude();
String lat = "" + loc.getLatitude();
String num = getMyPhoneNumber();
String message = String.format(
"New Location \n Longitude: %1$s \n Latitude: %2$s \n %3$s ",
longi,
lat,
num );
Toast.makeText(LbsGeocodingActivity.this, message, Toast.LENGTH_LONG).show();
}
public void onStatusChanged(String s, int i, Bundle b) {
Toast.makeText(LbsGeocodingActivity.this, "Provider status changed",
Toast.LENGTH_LONG).show();
}
public void onProviderDisabled(String s) {
Toast.makeText(LbsGeocodingActivity.this,
"Provider disabled by the user. GPS turned off",
Toast.LENGTH_LONG).show();
}
public void onProviderEnabled(String s) {
Toast.makeText(LbsGeocodingActivity.this,
"Provider enabled by the user. GPS turned on",
Toast.LENGTH_LONG).show();
}
}
}
My permissions are: FINE_LOCATION COURSE_LOCATION.
I really just want it that it tracks the users location, even on the background..
You can sent mock locations also to your Android device see
Android mock location on device?
Then besides that I had this problem too it seems it maybe never had a location before on your device try to open google maps and make sure you get located and then try again. Also I suspected something like first time you use the application you don't have access to a last know location yet because you never used it so you first need to get located and next time you startup the application it will work. If you want a quick location try to get located by wifi or cell towers
And make sure the permissions are set!
did you checked the GPS is switched on in your phone, after switching on GPS it will take some time to get the location updates.

Categories