我有这个密码
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();
}
}当应用程序在睡觉或进入其他活动时,传感器仍能工作。有什么想法吗?
发布于 2016-03-08 12:07:14
我采用了其他的方法来解决这个问题,因为没有人知道如何解决这个问题,所以对于这些代码,我不需要使用SensorManager。现在我使用两个功能启动和停止传感器,我认为是唯一的解决方案。
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");
}
}
}这是我的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>谢谢..。
此外,您还可以在GitHub中检查此示例
发布于 2016-03-12 09:10:06
在初始代码中,您还没有正确地处理释放唤醒锁的问题。当您的活动在onStop中时,请注销侦听器并释放所持有的唤醒锁。
发布于 2017-04-12 03:38:32
使用函数wakeLock.setReferenceCounted(false)。我用过它,而且很管用。
https://stackoverflow.com/questions/35767115
复制相似问题