Java 在release()照相机错误后调用的方法?
我正在制作一个用于打开/关闭手机led的应用程序我可以理解我做错了什么我遇到了这个错误Java 在release()照相机错误后调用的方法?,java,android,Java,Android,我正在制作一个用于打开/关闭手机led的应用程序我可以理解我做错了什么我遇到了这个错误 E/AndroidRuntime: FATAL EXCEPTION: Thread-42530 java.lang.RuntimeException: Method called after release() at android.hardware.Camera.startPreview(Native Method) at com.mashi.flashlight.FlashLightCal
E/AndroidRuntime: FATAL EXCEPTION: Thread-42530
java.lang.RuntimeException: Method called after release()
at android.hardware.Camera.startPreview(Native Method)
at com.mashi.flashlight.FlashLightCallingService.flashOn(FlashLightCallingService.java:104)
at com.mashi.flashlight.FlashLightCallingService$1.run(FlashLightCallingService.java:45)
at java.lang.Thread.run(Thread.java:856)
我的代码是
public class FlashLightCallingService extends Service {
Boolean hasFlash;
Boolean isFlashOn=true ;
Camera camera;
Camera.Parameters parameters;
@Override
public void onCreate() {
hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
getCamera();
if (hasFlash)
{
new Thread(new Runnable(){
public void run() {
// TODO Auto-generated method stub
while(isFlashOn)
{
flashOn();
//flashOff();
}
}
}).start();
}
else
{
System.exit(1);
}
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
isFlashOn=false;
if (camera != null) {
camera.stopPreview();
camera.release();
camera = null;
}
}
public void getCamera(){
if (camera==null)
{
try {
camera=Camera.open();
parameters=camera.getParameters();
}catch (Exception e)
{
e.printStackTrace();
}
}
}
public void flashOn(){
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
camera.setParameters(parameters);
camera.startPreview();
}
public void flashOff(){
parameters = camera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
camera.setParameters(parameters);
camera.stopPreview();
}
}
抱歉,语言不是英语,但英语不是我的语言您有一个线程在服务被破坏后继续运行。在服务完成onDestroy()回调后,线程正在调用camera对象上的方法 至少你应该确保你的线程在服务被破坏时停止,并且在它被释放后不能再调用摄像机上的方法 此外,在Android应用程序中,您永远不应该有这样做的理由:
System.exit(1);
你能帮我怎么做吗?因为在我的destroy中我有“isFlashOn=false”,所以在这一刻循环将正确停止?如果你在两个不同的线程之间访问一个值,你将必须同步访问该值,或者你可以有一个争用条件。在Java中,线程不会立即看到彼此的更改。因此,请建议您如何处理任何示例代码,因为我在Java中是新手,如果您可以感谢的话,我只使用了ansynctask,并且更适合于此代码,或者在我设置isFlashOn=false do thread.sleep(250)和其他内容之后,将线程放入if循环if(isFlashOn)中我已经做到了这一点,为我工作得很出色,也许有人也有像我一样的问题