Android片段中的手电筒 –SurfaceView

概述我正在尝试为本地音乐会开发手电筒应用程序.这是一个更大的应用程序的一部分,所以它是一个片段.这是代码:首先,我将该类与其变量一起声明:publicclassConcertFragmentextendsFragment{ToggleButtonbtnFlashlight;ViewrootView;privateCameracam;pr

我正在尝试为本地音乐会开发手电筒应用程序.这是一个更大的应用程序的一部分,所以它是一个片段.这是代码:

首先,我将该类与其变量一起声明:

public class ConcertFragment extends Fragment {    Togglebutton btnFlashlight;    VIEw rootVIEw;    private Camera cam;    private boolean hasFlash;    boolean hasCamera;    boolean isFlashOn;    Parameters params;    public ConcertFragment() {    }

接下来是onActivityCreated方法,它返回getCamera方法(进一步向下声明):

    @OverrIDe    public voID onActivityCreated(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getCamera();    }

然后我创建了构建布局的onCreateVIEw方法:

    @OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container, Bundle savedInstanceState) {        rootVIEw = inflater.inflate(R.layout.fragment_concert, container, false);        hasFlash = getActivity().getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);        if (!hasFlash) {            // device doesn't support flash            // Show alert message and close the application            AlertDialog alert = new AlertDialog.Builder(getActivity()).create();            alert.setTitle("No Flash");            alert.setMessage("Sorry, device is not flash supported.");            alert.setbutton(DialogInterface.button_POSITIVE, "OK", new androID.content.DialogInterface.OnClickListener() {                @OverrIDe                public voID onClick(DialogInterface dialog, int which) {                }            });            alert.show();        }        btnFlashlight = (Togglebutton) rootVIEw.findVIEwByID(R.ID.togglebutton);        btnFlashlight.setonCheckedchangelistener(new OnCheckedchangelistener() {            @OverrIDe            public voID onCheckedChanged(Compoundbutton buttonVIEw,                    boolean isChecked) {                if (isFlashOn) {                    // turn off flash                    turnOffFlash();                } else {                    // turn on flash                    turnOnFlash();                }            }        });        return rootVIEw;    }

打开闪光灯的方法:

    private voID turnOnFlash() {        if (!isFlashOn) {            if (cam == null || params == null) {                return;            }            params = cam.getParameters();            params.setFlashMode(Parameters.FLASH_MODE_TORCH);            cam.setParameters(params);            cam.startPrevIEw();            isFlashOn = true;            // changing button/switch image            togglebuttonImage();        }    }

关闭闪光灯的方法:

    private voID turnOffFlash() {        if (isFlashOn) {            if (cam == null || params == null) {                return;            }            params = cam.getParameters();            params.setFlashMode(Parameters.FLASH_MODE_OFF);            cam.setParameters(params);            cam.stopPrevIEw();            isFlashOn = false;            // changing button/switch image            togglebuttonImage();        }    }

设置摄像机参数的方法:

       private voID getCamera() {            if (cam != null) {                try {                    cam = Camera.open();                    params = cam.getParameters();                    cam.startPrevIEw();                    hasCamera = true;                } catch (RuntimeException e) {                    Log.e("Camera Error. Failed to Open. Error: ", e.getMessage());                }            }       }               private voID togglebuttonImage(){            if(isFlashOn){                btnFlashlight.setBackgroundResource(R.drawable.btn_switch_on);            }else{                btnFlashlight.setBackgroundResource(R.drawable.btn_switch_off);            }        }   }}

打开和关闭手电筒的开关打开和关闭,但手电筒从未在我的Nexus 5背面打开.

我使用的相关权限如下:

<uses-permission androID:name="androID.permission.CAMERA" /><uses-permission androID:name="androID.permission.FLASHliGHT" /><uses-permission androID:name="androID.permission.VIBRATE" />

有人可以帮忙吗?

解决方法:

我也在努力解决同样的问题.您需要在布局中的按钮上方添加SurfacePrevIEw:

 <SurfaceVIEw    androID:ID="@+ID/PREVIEW"    androID:layout_wIDth="1dp"    androID:layout_height="1dp"/>

目前我的Fragment看起来像这样:

public class FlashlightFragment extends Fragment implements SurfaceHolder.Callback {Imagebutton btnSwitch;//flag to detect flash is on or offprivate boolean islighOn = false;private Camera camera;Parameters params;@OverrIDepublic voID onStart() {    super.onStart();    SurfaceVIEw prevIEw = (SurfaceVIEw)getVIEw().findVIEwByID(R.ID.PREVIEW);    SurfaceHolder mHolder = prevIEw.getHolder();    mHolder.addCallback(this);}@OverrIDepublic voID onPause(){    super.onPause();    turnOffFlash();}@OverrIDepublic VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container,                         Bundle savedInstanceState) {    VIEw vIEw = inflater.inflate(R.layout.flashlight_fragment,            container, false);    // flash switch button    btnSwitch = (Imagebutton) vIEw.findVIEwByID(R.ID.flashlight_button);    // displaying button image    togglebuttonImage();    // Switch button click event to toggle flash on/off    btnSwitch.setonClickListener(new VIEw.OnClickListener() {        @OverrIDe        public voID onClick(VIEw v) {            if (islighOn) {                // turn off flash                turnOffFlash();            } else {                // turn on flash                turnOnFlash();            }        }    });    return vIEw;}// Turning On flashprivate voID turnOnFlash() {    if (!islighOn) {        if (camera == null || params == null) {            return;        }        params = camera.getParameters();        params.setFlashMode(Parameters.FLASH_MODE_TORCH);        camera.setParameters(params);        camera.startPrevIEw();        islighOn = true;        // changing button/switch image        togglebuttonImage();    }}// Turning Off flashprivate voID turnOffFlash() {    if (islighOn) {        if (camera == null || params == null) {            return;        }        params = camera.getParameters();        params.setFlashMode(Parameters.FLASH_MODE_OFF);        camera.setParameters(params);        camera.stopPrevIEw();        islighOn = false;        // changing button/switch image        togglebuttonImage();    }}/* * Toggle switch button images * changing image states to on / off * */private voID togglebuttonImage(){    if(islighOn){        btnSwitch.setimageResource(R.drawable.icon_bulb_on);    }else{        btnSwitch.setimageResource(R.drawable.icon_bulb_off);    }}@OverrIDepublic voID surfaceChanged(SurfaceHolder holder,int format,int wIDth,int height)   {}@OverrIDepublic voID surfaceDestroyed(SurfaceHolder holder) {    if (camera != null) {        camera.stopPrevIEw();        camera.setPrevIEwCallback(null);        camera.release();        camera = null;    }}@OverrIDepublic voID surfaceCreated(SurfaceHolder holder) {    if (camera == null) {        camera = Camera.open();        params = camera.getParameters();        try {            camera.setPrevIEwdisplay(holder);        } catch (IOException e) {            camera.release();            camera = null;        }    }}

这似乎在我的Nexus 5上运行正常,但是在camera.setPrevIEwdisplay(mHolder)上Xperia Z上的强制关闭;我还没有能够解决这个问题.

希望这可以帮助.

总结

以上是内存溢出为你收集整理的Android片段中的手电筒 – SurfaceView全部内容,希望文章能够帮你解决Android片段中的手电筒 – SurfaceView所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1096099.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存