2013-06-04 97 views
0

我设计了我的服务,因为当用户将去某个位置时它会发出警报。 但是当它发出警报时它会崩溃。从服务呼叫警报

public class CheckDestinationService extends Service { 

    Calendar calender; 
    double late,longe; 
    int dis; 
    String loc; 
    private LocationManager mLocationManager = null; 
    private static final int LOCATION_INTERVAL = 0; 
    private static final float LOCATION_DISTANCE = 0; 



    private class LocationListener implements android.location.LocationListener { 

     Location mLastLocation; 

     public LocationListener(String provider) { 

      mLastLocation = new Location(provider); 
     } 
     public void onLocationChanged(Location location) { 

      mLastLocation.set(location); 
      final double currlat; 
      final double currlong; 
      float[] DistanceArray = new float[1]; 
      currlat = location.getLatitude(); 
      currlong = location.getLongitude(); 
      android.location.Location.distanceBetween(currlat,currlong,late,longe,DistanceArray); 
      float Distance = DistanceArray[0]; 
      //Toast.makeText(getApplicationContext(), "asdf "+String.valueOf(Distance), Toast.LENGTH_SHORT).show(); 
      Log.d("asdfasdas", String.valueOf(currlat)+","+String.valueOf(currlong)+" "+String.valueOf(Distance)); 
      if (Distance<=dis && Distance!=0 && dis!=0) 
      { 
       dis = 0; 
       Intent intent = new Intent(getBaseContext(), AlarmReceiver.class); 
       intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       Toast.makeText(getApplicationContext(), "Reached "+String.valueOf(Distance), Toast.LENGTH_SHORT).show(); 
       PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(),0, intent, PendingIntent.FLAG_CANCEL_CURRENT); 
       AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
       am.set(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(),pendingIntent); 
       //stopSelf(); 
      } 

      /*final Handler handler = new Handler(); 
      Runnable r = new Runnable() { 

       public void run() { 
        // TODO Auto-generated method stub 
        Intent intent = null; 
        intent.putExtra("lat", currlat); 
        intent.putExtra("long", currlong); 
        intent.putExtra("dis", dis); 
        intent.putExtra("loc", loc); 
        Toast.makeText(getApplicationContext(), "Sending", Toast.LENGTH_SHORT).show(); 
        sendBroadcast(intent); 
        handler.postDelayed(this, 1000); 
       } 
      }; 
      handler.postDelayed(r, 1000);*/   
     } 
     public void onProviderDisabled(String provider) { 

     } 
     public void onProviderEnabled(String provider) { 

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

     } 

    } 

    LocationListener[] mLocationListeners = new LocationListener[] { 
      new LocationListener(LocationManager.GPS_PROVIDER), 
      new LocationListener(LocationManager.NETWORK_PROVIDER) 
    }; 



    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     late = intent.getDoubleExtra("lat", 0); 
     longe = intent.getDoubleExtra("long", 0); 
     dis = intent.getIntExtra("dis", 0); 
     loc = intent.getStringExtra("loc"); 
     Toast.makeText(getApplicationContext(), "Destination Set to: "+loc+ 
       " and Minimum Distance: "+ 
       String.valueOf(dis) , Toast.LENGTH_SHORT).show(); 
     return START_STICKY; 
    } 

    @Override 
    public void onCreate() { 

     initializeLocationManager(); 
     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.NETWORK_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[1]); 
     } catch (java.lang.SecurityException ex) { 

     } catch (IllegalArgumentException ex) { 

     } 
     try { 
      mLocationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, LOCATION_INTERVAL, LOCATION_DISTANCE, 
        mLocationListeners[0]); 
     } catch (java.lang.SecurityException ex) { 

     } catch (IllegalArgumentException ex) { 

     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Toast.makeText(getApplicationContext(), "Service Destroyed", Toast.LENGTH_SHORT).show(); 
     if (mLocationManager != null) { 
      for (int i = 0; i < mLocationListeners.length; i++) { 
       try { 
        mLocationManager.removeUpdates(mLocationListeners[i]); 
       } catch (Exception ex) { 

       } 
      } 
     } 
    } 

    private void initializeLocationManager() { 

     if (mLocationManager == null) { 
      mLocationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE); 
     } 
    } 
} 

和我AlarmReceiver类是

public class AlarmReceiver extends Activity { 
    private MediaPlayer mMediaPlayer; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.alarmreceiver); 

     Button stopAlarm = (Button) findViewById(R.id.stopAlarm); 
     stopAlarm.setOnTouchListener(new OnTouchListener() { 
      public boolean onTouch(View arg0, MotionEvent arg1) { 
       stopService(new Intent(AlarmReceiver.this, CheckDestinationService.class)); 
       mMediaPlayer.stop(); 
       finish(); 
       return false; 
      } 
     }); 

     playSound(this, getAlarmUri()); 
    } 

    private void playSound(Context context, Uri alert) { 
     mMediaPlayer = new MediaPlayer(); 
     try { 
      mMediaPlayer.setDataSource(context, alert); 
      final AudioManager audioManager = (AudioManager) context 
        .getSystemService(Context.AUDIO_SERVICE); 
      if (audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { 
       mMediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM); 
       mMediaPlayer.prepare(); 
       mMediaPlayer.start(); 
      } 
     } catch (IOException e) { 
      System.out.println("OOPS"); 
     } 
    } 

     //Get an alarm sound. Try for an alarm. If none set, try notification, 
     //Otherwise, ringtone. 
    private Uri getAlarmUri() { 
     Uri alert = RingtoneManager 
       .getDefaultUri(RingtoneManager.TYPE_ALARM); 
     if (alert == null) { 
      alert = RingtoneManager 
        .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
      if (alert == null) { 
       alert = RingtoneManager 
         .getDefaultUri(RingtoneManager.TYPE_RINGTONE); 
      } 
     } 
     return alert; 
    } 

    @Override 
    public void onBackPressed() { 
     //MainActivity.iMinDistance = 0; 
     stopService(new Intent(AlarmReceiver.this, CheckDestinationService.class)); 
     mMediaPlayer.stop(); 
     finish(); 
    } 
} 

我测试了从其他activites AlarmReceiver类和它的工作正常 ,但它不是从服务工作。 请帮忙!

回答

2

initalize日历

calender = Calendar.getInstance() 
+0

谢谢! (y) 问题解决(y) –