Android 通用型手電筒代碼
前幾天這邊一個(gè)小區(qū)斷電,黑麻麻的,一只貓闖進(jìn)寢室,把我嚇哭,然后就果斷寫(xiě)了個(gè)手電筒,下次斷電,再來(lái),我要嚇?biāo)浪?/p>
我之前看到很多人都是直接調(diào)用閃光燈,其實(shí)大部分機(jī)型都不支持,我這個(gè)是用相機(jī)功能來(lái)實(shí)現(xiàn)的,大部分機(jī)型都支持。
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>
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
- Android 7.0 手電筒控制實(shí)現(xiàn)
- android通過(guò)led實(shí)現(xiàn)手電筒功能
- Android實(shí)現(xiàn)簡(jiǎn)單手電筒功能
- Android實(shí)現(xiàn)手電筒電源鍵關(guān)閉功能
- Android開(kāi)啟閃光燈的方法 Android打開(kāi)手電筒功能
- Android studio編寫(xiě)簡(jiǎn)單的手電筒APP
- Android Camera開(kāi)發(fā)手電筒功能
- Android中編寫(xiě)簡(jiǎn)單的手電筒小應(yīng)用的實(shí)例教程
- Android 開(kāi)啟閃光燈做手電筒的詳解
- Android手電筒兼容各個(gè)手機(jī)與版本
相關(guān)文章
Android 中WallpaperManager用法實(shí)例
這篇文章主要介紹了Android 中WallpaperManager用法實(shí)例的相關(guān)資料,希望通過(guò)本文能幫助到大家實(shí)現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09
ViewPager和SlidingPaneLayout的滑動(dòng)事件沖突解決方法
下面小編就為大家分享一篇ViewPager和SlidingPaneLayout的滑動(dòng)事件沖突解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Android LineChart繪制多條曲線(xiàn)的方法
這篇文章主要為大家詳細(xì)介紹了Android LineChart繪制多條曲線(xiàn)的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05
Android布局之RelativeLayout相對(duì)布局
RelativeLayout是相對(duì)布局控件:以控件之間相對(duì)位置或相對(duì)父容器位置進(jìn)行排列,下面通過(guò)本文給大家介紹Android布局之RelativeLayout相對(duì)布局,涉及到android relativelayout相對(duì)布局相關(guān)知識(shí),對(duì)android relativelayout相對(duì)布局相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2015-12-12
AndroidUI組件SlidingTabLayout實(shí)現(xiàn)ViewPager頁(yè)滑動(dòng)效果
這篇文章主要介紹了AndroidUI組件SlidingTabLayout實(shí)現(xiàn)ViewPager頁(yè)滑動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
internal修飾符探索kotlin可見(jiàn)性控制詳解
這篇文章主要為大家介紹了internal修飾符探索kotlin可見(jiàn)性控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
Android?自定義View?加?lifecycle?簡(jiǎn)單使用詳解
本文介紹了自定義View的基本使用方法,包括onMeasure、onDraw、自定義樣式和lifecycle的使用,通過(guò)了解MeasureSpec的作用和lifecycle的控制,可以更好地管理View的生命周期,避免內(nèi)存泄露問(wèn)題,感興趣的朋友一起看看吧2025-03-03

