【问题标题】:App Freezes and Crashes when trying to Blink the Flashlight尝试闪烁手电筒时应用程序冻结和崩溃
【发布时间】:2015-11-15 18:53:56
【问题描述】:

伙计们!这是我的另一个问题..

我正在制作一个手电筒应用程序。在应用程序中有两个按钮,一个是用于打开/关闭闪光灯(flashlight_switch),另一个是用于闪烁闪光灯单击按钮(sos_switch)中速度。闪光灯开/关效果很好,但是当我按下 SOS 按钮时,应用程序冻结并崩溃。还有如何关闭 SOS。我是初学者,所以您深入解释答案会非常好。如有错别字请忽略。该应用在 Galaxy S3 和 LG G3 上进行了测试,但都没有成功。

完整代码如下:

Java:

手电筒活动:

public class FlashlightActivity extends Activity {
    ImageButton flashlight_switch;
    ImageButton sos_switch;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_flashlight);
        flashlight_switch = (ImageButton) findViewById(R.id.flashlight_switch);
        sos_switch = (ImageButton) findViewById(R.id.sos_switch);

        flashlight_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);

                if (Flash.getTorch()) {
                    flashlight_switch.setImageResource(R.drawable.flashlight_switch_on);
                } else {
                    flashlight_switch.setImageResource(R.drawable.flashlight_switch_off);
                }
            }
        });

        sos_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (SOS.getSOS()) {
                    sos_switch.setImageResource(R.drawable.sos_on);
                } else {
                    sos_switch.setImageResource(R.drawable.sos_off);
                }
            }
        });
    }
}

Flash:

class Flash {
private static boolean flashOnOff = false;
private static boolean sosOnOff = false;
public static Camera camera;
private static Camera.Parameters params;


public static boolean getTorch() {
    if (flashOnOff)
        off();
    else
        on();
    return flashOnOff;

}

public static boolean getSOS() {
    if (sosOnOff)
        offSOS();
    else
        onSOS();
    return sosOnOff;

}

private static void on()  {
    if (!flashOnOff) {
        if (camera == null || params == null) {
            try {
                camera = Camera.open();
                params = camera.getParameters();
            } catch (RuntimeException e) {
                int a = 10;
            }
        }
        try {
            camera.setPreviewTexture(new SurfaceTexture(0));
            params = camera.getParameters();
            params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
            camera.setParameters(params);
            camera.startPreview();
            flashOnOff = true;

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

private static void off() {
    if (camera == null || params == null)
        return;
    params = camera.getParameters();
    params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
    camera.setParameters(params);
    camera.stopPreview();
    camera.release();
    camera = null;
    flashOnOff = false;
}

private static void onSOS() {
    Thread t = new Thread() {
        public void run() {
            try {

                int delay = 50;
                int times = 10;
                for (int i=0; i < times*2; i++) {
                    if (flashOnOff) {
                        on();
                    } else {
                        off();
                    }
                    sleep(delay);
                }

            } catch (Exception e){
                e.printStackTrace();
            }
        }
    };
    t.start();
}
private static void offSOS() {
    Thread t = new Thread();
    t.stop();}}

提前致谢!

更新:

我已经更新了我的 flash.java。它现在没有崩溃,但 SOS 仍然不起作用,sos 开关也冻结了。我现在想不通。请帮忙!!!!尽快!

【问题讨论】:

    标签: android flash galaxy led flashlight


    【解决方案1】:

    你不应该休眠Thread.sleep(blinkDelay);线程,因为它是主线程需要更新 UI。你应该在 SOS 上使用不同的线程

    您的 SOS on 函数处于递归无限循环中,请编辑它。您正在递归调用无限时间

    公开 Flash 类的 ON/OFF 方法,并对 SOS 的 on 方法 on();Flash.onoffFlash .off 进行少量更改

    Flash.java

    class Flash {
    private static boolean flashOnOff = false;
    public static Camera camera;
    private static Camera.Parameters params;
    static Thread t;
        public static boolean getTorch() {
            if (flashOnOff)  // turn off flash
                off();
            else              // turn on flash
                on();
            return flashOnOff;
    
        }
    
    private static void on() {
        if (!flashOnOff) {
            if (camera == null || params == null) {
                try {
                    camera = Camera.open();
                    params = camera.getParameters();
                } catch (RuntimeException e) {
                    int a = 10;
                }
            }
            try {
                params = camera.getParameters();
                params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
                camera.setParameters(params);
                camera.setPreviewTexture(new SurfaceTexture(0));
                camera.startPreview();
                flashOnOff = true;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    private static void off() {
        if (camera == null || params == null)
            return;
        params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        camera.stopPreview();
        flashOnOff = false;
    }
    public static void onSOS() {
        t = new Thread() {
            public void run() {
                try {
                    int delay = 50;
                    while (true) {
                        if (t.isInterrupted())
                            break;
                        getTorch();
                        sleep(delay);
                    }
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };
        t.start();
    
    }
    
    public static void offSOS() {
        if (!t.isInterrupted()) {
            t.interrupt();
            off();
        }
    }}
    

    FlashlightActivity.java

    public class FlashlightActivity extends Activity {
    ImageButton flashlight_switch;
    ImageButton sos_switch;
    boolean isStart = false;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_flashlight);
            flashlight_switch = (ImageButton) findViewById(R.id.flashlight_switch);
            sos_switch = (ImageButton) findViewById(R.id.sos_switch);
        flashlight_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                view.performHapticFeedback(HapticFeedbackConstants.VIRTUAL_KEY);
    
                if (Flash.getTorch()) {
                    flashlight_switch.setImageResource(R.drawable.flashlight_switch_on);
                } else {
                    flashlight_switch.setImageResource(R.drawable.flashlight_switch_off);
                }
            }
        });
    
        sos_switch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (!isStart){
            Flash.onSOS();
            isStart = true;
            sos_switch.setImageResource(R.drawable.sos_off);
        }else{
            Flash.offSOS();
            isStart = false;
            sos_switch.setImageResource(R.drawable.sos_on);
        }
            }
        });
    }
    

    }

    【讨论】:

    • 再次感谢兄弟!如果我只在 flash 类中实现 sos 方法怎么办? “并且您的 SOS 功能处于递归无限循环中,请编辑它”是什么意思?以及如何关闭 SOS?
    • 当 SOS 的“on”方法运行时,您将再次调用“on”方法,并且“if (myString.charAt(i) == '0')”将再次变为 true,并且您的“on”再次变为 true方法将运行...它将一次又一次地运行...所以“您的 SOS on 函数处于递归无限循环”
    • 我已经更新了我的 flash.java,但它仍然无法工作,是的,它现在不会崩溃,但是当我反复打开/关闭手电筒时,它会尝试闪烁一次手电筒。我现在想不通。请帮忙!!!!是的,sos 按钮一旦被点击就会冻结.......
    • 谢谢你!但是sos没有手动关闭,我该怎么做?以及如何改变sos的drawable?
    • camera.release(); 的替代方法是什么?它减慢了打开和关闭手电筒的过程。
    猜你喜欢
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多