harsh8888 harsh8888 - 1 month ago 13
Android Question

Send SMS just once for GPS location

I'm making an application which runs in background in a mobile. When I send a sms with HDPK GPS, the application is supposed to send the GPS co-ordinates of the cell on a fixed number. I receive the GPS co-ordinates on the number but continuously. I have tried everything with removeupdates but all in vain! Please help me sort this issue out. Also when the application listens in the background for the SMS,the GPS and the application too crashes when receives the message, although I get just the toast before the crash. But if the application is running on the screen, it wont crash and continuously sends messages of the co-ordinates.

public class RecActivity extends Activity {
double current_lat, current_lng;
boolean flag=true;
// String provider=LocationManager.GPS_PROVIDER;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
BroadcastReceiver SMSbr = new BroadcastReceiver() {

@Override
public void onReceive(Context context,Intent intent) {

Bundle bundle = intent.getExtras();
if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
if (messages.length > -1) {
String messagebody=messages[0].getMessageBody();
if(messagebody.toString().matches("HDPK GPS"))
{

LocationManager mlocManager = (LocationManager)getSystemService(RecActivity.LOCATION_SERVICE);
LocationListener mlocListener = new MyLocationListener();

Toast.makeText(RecActivity.this,"GPS STARTED", Toast.LENGTH_LONG)
.show();
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,1, mlocListener);

}

}

}
}

};

IntentFilter SMSfilter = new IntentFilter(SMS_RECEIVED);
this.registerReceiver(SMSbr, SMSfilter);
}

public class MyLocationListener implements LocationListener
{

public void onLocationChanged(Location loc) {
Toast.makeText(RecActivity.this,"GPS WORKING", Toast.LENGTH_LONG).show();
current_lat=loc.getLatitude();
current_lng=loc.getLongitude();
String Text = "My location is: " +

"Latitude = " + current_lat +

"Longitude = " + current_lng;

SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,Text , null, null);
Toast.makeText(RecActivity.this, "SMS SENT", Toast.LENGTH_LONG).show();



}



public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,"GPS Disabled" , null, null);

}

public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,"GPS Enabled" , null, null);

}

public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub

}

}

}


The Manifest file:



<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:name=".RecActivity"
android:label="@string/app_name" >
<intent-filter android:priority="100">
<action android:name="android.intent.action.MAIN" />

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

</manifest>





Here is my code:

package RecSM.Rec.receiveharsh;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class RecActivity extends Activity {
double current_lat, current_lng;
boolean flag=true;
LocationManager mlocManager;
LocationListener mlocListener;
// String provider=LocationManager.GPS_PROVIDER;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
BroadcastReceiver SMSbr = new BroadcastReceiver() {

@Override
public void onReceive(Context context,Intent intent) {

Bundle bundle = intent.getExtras();
if (bundle != null) {

Object[] pdus = (Object[]) bundle.get("pdus");
final SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
if (messages.length > -1) {


String messagebody=messages[0].getMessageBody();


if(messagebody.toString().matches("HDPK GPS"))
{

LocationManager mlocManager = (LocationManager)getSystemService(RecActivity.LOCATION_SERVICE);
LocationListener mlocListener = new MyLocationListener();

Toast.makeText(RecActivity.this,"GPS STARTED", Toast.LENGTH_LONG)
.show();
mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000,1, mlocListener);

}


}

}
}

};

IntentFilter SMSfilter = new IntentFilter(SMS_RECEIVED);
this.registerReceiver(SMSbr, SMSfilter);
}

public class MyLocationListener implements LocationListener
{

public void onLocationChanged(Location loc) {


Toast.makeText(RecActivity.this,"GPS WORKING", Toast.LENGTH_LONG)
.show();

current_lat=loc.getLatitude();
current_lng=loc.getLongitude();
String Text = "My location is: " +

"Latitude = " + current_lat +

"Longitude = " + current_lng;

SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,Text , null, null);
Toast.makeText(RecActivity.this, "SMS SENT", Toast.LENGTH_LONG).show();
mlocManager.removeUpdates(mlocListener);


}



public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,"GPS Disabled" , null, null);

}

public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,"GPS Enabled" , null, null);

}

public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub

}

}

}

Answer
String Text = "My location is: " +

"Latitude = " + current_lat +

"Longitude = " + current_lng;

SmsManager sender=SmsManager.getDefault();
sender.sendTextMessage("9762281814",null,Text , null, null);
Toast.makeText(RecActivity.this, "SMS SENT", Toast.LENGTH_LONG).show();

mlocManager.removeUpdates(mlocListener); <<<<<<<<<<<< include this

Code looks fine to me.

Is you device have GPS hardware in it??.

Why dont you try fetching location from network provider. Make sure you have android.permission.internet in manifest before trying this code.

if (connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
                .isConnected()
                || connectivityManager.getNetworkInfo(
                        ConnectivityManager.TYPE_WIFI).isConnected())
        {
            /*Log.d("vipul", "WIFI or GPRS Connected");*/
            if (locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER))
            {
                Constants.CONNECTED = true;
                /*Log.v("tripSketch", "NETWORK Provider Enabled");*/
                locationManager.requestLocationUpdates(
                        LocationManager.NETWORK_PROVIDER, 5000, 1, this);
            } else
            {
                Constants.CONNECTED = false;
                /*Log.d("vipul",
                        "Please enable Wireless networks in Location Setting!!");*/
                Toast.makeText(
                        context,
                        "Please enable Wireless networks in Location Setting!!",
                        10000).show();
            }

        } else if (locationManager
                .isProviderEnabled(LocationManager.GPS_PROVIDER))
        {
            Constants.CONNECTED = true;
            /*Log.d("vipul", "GPS Provider Enabled!");*/
            locationManager.requestLocationUpdates(
                    LocationManager.GPS_PROVIDER, 120000, 100, this);

        } else
        {
            /*Log.d("vipul", "Neither GPS NOR EDGE/GPRS CONNECTED");*/
            Constants.CONNECTED = false;
            Toast.makeText(
                    context,
                    "Please connect EDGE/GPRS \nAlso Enable Wireless networks in Location Setting!!",
                    10000).show();
        }
    }