2017-10-31 1 views
1

휴대 전화 화면이 위로 향하면 깜박이기 시작하는 응용 프로그램을 개발하고 있습니다. 휴대 전화의 화면이 아래를 향하고 있으면 손전등이 깜박임을 멈추는 것으로 가정합니다. 휴대폰의 화면이 위 또는 아래로 향하고 있는지 감지하기 위해 나는 가속도계를 사용하고있다. 화면의 방향을 감지하는 코드는 여기에 있습니다 :손전등을 사용하면 SensorListener 및 가속도계가 취소됩니다.

@Override 
    protected void onResume() { 
     super.onResume(); 
     smAccelerometer.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_NORMAL); 
    } 

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

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     int type = event.sensor.getType(); 
     if (type == Sensor.TYPE_ACCELEROMETER) { 
      float gz = event.values[2]; 
      if (mGZ == 0) { 
       mGZ = gz; 
      } else { 
       if ((mGZ * gz) < 0) { 
        mEventCountSinceGZChanged++; 
        if (mEventCountSinceGZChanged == MAX_COUNT_GZ_CHANGE) { 
         mGZ = gz; 
         mEventCountSinceGZChanged = 0; 
         if (gz > 0) { 
          Log.d(TAG, "now screen is facing up."); 
          Toast toast = Toast.makeText(MainActivity.this, "Up", Toast.LENGTH_SHORT); 
          toast.show(); 
          flashlightFrequency(); 
         } else if (gz < 0) { 
          Log.d(TAG, "now screen is facing down."); 
          Toast toast = Toast.makeText(MainActivity.this, "Down", Toast.LENGTH_SHORT); 
          toast.show(); 


         } 
        } 
       } else { 
        if (mEventCountSinceGZChanged > 0) { 
         mGZ = gz; 
         mEventCountSinceGZChanged = 0; 
        } 
       } 
      } 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 
     // TODO Auto-generated method stub 
    } 

당신은 내가 간격으로 켜거나 손전등을 전환하는 방법 flashlightFrequency()를 호출 화면이 위로 향하게 될 때마다이 코드에서 볼 수 있듯이 :

public void flashlightFrequency() { 
     String myString = "0101010101"; 
     int frequency = 2000; //Delay in ms 
     CameraManager camManager; 
     String cameraId = null; // Usually front camera is at 0 position. 

     camManager = (CameraManager) getApplicationContext().getSystemService(Context.CAMERA_SERVICE); 
     try { 
      cameraId = camManager.getCameraIdList()[0]; 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      for (int i = 0; i <= myString.length(); i++) { 
       if (i == myString.length()) { 
        flashlightFrequency(); 
       } 

       if (myString.charAt(i) == '0') { 
        try { 
         camManager.setTorchMode(cameraId, true); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       } else { 
        try { 
         camManager.setTorchMode(cameraId, false); 
        } catch (CameraAccessException e) { 
         e.printStackTrace(); 
        } 
       } 
       try { 
        Thread.sleep(frequency); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

가속도계는 잘 작동하고 나는 방법 flashlightFrequency()를 호출 때까지 화면 의 방향을 감지 할 수 있어요. 손전등이 시작되면 휴대 전화는 더 이상 동작을 등록하지 않습니다. 손전등이 SensorListener을 취소 한 것 같습니다. 손전등을 켤 때마다 가속도계를 사용하여 화면의 방향을 감지 할 수 없습니다.

답변

0

해결책은 IntentService 클래스에 flashlightFrequency()을 구현하는 것이 었습니다. 이렇게하면 손전등이 백그라운드에서 실행되므로 가속도계와 간섭하지 않습니다.

관련 문제