文档章节

新手学习android做得一个闪光灯手电筒(测试过很多机型都可以)

三岁打过熊
 三岁打过熊
发布于 2014/04/13 20:39
字数 1060
阅读 1234
收藏 54

看到很多刚学习的同志都很纠结按照网上很多代码的实现方法都打开不了闪光灯,确实刚开始也有同感滴啦!希望能给你们一些思路!

废话不多说先上几张图片(有图有真像哦!!!!!!!)

 

思路:开启闪光灯的方法

我是这样做的

 package com.cai.helloworld;
import java.io.IOException;
import android.content.Context;
import android.hardware.Camera;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class CameraPreview extends SurfaceView implements
  SurfaceHolder.Callback {
 private Camera mCamera;
 private SurfaceHolder mHolder;
 public static final String TAG = "CameraPreview";
 public CameraPreview(Context context) {
  super(context);
 }
 @SuppressWarnings("deprecation")
 public CameraPreview(Context context, Camera camera) {
  super(context);
  mCamera = camera;
  mHolder = getHolder();
  mHolder.addCallback(this);
  // deprecated setting, but required on Android versions prior to 3.0
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  // The Surface has been created, now tell the camera where to draw the
  // preview.
  try {
   mCamera.setPreviewDisplay(holder);
   mCamera.startPreview();
  } catch (IOException e) {
   Log.d(TAG, "Error setting camera preview: " + e.getMessage());
  }
 }
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
   int height) {
  // If your preview can change or rotate, take care of those events here.
  // Make sure to stop the preview before resizing or reformatting it.
  if (mHolder.getSurface() == null) {
   // preview surface does not exist
   return;
  }
  // stop preview before making changes
  try {
   mCamera.stopPreview();
  } catch (Exception e) {
   // ignore: tried to stop a non-existent preview
  }
  // set preview size and make any resize, rotate or
  // reformatting changes here
  // start preview with new settings
  try {
   mCamera.setPreviewDisplay(mHolder);
   mCamera.startPreview();
  } catch (Exception e) {
   Log.d(TAG, "Error starting camera preview: " + e.getMessage());
  }
 }
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
  // TODO Auto-generated method stub
 }
}

获取CameraPreview后就可以对闪光灯进行操作

下面就是手电筒Demo的例子:

 package com.cai.helloworld;
import java.util.List;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.provider.Settings;
import android.app.Activity;
import android.content.ContentResolver;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.Toast;
public class MainActivity extends Activity {
 protected static final String TAG = ">>>>>>>MainActivity";
 private Camera mCamera;
 private CameraPreview mPreview;
 private FrameLayout preview;
 private boolean isopent;
 private boolean isCameraExist;
 private ImageButton captureButton;
 private int defualtLigth;
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  setContentView(R.layout.activity_main);
  defualtLigth = getScreenBrightness(this);
  isCameraExist = checkCameraHardware(this);
  if (isCameraExist) {
   controlFlashLigth();
  } else {
   Toast.makeText(this, "您的设备没有照相功能或者此功能不可用", Toast.LENGTH_LONG)
     .show();
  }
 }
 public void controlFlashLigth() {
  // Create an instance of Camera
  captureButton = (ImageButton) findViewById(R.id.button_capture);
  mCamera = getCameraInstance();
  // Create our Preview view and set it as the content of our
  // activity.
  mPreview = new CameraPreview(this, mCamera);
  preview = (FrameLayout) findViewById(R.id.camera_preview);
  preview.addView(mPreview);
  preview.setVisibility(View.INVISIBLE);
  captureButton.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    if (!isopent) {
     v.setBackgroundResource(R.drawable.flashlight_on);
     Toast.makeText(getApplicationContext(), "手电筒已开启",
       Toast.LENGTH_SHORT)
     .show();
     turnLightOn(mCamera);
     isopent = true;
    } else {
     v.setBackgroundResource(R.drawable.flashlight_off);
     Toast.makeText(getApplicationContext(), "手电筒已关闭",
     Toast.LENGTH_SHORT).show();
     turnLightOFF(mCamera);
     isopent = false;
    }
   }
  });
 }
 /** A safe way to get an instance of the Camera object. */
 public static Camera getCameraInstance() {
  Camera c = null;
  try {
   c = Camera.open(); // attempt to get a Camera instance
  } catch (Exception e) {
   // Camera is not available (in use or does not exist)
  }
  return c; // returns null if camera is unavailable
 }
 /** Check if this device has a camera */
 public boolean checkCameraHardware(Context context) {
  if (context.getPackageManager().hasSystemFeature(
    PackageManager.FEATURE_CAMERA)) {
   // this device has a camera
   return true;
  } else {
   // no camera on this device
   return false;
  }
 }
 @Override
 protected void onResume() {
  super.onResume();
  Log.e(TAG, "onResume>>>>>runtime");
 }
 @Override
 protected void onPause() {
  super.onPause();
  Log.e(TAG, "onPause>>>>>runtime");
 }
 @Override
 protected void onDestroy() {
  super.onDestroy();
  Log.e(TAG, "onDestroy>>>>>runtime");
  releaseCamera();
 }
 @Override
 protected void onStop() {
  super.onStop();
  Log.e(TAG, "HomeANXIALE>>>onStop>>>>>runtime");
 }
 private void releaseCamera() {
  if (mCamera != null) {
   mCamera.release(); // release the camera for other applications
   mCamera = null;
  }
 }
 public void turnLightOn(Camera mCamera) {
  if (mCamera == null) {
   return;
  }
  Parameters parameters = mCamera.getParameters();
  if (parameters == null) {
   return;
  }
  List<String> flashModes = parameters.getSupportedFlashModes();
  // Check if camera flash exists
  if (flashModes == null) {
   // Use the screen as a flashlight (next best thing)
   captureButton.setBackgroundColor(this.getResources().getColor(
     R.color.white));
   setBrightness(this, 255);
   return;
  }
  String flashMode = parameters.getFlashMode();
  if (!Parameters.FLASH_MODE_TORCH.equals(flashMode)) {
   // Turn on the flash
   if (flashModes.contains(Parameters.FLASH_MODE_TORCH)) {
    parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
    mCamera.setParameters(parameters);
   } else {
   }
  }
 }
 public void turnLightOFF(Camera mCamera) {
  if (mCamera == null) {
   return;
  }
  Parameters parameters = mCamera.getParameters();
  if (parameters == null) {
   return;
  }
  List<String> flashModes = parameters.getSupportedFlashModes();
  // Check if camera flash exists
  if (flashModes == null) {
   setBrightness(this, defualtLigth);
   // Use the screen as a flashlight (next best thing)
   return;
  }
  String flashMode = parameters.getFlashMode();
  if (!flashMode.equals(Parameters.FLASH_MODE_OFF)) {
   // Turn on the flash
   if (flashModes.contains(Parameters.FLASH_MODE_OFF)) {
    parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
    mCamera.setParameters(parameters);
   } else {
   }
  }
 }
 /**
  * 获取屏幕的亮度
  * 
  * @param activity
  * @return
  */
 public static int getScreenBrightness(Activity activity) {
  int nowBrightnessValue = 0;
  ContentResolver resolver = activity.getContentResolver();
  try {
   nowBrightnessValue = android.provider.Settings.System.getInt(
     resolver, Settings.System.SCREEN_BRIGHTNESS);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return nowBrightnessValue;
 }
 /**
  * 设置屏幕的亮度
  * 
  * @param activity
  * @return
  */
 public static void setBrightness(Activity activity, int brightness) {
  // Settings.System.putInt(activity.getContentResolver(),
  // Settings.System.SCREEN_BRIGHTNESS_MODE,
  // Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL);
  WindowManager.LayoutParams lp = activity.getWindow().getAttributes();
  lp.screenBrightness = Float.valueOf(brightness) * (1f / 255f);
  // lp.screenBrightness =(brightness) * (1f / 255f);
  activity.getWindow().setAttributes(lp);
    }
}

接下来就是新建一个布局文件activity_main.xml

布局中用到Framelayout,首先camera_preview用于获取camerapreview,之后用ImageButton对其进行覆盖。

 <FrameLayout xmlns:android=""
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
    <ImageButton
        android:id="@+id/button_capture"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@drawable/flashlight_off"
        android:layout_gravity="center" />
</FrameLayout>

第一次写这个也不知道要说些什么,有什么看不懂的可以留言提问,会及时回答的

 

© 著作权归作者所有

共有 人打赏支持
三岁打过熊
粉丝 0
博文 1
码字总数 1060
作品 0
武汉
私信 提问
加载中

评论(3)

ProgrammerHu
ProgrammerHu
挺好的,学习了
c
cufrancis
写安卓程序太可怕了,就一个手电筒就这么多代码了。。。
myoschinavip
myoschinavip
支持一下。。。
[Android] 如何制作手电筒程序

继iphone的手电筒开发完成后,接下来我便著手开始Android如何制作手电筒的程序 我的跨平台引擎框架CloudBox已建立好iphone版的程序,但却对于Android上如何操控闪光灯一无所知 因此我做了个小...

长平狐
2012/10/08
636
0
android 闪光灯手电筒 源码

a android 闪光灯手电筒 源码 仿小米手电筒 不知道这边如何添加附件 提供下下载链接把 http://www.eoeandroid.com/thread-263063-1-1.html...

onecold0818
2013/03/22
1K
0
android手电筒如何调节闪光灯亮度

android手电筒 用什么方法能够实现闪光灯亮度的调节?? 求大神指教 !!

AsunaF
2013/11/29
825
0
求 android 手电筒 程序源码一份,谢谢

求 android 手电筒 程序源码一份,谢谢 我的手机型号:nexus S (三星i9023),系统版本4.1,开发工具eclipse 在网上下载的代码,安装到手机,没有打开闪光灯, 程序代码是:调用camer的参数...

我的CSharp时代
2013/04/10
204
0
Android后台保活实践总结:即时通讯应用无法根治的“顽疾”

前言 Android进程和Service的保活,是困扰Android开发人员的一大顽疾。因涉及到省电和内存管理策略,各厂商基于自家的理解,在自已ROOM发布于都对标准Android发行版作为或多或少的改动,使得...

JackJiang-
2016/07/15
576
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7安装RabbitMQ详细过程

由于RabbitMQ是基于Erlang语言开发,所以在安装RabbitMQ之前,需要先安装Erlang 1、环境: centos 7.1 内核版本3.10.0-229.el7.x86_64 Erlang 19.0.4版本 RabbitMQ 3.6.14版本 2、在线安装E...

秋至丶枫以落
9分钟前
0
0
6个使用KeePassX保护密码的技巧

虽然安全是个深奥的主题,但是你可以遵循几个简单的日常习惯来减小攻击面。本文将解释确保密码信息安全的重要性,并给出如何充分利用KeePassX的建议。 日益互联的数字世界使安全成为一个重要...

Linux就该这么学
11分钟前
0
0
2018最佳GAN论文回顾(下)

继上一篇《2018最佳GAN论文回顾(上)》,我又继续介绍了一个对于GAN的基于样式的生成器体系结构的新论文,提出了一个新的模型来应对这种挑战。 一种用于生成式对抗网络的基于生成器体系结构...

阿里云官方博客
13分钟前
0
0
UnsatisfiedLinkError sawindbg.dll

方法:搜索sawindbg.dll,然后将文件报错的目录下

洛水
49分钟前
5
0
说说不知道的Golang中参数传递

本文由云+社区发表 导言 几乎每一个C++开发人员,都被面试过有关于函数参数是值传递还是引用传递的问题,其实不止于C++,任何一个语言中,我们都需要关心函数在参数传递时的行为。在golang中...

腾讯云加社区
50分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部