编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/72581325

技术要点

  • android 权限适配
  • 打开关闭闪光灯

布局代码

//(layout)activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity" ><ImageButtonandroid:id="@+id/button01"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentBottom="true"android:background="@mipmap/off"android:text="@string/on" /><Buttonandroid:id="@+id/close"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignBottom="@+id/button01"android:layout_centerHorizontal="true"android:layout_marginBottom="5dp"android:textColor="#FFFFFF"android:background="@android:color/transparent"android:textSize="24sp"android:visibility="gone"android:text="@string/close" />
</RelativeLayout>

动画代码

//(res-anim)tween_ani.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"><!-- 透明度的变换  --><alpha android:fromAlpha="0.0"android:toAlpha="1.0"android:duration="2000"/><!-- 尺寸的变换  --><scaleandroid:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromXScale="0.0"android:toXScale="1.0"android:fromYScale="0.0"android:toYScale="1.0"android:pivotX="50%"android:pivotY="50%"android:duration="2000" /><!-- 位置的变换  --><translateandroid:fromXDelta="30"android:toXDelta="0"android:fromYDelta="30"android:toYDelta="0"android:duration="2000"/><!-- 实现旋转效果  --><rotateandroid:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromDegrees="0"android:toDegrees="+360"android:pivotX="50%"android:pivotY="50%"android:duration="2000"/>
</set>

activity代码

//MainActivity
import android.Manifest;
import android.content.pm.ActivityInfo;
import android.hardware.Camera;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.Toast;
import com.zhy.m.permission.MPermissions;
import com.zhy.m.permission.PermissionDenied;
import com.zhy.m.permission.PermissionGrant;public class MainActivity extends AppCompatActivity implements View.OnClickListener{private static final int MY_PERMISSIONS_REQUEST_CAMERA = 1;private MediaPlayer mMediaPlayer;private Button close;ImageButton imageButton = null;private Camera camera = null;public static boolean state = true;/*** 需要禁止屏幕的左右晃动*/@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 全屏设置,隐藏窗口所有装饰getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);// 设置屏幕显示无标题,必须启动就要设置好,否则不能再次被设置requestWindowFeature(Window.FEATURE_NO_TITLE);// 去掉锁屏界面getWindow().setFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD,WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);// 保持屏幕常亮getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);// 强制竖屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);setContentView(R.layout.activity_main);// 设置进入界面的音乐playSounds(R.raw.turnon);imageButton = (ImageButton) findViewById(R.id.button01);close = (Button) findViewById(R.id.close);// 进入界面的动画效果Animation ani = AnimationUtils.loadAnimation(MainActivity.this,R.anim.tween_ani);imageButton.startAnimation(ani);close.setOnClickListener(this);close.setVisibility(View.VISIBLE);// ImageButton的监听器imageButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {MPermissions.requestPermissions(MainActivity.this, MY_PERMISSIONS_REQUEST_CAMERA, Manifest.permission.CAMERA);}});}/*** 关闭手电筒*/private void closeFlashLight() {try {Camera.Parameters parameters = camera.getParameters();parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);camera.setParameters(parameters);camera.stopPreview();camera.release();camera = null;} catch (Exception e) {e.printStackTrace();}}/*** 打开手电筒*/private void openFlashLight() {try {camera = Camera.open();// 点击按钮的声音
//            playSounds(R.raw.apple);camera.startPreview();Camera.Parameters parameters = camera.getParameters();parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);camera.setParameters(parameters);} catch (Exception e) {e.printStackTrace();}}@Overrideprotected void onStop() {// 如果不调用此方法,则按home键的时候会出现图标无法显示的情况。super.onStop();}@Overrideprotected void onDestroy() {super.onDestroy();}/*** 播放声音代码*/private void playSounds(int sid) {if (mMediaPlayer != null) {if (mMediaPlayer.isPlaying()) {mMediaPlayer.stop();}mMediaPlayer.release();mMediaPlayer = null;}mMediaPlayer = MediaPlayer.create(MainActivity.this, sid);// 开始播放mMediaPlayer.start();}@Overridepublic void onClick(View view) {switch (view.getId()) {case R.id.close:finish();break;}}@Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {MPermissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);super.onRequestPermissionsResult(requestCode, permissions, grantResults);}//点击始终允许 申请到了权限的操作@PermissionGrant(MY_PERMISSIONS_REQUEST_CAMERA)public void requestSdcardSuccess() {// 进行权限申请成功之后的操作insertDummyContact();Toast.makeText(this, "Permission Permitted!", Toast.LENGTH_SHORT).show();}private void insertDummyContact() {// 打开手电筒if (state) {// 点击按钮的声音playSounds(R.raw.click);openFlashLight();// 换背景imageButton.setBackground(getResources().getDrawable(R.mipmap.on));close.setVisibility(View.INVISIBLE);state = false;// 关闭手电筒} else {// 点击按钮的声音playSounds(R.raw.click);closeFlashLight();imageButton.setBackground(getResources().getDrawable(R.mipmap.off));close.setVisibility(View.VISIBLE);state = true;}}// 点击禁止 不申请权限的操作 Toast @PermissionDenied(MY_PERMISSIONS_REQUEST_CAMERA)public void requestSdcardFailed() {Toast.makeText(this, "Permission Denied!", Toast.LENGTH_SHORT).show();}
}

  注意添加权限:

    <uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.hardware.camera" /><uses-feature android:name="android.hardware.autofocus"/><!-- 开启闪光灯权限 --><uses-permission android:name="android.permission.FLASHLIGHT"/><uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

  android 权限适配使用的是 MPermissions框架,如对使用有疑问请参考:
  Android M(Android 6.0)运行时权限开发详细解析 http://blog.csdn.net/zxc514257857/article/details/72190357

  代码在7.0手机上可能无法打开闪光灯,4.2 和6.0手机测试可以打开

Demo下载请移步:http://download.csdn.net/detail/zxc514257857/9847693

> ----------**因本人才疏学浅,如博客或Demo中有错误的地方请大家随意指出,与大家一起讨论,共同进步,谢谢!**----------

Android使用闪光灯作为手电筒的简单实现相关推荐

  1. android 6.0 手电筒app简单实现

    我最近在写一个手电筒的app,需要兼容android 6.0但是网上很多都是很久以前的代码,android M的基本上没有什么资料,今天就和大家聊一聊,写的不好的地方大家多多指教,不多说直接上代码: ...

  2. [Android] 如何制作手电筒程序

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

  3. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  4. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

  5. Android原生绘图进度条+简单自定义属性代码生成器

    零.前言 1.感觉切拼字符串是个很有意思的事,好的拼接方式可以自动生成一些很实用的东西 2.本文自定义控件并不是很高大上的东西,目的在于计录自定义控件的书写规范与行文流程 3.建议大家自定义控件时自定 ...

  6. 手电筒android studio,Android Studio:手电筒关闭时崩溃

    我试图开发手电筒应用程序作为我的第一个"真正"的应用程序,几乎所有的工作.但每次我想关闭手电筒时,我的应用程序都会崩溃.代码和logcat的日志如下:Android Studio: ...

  7. android 简单实现圆角,Android 实现圆角图片的简单实例

    Android 实现圆角图片的简单实例 实现效果图: 本来想在网上找个圆角的例子看一看,不尽人意啊,基本都是官方的Demo的那张原理图,稍后会贴出.于是自己自定义了个View,实现图片的圆角以及圆形效 ...

  8. Android之播放一首简单的音乐

    1.首先,创建一个项目,名为Mp3Test,创建完之后打开res目录下的layout下的activity_main.xml文件,打开src下的MainActivity.java文件,首先,先把布局文件 ...

  9. Android监听作用,Android开发之CheckBox的简单使用与监听功能示例

    本文实例讲述了Android开发之CheckBox的简单使用与监听功能.分享给大家供大家参考,具体如下: activity_main.xml android:layout_width="ma ...

最新文章

  1. Oracle数据库游标在存储过程中的使用
  2. OpenCV2.4.4中调用SIFT特征检测器进行图像匹配
  3. 剑指offer(20)包含min函数的栈
  4. 统计list里面相同元素个数_LeetCode 第 347 号问题:前 K 个高频元素
  5. 具有管理计算机全部硬件,2012河北省事业单位招聘考试真题演练汇总
  6. LINUX异步信号集合示例代码
  7. PHP实现微博的同步发送(转)
  8. MODIS数据下载之USGS下载流程
  9. timestamp和datetime的区别
  10. ContentRoot 和 WebRoot 的区别
  11. Java-模拟新浪微博用户注册功能实现(控制台程序)
  12. IDEA社区版详细安装2022最新版(保姆式)
  13. HDL4SE:软件工程师学习Verilog语言(十六)
  14. 基于ASAM ODS标准的试验数字化平台-WDP
  15. mac上如何找到隐藏文件夹/文件图片步骤(两种方法)
  16. 访傲林科技董事长刘震:用企业级数字孪生掘金工业互联网
  17. 文本处理工具及正则表达式
  18. php socket获取客户端IP地址
  19. 华为大数据平台凭什么成为行业领跑者?
  20. kingview3d在楼宇行业的应用

热门文章

  1. 颜色的前世今生5·色调和补色
  2. 如何将STM32F103ZET6的工程改为STM32F103CBT6的工程
  3. 学以致用——利用直方图分析个股涨幅(Excel+Spotfire)
  4. 【6】实战:利用re模块爬取淘宝商品信息
  5. Process的waitFor死锁问题以及解决方案
  6. 在 Mac 上使用 Siri的方法
  7. a的充分条件是什么意思;a的必要条件是什么意思;a是b的充分条件是什么意思;
  8. 《剑指offer》【树的子结构】(python版)
  9. 说句心里话python编程_仓颉Ziv
  10. Oracle 快速入门 触发器游标