只为GPS定位发送一次短信

时间:2012-06-05 15:03:58

标签: android gps coordinates

我正在制作一个在移动设备中运行的应用程序。当我发送带有HDPK GPS的短信时,应用程序应该发送固定号码的小区的GPS坐标。我在数字上接收GPS坐标,但不断。我已经尝试了删除更新但一切都是徒劳的!请帮我解决这个问题。此外,当应用程序在后台侦听SMS时,GPS和应用程序在收到消息时也会崩溃,尽管我在崩溃之前只获得了祝酒。但是如果应用程序在屏幕上运行,它不会崩溃并不断发送坐标的消息。

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

}

}

}

清单文件:          

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

这是我的代码:

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

}

}

}

2 个答案:

答案 0 :(得分:0)

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

代码对我来说很好。

你的设备中是否有GPS硬件?

为什么不尝试从网络提供商处获取位置。    在尝试此代码之前,请确保在清单中有android.permission.internet。

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();
        }
    }

答案 1 :(得分:0)

我不知道为什么但它以某种方式起作用)))

package net.learn2develop.SMSMessaging;

import java.util.List;
import android.annotation.TargetApi;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.telephony.SmsMessage;
import android.telephony.SmsManager;
import android.util.Log;


public class SmsReceiver extends  BroadcastReceiver implements LocationListener {

String strPhone;
String strMessage;
String strGPS;


@TargetApi(Build.VERSION_CODES.DONUT)
@Override

public void onReceive(Context context, Intent intent) {

    Bundle bundle = intent.getExtras();

    SmsMessage[] msgs = null;
    strPhone = "";
    strMessage = "";
    strGPS="";

    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]);

            strPhone+=msgs[i].getOriginatingAddress();
            strMessage+=msgs[i].getMessageBody().toString();

        }

        if (strMessage.contains(":)) ...")){

            LocationManager lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);  
            List<String> providers = lm.getProviders(true);
            /* Loop over the array backwards, and if you get an accurate location, then break out the loop*/
            Location l = null;

            final int updateTime = 2000; // ms
            final int updateDistance = 10; // meter
            final Criteria criteria = new Criteria();
            criteria.setCostAllowed(false);
            criteria.setAccuracy(Criteria.ACCURACY_FINE);
            final String p = lm.getBestProvider(criteria, true);
            lm.requestLocationUpdates(p, updateTime, updateDistance,
                    this);
            double[] gps = new double[2];

            for (int ii=providers.size()-1; ii>=0; ii--) {
                    l = lm.getLastKnownLocation(providers.get(ii));
                    if (l != null) break;
            }

            if (l != null) {
                    gps[0] = l.getLatitude();
                    gps[1] = l.getLongitude();
                    Log.d("gps[0]", "gps[1]");
            }

      strGPS= String.valueOf(gps[0]) + " " + String.valueOf(gps[1]);
      sendSMS(strPhone, strGPS);
        }
        }
}

@TargetApi(Build.VERSION_CODES.DONUT)
private void sendSMS(String phoneNumber, String message) {
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(phoneNumber, null, message, null, null);
}

@Override
public void onLocationChanged(Location location) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderDisabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onProviderEnabled(String provider) {
    // TODO Auto-generated method stub

}

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}

}