文档章节

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

三岁打过熊
 三岁打过熊
发布于 2014/04/13 20:39
字数 1060
阅读 1225
收藏 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
631
0
为什么没有好用的Android游戏引擎?

随着Android平台的不断发展,近期Android开发者数量呈现出上升势头,就连以往较为冷门的游戏开发领域也涌现出不少生力军。然而,全新的问题正摆在了初学者面前,很多他们从未遇过的问题开始浮...

GWISOFT
2011/02/21
0
3
Android SDK目录结构介绍

Android SDK目录下有很多文件夹,主要都是干什么的呢? 1. add-ons 这里面保存着附加库,比如Google Maps,当然你如果安装了Ophone SDK,这里也会有一些类库在里面。 2. docs 这里面是Andro...

zplswf
2012/03/16
0
0
ViewPager嵌套GridView引发的一系列UI卡顿不顺畅的问题

由于项目要求,需要做一个日历的页面,做法采用ViewPgaer+GridView来做,初步过程很顺利,成型以后,出现UI现象有(1)Acitivity加载时间过长 (2)滑动Viewpager出现卡顿现象; 这两个问题看...

ice_Anson
2013/07/22
0
3
一款APP,从设计稿到切图(Android篇)

原文出处:BATLCK 依旧声明:这里写的依旧只是某一种工作方法,而不是一种规范,你可以参考,但不要照搬,在具体工作中,一定要灵活运用。 汇总贴,整理了之前零散的关于Android的文章……这...

BAT_LCK
2015/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python标准输入输出

input() 读取键盘输入 input() 函数从标准输入读入一行文本,默认的标准输入是键盘。 input 可以接收一个Python表达式作为输入,并将运算结果返回。 print()和format()输出 format()输出...

colinux
19分钟前
0
0
Python 核心编程 (全)

浅拷贝和深拷贝 1.浅拷贝:是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。相当于把变量里面指向的一个地址给了另一个变量就是浅拷贝,而没有创建一个新的对象,如a...

代码打碟手
31分钟前
0
0
PHP 对象比数组省内存?错!数组比对象省内存?错!

刚刚一个群里有人引出了 PHP 数组和对象占用内存谁多谁少的问题。我想起之前我好像也测试过这个问题,和群里人说的对象比数组节省内存的结论相反,我得出的是数组比对象节省内存。 但今天,我...

宇润
48分钟前
1
0
memcached命令行及其用法

21.5 memcached命令行 创建数据 yum install -y telnet 利用telnet命令连接memcached数据库 telnet 127.0.0.1 11211 #写入数据 set key2 0 30 212STORED 这个是错误的示范,因为0 30 已经...

lyy549745
48分钟前
0
0
Maven私服

Maven私服 一、简介 当多人项目开发的时候,尤其聚合项目开发,项目和项目之间需要有依赖关系,通过maven私服,可以保存互相依赖的jar包,这样的话就可把多个项目整合到一起。 如下图: Inst...

星汉
51分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部