2016-03-03 22 views
6

Ho questo codiceUnregisterListener non funziona con PROXIMITY_SCREEN_OFF_WAKE_LOCK

public class MainActivity extends AppCompatActivity implements SensorEventListener { 

    private SensorManager mSensorManager; 
    private Sensor mProximity; 
    private PowerManager mPowerManager; 
    private PowerManager.WakeLock mWakeLock; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 


     mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
     mProximity = mSensorManager.getDefaultSensor(Sensor.TYPE_PROXIMITY); 

     mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    } 

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

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

    @Override 
    public void onSensorChanged(SensorEvent event) { 
     if (event.sensor.getType() == Sensor.TYPE_PROXIMITY) { 
      if (event.values[0] == 0) { 
       //near 
       Toast.makeText(getApplicationContext(), "near", Toast.LENGTH_SHORT).show(); 
       turnOffScreen(); 

      } else { 
       //far 
       Toast.makeText(getApplicationContext(), "far", Toast.LENGTH_SHORT).show(); 
       turnOnScreen(); 
      } 
     } 
    } 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) { 

    } 


    public void turnOffScreen() { 

      mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "tag"); 
      mWakeLock.acquire(); 

    } 

    public void turnOnScreen() { 

      mWakeLock = mPowerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "tag"); 
      mWakeLock.acquire(); 
    } 

} 

Quando l'applicazione sta dormendo o va ad altra attività, il sensore funzionano ancora. Qualche idea?

+0

Giusto per chiarire, vuoi dire che i callback saranno chiamati anche dopo aver chiamato 'mSensorManager.unregisterListener (this); ', è quello che succede? –

+0

Questo è tutto !!!! È strano ... molto strano ... – Cabezas

+0

si verifica su tutti i dispositivi o in modo selettivo su alcuni? – user2450263

risposta

1

Ho preso altro modo per risolvere questo problema, perché nessuno sa come risolvere il problema, quindi con questo codice non è necessario utilizzare SensorManager. Ora uso due funzioni per l'avvio e l'arresto del sensore, penso sia l'unica soluzione.

import android.content.Context; 
import android.os.PowerManager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

public class MainActivity extends AppCompatActivity { 

    private PowerManager mPowerManager; 
    private PowerManager.WakeLock mWakeLock; 

    private static final String TAG = "MainActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    } 

    public void activateSensor(View v) { 
     Toast.makeText(MainActivity.this, "Proximity On", Toast.LENGTH_LONG).show(); 
     if (mWakeLock == null) { 
      mWakeLock = mPowerManager.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, "incall"); 
     } 
     if (!mWakeLock.isHeld()) { 
      Log.d(TAG, "New call active : acquiring incall (CPU only) wake lock"); 
      mWakeLock.acquire(); 
     } else { 
      Log.d(TAG, "New call active while incall (CPU only) wake lock already active"); 
     } 
    } 

    public void deactivateSensor(View v) { 
     Toast.makeText(MainActivity.this, "Proximity Off", Toast.LENGTH_LONG).show(); 
     if (mWakeLock != null && mWakeLock.isHeld()) { 
      mWakeLock.release(); 
      Log.d(TAG, "Last call ended: releasing incall (CPU only) wake lock"); 
     } else { 
      Log.d(TAG, "Last call ended: no incall (CPU only) wake lock were held"); 
     } 
    } 

} 

E questo è il mio activity_main.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.javier.proximitysensor.MainActivity"> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/activity_main_turn_on_screen" 
     android:onClick="activateSensor" 
     android:text="@string/activity_main_activate_sensor" /> 

    <Button 
     android:id="@+id/activity_main_turn_on_screen" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentBottom="true" 
     android:onClick="deactivateSensor" 
     android:text="@string/activity_main_deactivate_sensor" /> 
</RelativeLayout> 

Grazie ...

Inoltre è possibile controllare questo esempio in GitHub

0

Nel codice iniziale non è stato gestito il rilascio il blocco della sveglia correttamente. Quando la tua attività è su onStop, annulla la registrazione dell'ascoltatore e rilascia anche il blocco scia.

+0

Ciao !!! la tua risposta non è una risposta, è un commento. Dovresti imparare come usare Stackoverflow prima di usarlo. – Cabezas

0

Utilizzare la funzione wakeLock.setReferenceCounted(false). L'ho usato e funziona.