gpt4 book ai didi

android - 当电话停止响铃时关闭手电筒?

转载 作者:行者123 更新时间:2023-11-29 00:32:16 25 4
gpt4 key购买 nike

我正在制作一个应用程序,当手机开始响铃时打开手电筒,并在停止响铃时将其关闭。问题是当电话开始响起时相机被锁定,并且指向它的对象引用丢失所以我不知道以后如何关闭它。

我正在使用 BroadcastReceiver 打开/关闭它:

@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
}
}

if (TelephonyManager.EXTRA_STATE_IDLE.equals(state)) {
cam = Camera.open();
cam.stopPreview();
cam.release();
}
}

有谁知道如何保留对相机对象的引用或任何解决方法?我想到了使用服务,但市场上的其他应用似乎没有使用服务来完成相同的任务。

最佳答案

根据 the documentation on controlling the camera ,您应该在类中保留对 Camera 对象的引用,并在完成后释放它。他们通过一个字段对对象进行寻址来做到这一点。

您也许可以通过执行相同的操作来简单地解决您的问题:

public TelephonyReceiver extends BroadcastReceiver {

Camera mCamera;

@Override
public void onReceive(Context context, Intent intent) {
String state = intent.getStringExtra(TelephonyManager.EXTRA_STATE);

if (TelephonyManager.EXTRA_STATE_RINGING.equals(state)) {
if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)) {
mCamera = Camera.open();
Parameters p = mCamera.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(p);
mCamera.startPreview();
}
}

if (TelephonyManager.EXTRA_STATE_IDLE.equals(state) && mCamera != null) {
mCamera.stopPreview();
mCamera.release();
// Make sure to clear the reference, otherwise we might attempt to
// release the camera a second time
mCamera = null;
}
}

}

如果您是通过服务执行此操作,我建议还添加用于在 onDestroy() 中释放相机的逻辑,以确保正确释放相机。甚至可以在固定的最长持续时间后释放它,以防止它长时间停留。

听起来是个不错的应用!

关于android - 当电话停止响铃时关闭手电筒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14779638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com