1

하나의 활동에서 Google Maps API V2를 사용 중이며 가속도계가있는 두 번째 활동이있는 Android 애플리케이션이 있습니다. 나는이 두 가지 활동을 각각의 버튼을 사용하여 전환하려고합니다. 나는 가속도계를 사용하여 사용자가 운전 중일 때 제동을 감지하고지도에 마커를 배치하려고합니다.동일한 애플리케이션의 다른 활동에서 활동 값 가져 오기

가속도계 활동을 시작한 다음 내지도 활동으로 전환하면 가속도계가 지속적으로 값을 onSensorChanged에서 계속 가져 오므로 활동이 정상적으로 종료되지 않습니다. 웬일인지지도 활동에 대한 값을 얻을 수있는 것처럼 보이지는 않지만 0.0.0 0.0 또는 null을 null로 사용하고 있습니다. 누군가 내가 이것을 할 수있는 방법을 말해 줄 수 있습니까?

UPDATE

가속도계 코드의

주요 부분 :

@Override 
public void onSensorChanged(SensorEvent e) { 
    // TODO Auto-generated method stub 

    // alpha is calculated as t/(t + dT) 
    // with t, the low-pass filter's time-constant 
    // and dT, the event delivery rate  
    if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     // - + +   
     gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2]; 

     acceleration[0] = e.values[0] - gravity[0]; 
     acceleration[1] = e.values[1] - gravity[1]; 
     acceleration[2] = e.values[2] - gravity[2];{ 

     txtX.setText(""+Math.round((acceleration[0] * 100.0)/100.0)); 
     txtY.setText(""+Math.round((acceleration[1] * 100.0)/100.0)); 
     txtZ.setText(""+Math.round((acceleration[2] * 100.0)/100.0)); 
} 

가 나는 등의 마커를 배치 할 수 있도록지도 활동의 onLocationChanged 청취자의 가속도 값을 좀하고 싶습니다 곧 감속이 감지됩니다.

답변

0

아직 센서에서 데이터를 수신하고 있음을 나타내는 로그 메시지가 표시되는 경우에는 여전히 백그라운드에서 활동에 등록되어있는 것입니다. 배터리를 빨리 소모 할 수 있으므로 더 이상 필요하지 않을 때 센서에서 데이터 수신을 중단 할 수 있으므로 이는 좋은 생각이 아닙니다. 등록을 취소하려면

이 추가 위로

@Override 
    protected void onPause() { 
    super.onPause(); 
    sensorManager.unregisterListener(this); 
    } 

를 귀하의 질문에, 당신은 센서로부터 데이터를 수신하기 위해지도 활동과도 등록해야합니다. 다른 솔루션은 서비스에서 데이터를 수신하는 것일 수 있습니다. 내가 가속도계의 또 다른 클래스를 생성하고 백그라운드 서비스로 돌려했다 결국 http://developer.android.com/guide/topics/sensors/sensors_overview.html

+0

저는 배터리 소모에 특히 관심이 없습니다. 상업용 앱이 아니며 개인적인 용도로만 사용하기 때문입니다. 한 활동에서 다른 활동으로 가치를 얻는 간단한 방법이 필요합니다. 일부 의도를 사용하여 시도했지만 내가 말한대로 null 값 또는 0.0s 중 하나를 얻고있었습니다. 가속도계 활동은 일부 TextField의 값과 공의 애니메이션이 표시되는 속한보기가 있기 때문에 활동 상태를 유지해야합니다. 별도의 가속도계 서비스를 만들어야합니까? 나는 쉬운 방법이 있어야만하는 것처럼 느껴진다. ... –

+0

백그라운드로 갔을 때 당신의 활동을 계속 유지하도록 Android를 강요 할 수 없다. 가속도계 활동의 목적은 무엇입니까? 필요한 것은 제동 순간을 감지하고 제동이 시작되었을 때 현재 위치를 기록하는 것입니다. startActivityForResult (android.content.Intent, int) 및 setResult (int, android.content.Intent)를 사용할 수 있습니다. 어쩌면 코드를 보여 주면 더 좋을 것입니다. – petlack

+0

추가 할 코드 부분을 잘 모르는 경우 : /. 저도 활동 인정서를 가지고 있고 다른 많은 것들이 있기 때문에 꽤 큽니다. 우선 startActivityForResult를 살펴볼 것입니다. 정말 좋은 단서가 될 것 같네요. 타이 :). setResult의 기능은 무엇입니까? 내가하는 일에 대한 더 좋은 생각을주기 위해 사용자가 진행할 때 onLocationChanged 수신기에서 Accelerometer 값을 확인하려고했습니다. 이렇게하면 빠른 감속이 감지 되 자마자 마커를 배치 할 수 있습니다. –

0

:

당신은 자세한 내용은 여기를 센서에 대한 정보를 찾을 수 있습니다. 백그라운드 서비스는 훌륭하게 작동하며 Accelerometer 서비스의 브로드 캐스트와 Map 활동의 브로드 캐스트 리시버를 사용하여 데이터를 가져옵니다.

나는과 같이 가속도계 서비스의 onSensorChanged 내 의도와 putExtras 및 방송 관리자를 가지고 :

@Override 
public void onSensorChanged(SensorEvent e) { 
    // TODO Auto-generated method stub 

    if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     // - + +   
     gravity[0] = alpha * gravity[0] + (1 - alpha) * e.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * e.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * e.values[2]; 

     acceleration[0] = e.values[0] - gravity[0]; 
     acceleration[1] = e.values[1] - gravity[1]; 
     acceleration[2] = e.values[2] - gravity[2]; 

     //Log.d(TAG, ""+acceleration[0] + " "+acceleration[1] + " "+acceleration[2]); 

     a = new Intent(ACCEL_UPDATE); 
     a.putExtra(ACCEL_RESULT, acceleration[0]); 
     a.putExtra(ACCEL_RESULT, acceleration[1]); 
     a.putExtra(ACCEL_RESULT, acceleration[2]); 
     manager = LocalBroadcastManager.getInstance(this); 
     manager.sendBroadcast(a); 
} 

참고 : ACCEL_RESULT 및 ACCEL_UPDATE이 방송 수신기가 값과 의도를 식별 할 수있는 것만으로 문자열 그중 그들은에서 온다. 그리고는 나는에서 onCreate 내지도 활동에 브로드 캐스트를 수신 :

//Receiver of Accelerometer Service broadcasts 
    broadcastReceiver2 = new BroadcastReceiver(){ 

     @Override 
     public void onReceive(Context context, Intent intent){ 
      x = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0); 
      y = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0); 
      z = intent.getDoubleExtra(AccelService.ACCEL_RESULT, 0); 

      x = round(x,3,BigDecimal.ROUND_HALF_UP); 
      y = round(y,3,BigDecimal.ROUND_HALF_UP); 
      z = round(z,3,BigDecimal.ROUND_HALF_UP); 

      //Log.d(TAG, "" + x + " " + y + " " + z); 
     } 
    }; 

그리고 내가 :) 싶어 나는 참으로 onLocationChanged 청취자의 값을 수신하고 있는지 확인 할 수 있던 Log.d를 사용하여.

@petlack 서비스를 사용해야한다고 말한 것처럼 처음 대답에 맞았습니다.