2012-06-05 4 views
1

Я делаю приложение, которое работает в фоновом режиме на мобильном телефоне. Когда я отправляю sms с HDPK GPS, приложение должно посылать координаты GPS ячейки на фиксированное число. Я получаю координаты GPS по числу, но постоянно. Я пробовал все с удалением, но все напрасно! Пожалуйста, помогите мне разобраться с этой проблемой. Также, когда приложение прослушивает в фоновом режиме для SMS, 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 

} 

} 

} 

ответ

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

mlocaManager не является глобальным. Поэтому я не могу назвать это там. Если я сделаю его глобальным, приложение завершится с ошибкой – harsh8888

+0

Я сделал locationmanager и listener глобальным и добавил строки в соответствии с вашим предложением. Теперь я тестирую приложение непосредственно в своей ячейке. Как только я установлю и отправлю sms на него, когда он получит сообщение, ничего не происходит. Теперь, если я открою приложение, чтобы увидеть интерфейс, отправьте сообщение, GPS активируется, и я получаю тост. Но вскоре приложение падает. Любая идея? – harsh8888

+0

Отправьте свой код!, Который поможет отследить проблему. –

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 

} 

} 
Смежные вопросы