2014-10-17 86 views
2

我正在開發一個應用程序,通過短信在固定的時間後發送用戶位置,如果手機重新啓動應用程序應該在沒有任何啓動器活動的背景下自動啓動。我已經安靜地完成了我的任務,我只能面對獲取位置的問題,因爲gps需要一些時間,並且應用程序在找不到任何位置時會崩潰。 這裏是我的主要活動當gps位置可用時自動發送短信

public class MainActivity extends Activity { 

@Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

    startLocationTracking(); 

}

private void startLocationTracking() 
{ 
    AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); 
    Intent alarmintent1 = new Intent(MainActivity.this, AlarmReceiver.class); 
    PendingIntent sender1=PendingIntent.getBroadcast(MainActivity.this, 100, alarmintent1, PendingIntent.FLAG_UPDATE_CURRENT | Intent.FILL_IN_DATA); 

    try { 
     am.cancel(sender1); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     System.out.println("exjfkd"+e); 
    } 

    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.MINUTE,10); 

    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000*600, sender1); 
    System.out.println("set timer"); 
} 

}

public class AlarmReceiver extends BroadcastReceiver{ 


long time = 600* 1000; 
long distance = 10; 

@SuppressLint("NewApi") 

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

    System.out.println("alarm receiver...."); 
    Intent service = new Intent(context, MyService.class); 
    context.startService(service); 

    //Start App On Boot Start Up 
    if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) { 
    Intent App = new Intent(context, MainActivity.class); 
    App.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
    context.startActivity(App); 

} 
try{ 
    LocationManager locationManager = (LocationManager)context 
      .getSystemService(Context.LOCATION_SERVICE); 


    Criteria criteria = new Criteria(); 

    String provider = locationManager.getBestProvider(criteria, true); 

    locationManager.requestLocationUpdates(provider, time, 
      distance, locationListener); 


    Location location = locationManager.getLastKnownLocation(provider); 

    TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); 
    String device_id = tm.getDeviceId(); // returns IMEI number 


    String phoneNo = "+923362243969"; 

    String Text = "Latitude = " + location.getLatitude() +" Longitude = " + location.getLongitude() + " Device Id: " + device_id; 


    SmsManager smsManager = SmsManager.getDefault(); 
    smsManager.sendTextMessage(phoneNo, null, Text, null, null); 
    Log.i("Send SMS", ""); 

} 
    catch (Exception e) { 
    e.printStackTrace(); 
} 
    this.abortBroadcast(); 

} 


LocationListener locationListener = new LocationListener() { 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 

    } 

    @Override 
    public void onLocationChanged(Location location) { 

    } 
}; 

}

的代碼我在邏輯我想我的應用程序發送短信有點搞不清當GPS座標可用時。如果手機上的gps處於禁用狀態,那麼如果網絡在手機上可用,它應該通過網絡獲取位置並通過網絡發送。

回答

1

編輯

,因爲重新啓動的GPS後第一次您的應用程序崩潰/網絡不會有,因爲

Location location = locationManager.getLastKnownLocation(provider); 

在此行您將收到的位置爲空的lastknowlocation。

String Text = "Latitude = " + location.getLatitude() +" Longitude = " + location.getLongitude() + " Device Id: " + device_id; 

並且在這一行中,您將得到空指針異常,因爲location.getLatitude()不可行。

所以在此代碼嘗試檢查位置!= null。

if(location!=null){ 
    String Text = "Latitude = " + location.getLatitude() +" Longitude = " + location.getLongitude() + " Device Id: " + device_id; 
} 

使用此方法要知道GPS可用性的狀態

public boolean isgpsavailable(Activity activity) { 
     LocationManager locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE); 
     boolean result = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); 
     return result; 
} 

然後把你的代碼放到一個if(isgpsavailable(this)){...}聲明

+0

你可以在if()語句中描述一些行。 – user3584316 2014-10-17 07:43:30

+0

檢查編輯以獲取更多詳細信息 – 2014-10-17 07:57:15

0

您可以使用android.telephony包發送短信。你可以看到如何添加到您的項目在這裏:How do I add ITelephony.aidl to eclipse?

事情是這樣的許可證您發送textSMS:

SmsManager sms = SmsManager.getDefault(); 

sms.sendTextMessage(phoneNumber, scAddress, texto, null, null); 

希望它可以幫助你!

+0

我有發短信息的方法。 – user3584316 2014-10-17 07:24:12