Android 通用型手电筒代码

 更新时间:2015年06月08日 16:56:35   投稿:hebedich  
说到手机手电筒功能,很多人都是直接调用闪光灯,而本文给大家介绍的是用相机功能来实现的,有需要的小伙伴可以参考下。

前几天这边一个小区断电,黑麻麻的,一只猫闯进寝室,把我吓哭,然后就果断写了个手电筒,下次断电,再来,我要吓死它。

我之前看到很多人都是直接调用闪光灯,其实大部分机型都不支持,我这个是用相机功能来实现的,大部分机型都支持。

MainActivity.class

public class MainActivity extends FragmentActivity {
 
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 
    if (isFlashSupported()) {
      if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction().add(R.id.container, new FlashlightFragment()).commit();
      }
    } else {
      showNoFlashAlert();
    }
  }
 
  private void showNoFlashAlert() {
    new AlertDialog.Builder(this)
        .setMessage(R.string.device_not_support_msg)
        .setIcon(android.R.drawable.ic_dialog_alert).setTitle(R.string.device_not_support_title)
        .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
 
          @Override
          public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            finish();
          }
        }).create().show();
  }
 
  private boolean isFlashSupported() {
    PackageManager pm = getPackageManager();
    return pm.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
  }
 
  public static class FlashlightFragment extends Fragment implements SurfaceHolder.Callback {
 
    public FlashlightFragment() { }
 
    ImageButton btnSwitch;
    ImageView bg;
    private boolean isLighOn = false;
 
    private Camera camera;
    Camera.Parameters params;
 
    @Override
    public void onStart() {
      super.onStart();
      SurfaceView preview = (SurfaceView) getView().findViewById(R.id.PREVIEW);
      SurfaceHolder mHolder = preview.getHolder();
      mHolder.addCallback(this);
    }
 
    @Override
    public void onPause() {
      super.onPause();
      turnOffFlash();
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View view = inflater.inflate(R.layout.fragment_main_activity, container, false);
 
      // flash switch button
      btnSwitch = (ImageButton) view.findViewById(R.id.flashlight_button);
 
      bg = (ImageView) view.findViewById(R.id.flashlight_bg);
 
      // displaying button image
      toggleBgImage();
 
      // Switch button click event to toggle flash on/off
      btnSwitch.setOnClickListener(new View.OnClickListener() {
 
        @Override
        public void onClick(View v) {
          if (isLighOn) {
            turnOffFlash();
          } else {
            turnOnFlash();
          }
        }
      });
 
      return view;
    }
 
    // Turning On flash
    private void turnOnFlash() {
 
      if (!isLighOn) {
        if (camera == null || params == null) {
          return;
        }
        params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
        camera.setParameters(params);
        camera.startPreview();
        isLighOn = true;
 
        toggleBgImage();
      }
 
    }
 
    // Turning Off flash
    private void turnOffFlash() {
 
      if (isLighOn) {
        if (camera == null || params == null) {
          return;
        }
 
        params = camera.getParameters();
        params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
        camera.setParameters(params);
        camera.stopPreview();
        isLighOn = false;
 
        toggleBgImage();
      }
    }
 
    private void toggleBgImage() {
      if (isLighOn) {
        bg.setImageResource(R.mipmap.f_on);
      } else {
        bg.setImageResource(R.mipmap.f_off);
      }
    }
 
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
 
    }
 
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
      if (camera != null) {
        camera.stopPreview();
        camera.setPreviewCallback(null);
        camera.release();
        camera = null;
      }
    }
 
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
      if (camera == null) {
        camera = Camera.open();
        params = camera.getParameters();
        try {
          camera.setPreviewDisplay(holder);
        } catch (IOException e) {
          camera.release();
          camera = null;
        }
      }
 
      turnOnFlash();
    }
 
  }
 
 
}

fragment_main_activity.xml

<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >
 
  <SurfaceView
    android:id="@+id/PREVIEW"
    android:layout_width="1dp"
    android:layout_height="1dp"/>
 
  <ImageView
    android:id="@+id/flashlight_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@mipmap/f_on"
    android:scaleType="centerCrop"
    />
 
  <ImageButton
    android:id="@+id/flashlight_button"
    android:layout_width="100dp"
    android:layout_height="200dp"
    android:layout_centerInParent="true"
    android:background="@android:color/transparent"
    android:text="fuck"/>
 
</RelativeLayout>

activity_main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:id="@+id/container"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       />

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.liujinghuiuncleapp.app.tool.flashlight" >
 
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.FLASHLIGHT" />
 
  <uses-feature android:name="android.hardware.camera" />
  <uses-feature android:name="android.hardware.camera.flash" />
 
  <application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:theme="@style/AppTheme"
    android:label="@string/app_name" >
    <activity
      android:name=".MainActivity"
      android:label="@string/app_name" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
 
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
 
</manifest>

以上所述就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • Android App中使用SurfaceView制作多线程动画的实例讲解

    Android App中使用SurfaceView制作多线程动画的实例讲解

    这篇文章主要介绍了Android App中使用SurfaceView制作多线程动画的实例讲解,SurfaceView经常被用来制作游戏中的动画,不过同时要注意画面闪烁的问题,需要的朋友可以参考下
    2016-04-04
  • Android利用OpenGLES绘制天空盒实例教程

    Android利用OpenGLES绘制天空盒实例教程

    这篇文章主要给大家介绍了关于Android利用OpenGLES绘制天空盒的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • Android 实现仿QQ拖拽气泡效果的示例

    Android 实现仿QQ拖拽气泡效果的示例

    这篇文章主要介绍了Android 实现仿QQ拖拽气泡效果的示例,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下
    2021-04-04
  • Android实现通讯录功能

    Android实现通讯录功能

    这篇文章主要为大家详细介绍了Android实现通讯录功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 详解Android中Service服务的基础知识及编写方法

    详解Android中Service服务的基础知识及编写方法

    这篇文章主要介绍了详解Android中Service服务的基础知识及编写方法,包括Service的启动流程及生命周期等基本内容,需要的朋友可以参考下
    2016-04-04
  • flutter 自定义websocket路由的实现

    flutter 自定义websocket路由的实现

    这篇文章主要介绍了flutter 自定义websocket路由的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Android 匿名内存深入分析

    Android 匿名内存深入分析

    这篇文章主要为大家介绍了Android 匿名内存深入分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android 基于Bitmap的四种图片压缩方式

    Android 基于Bitmap的四种图片压缩方式

    本文中探究的图片压缩方式主要是基于 Bitmap 的 api 实现。文中探究实现的压缩方式有四种:质量压缩、采样率压缩、Matrix 缩放压缩、图片编码格式压缩,感兴趣的朋友可以参考下
    2021-05-05
  • Android开发之文本内容自动朗读功能实现方法

    Android开发之文本内容自动朗读功能实现方法

    这篇文章主要介绍了Android开发之文本内容自动朗读功能实现方法,结合实例形式分析了Android自动朗读TTS功能的操作步骤、相关函数使用方法与注意事项,需要的朋友可以参考下
    2017-09-09
  • 详细介绍Android中回调函数机制

    详细介绍Android中回调函数机制

    这篇文章主要介绍了Android中回调函数机制,有需要的朋友可以参考一下
    2014-01-01

最新评论