我正在尝试为本地音乐会开发手电筒应用程序.这是一个更大的应用程序的一部分,所以它是一个片段.这是代码:
首先,我将该类与其变量一起声明:
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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)