местоположение, таймер и нулевое исключение - PullRequest
0 голосов
/ 03 марта 2012

Я построил сервис, в котором вычисляет местоположение пользователя с помощью GPS и Wi-Fi (пишу самостоятельно).Когда расчет завершен, пользователю отправляется SMS.Обратите внимание, что эта служба запускается с помощью SMS.Wi-Fi и GPS работают нормально со своим.Но получил ошибку при объединении.

И на самом деле я получил две ошибки, во-первых: java.lang.NullPointerException.

А затем мое приложение снова падает, и я получил следующее: java.lang.RuntimeException: Невозможно запустить службу.com.HelloWifi.ScanService @ 405253e0 с нулевым значением: java.lang.NullPointerException

Похоже, что GPS пытается запустить другую службу после завершения первой службы.Я пробовал множество способов, но не могу это исправить.Кто-нибудь, пожалуйста, помогите.

Ниже приведен код

public class ScanService extends Service {
    WifiManager wifi;
    TimerTask timerTask1;
    private static Timer timer = new Timer();
    String receipt;
    String message = "";
    int count = 0;
    Location location;
    String gpsInfo = "";
    LocationManager locationManager;

@Override
public void onCreate() {
    wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    timer = new Timer();
    timerTask1 = new TimerTask() {
        @Override
        public void run() {
            // TODO Auto-generated method stub

            Log.d("timer", "timer alright");
            if (count >=0 && count <= 24) {
                count++;
                scan();//do the scanning
            }
            else if (count == 25) {
                locating();//do the calculation
                sendSMS();

            }
        }
    };
    Criteria criteria = new Criteria();
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setCostAllowed(true);
    criteria.setPowerRequirement(Criteria.POWER_LOW);
    String provider = locationManager.getBestProvider(criteria, true);
    location = locationManager.getLastKnownLocation(provider);
    if (location != null) {
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        message += " http://ditu.google.cn/?q=" + lat + "," + lng;
    }
    else {
        message += "unable to get gps info";
    }
}

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    Toast.makeText(this, "service onStart", 0).show();
    wifi.setWifiEnabled(false);
    wifi.setWifiEnabled(true);
    timer.scheduleAtFixedRate(timerTask1, 30000, 500);

}

@Override
public void onDestroy() {
    super.onDestroy();
    timer.cancel();
    Toast.makeText(this, "service onDestroy", Toast.LENGTH_LONG).show();
}
public void sendSMS() {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), 0);
    Log.d("sendSMS", "in sndSMS");
    //Log.d("message", message);

    BroadcastReceiver sentReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch(getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS sent", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU", 
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off", 
                        Toast.LENGTH_SHORT).show();
                break;
            }
        }

    };

    BroadcastReceiver deliveredReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            switch(getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "SMS delivered", 
                        Toast.LENGTH_SHORT).show();
                stopSelf();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "SMS not delivered", 
                        Toast.LENGTH_SHORT).show();
                stopSelf();
                break; 
            }

        }

    };
    registerReceiver(sentReceiver, new IntentFilter(SENT));
    registerReceiver(deliveredReceiver, new IntentFilter(DELIVERED));
    SmsManager sms = SmsManager.getDefault();
    sms.sendTextMessage(receipt, null, message, sentPI, deliveredPI);

    timer.cancel();
    Log.d("timer", "timer cancelled");
}

}

1 Ответ

0 голосов
/ 10 марта 2012

разберись наконец! SMS слишком длинное для отправки! после добавления следующего кода проблема решена!

    PendingIntent pi = PendingIntent.getActivity(this, 0, new Intent(this, ScanService.class), 0);                
    SmsManager sms = SmsManager.getDefault();
    List<String> texts = sms.divideMessage(message);
    for (String text:texts) {

        sms.sendTextMessage(receipt, null, text, pi, null);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...