从服务中调用警报

时间:2013-06-04 11:00:45

标签: android-service android-alarms android-loadermanager

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

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

我从其他活动中测试了AlarmReceiver类并且它正常工作 但它不是从服务工作。 请帮助!!

1 个答案:

答案 0 :(得分:2)

初始化日历