這個方法適用於Android API 24 以下(包含),API 25以上用別的方法,預計成果的畫面:

Step1: 建立一個empty activity並且在 AndroidManifest.xml 中加入下述權限:
<uses-permission android:name="android.permission.FLASHLIGHT" />
<uses-permission android:name="android.permission.CAMERA" />
|
Step2: 在MainActivity.java 的onCreate中加入取得權限的程式碼,如下:
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int readPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(readPermission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
}
}
}
|
Step3: 在layout的activity_main.xml中建立兩個按鈕,程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<Button
android:id="@+id/on"
android:layout_width="125dp"
android:layout_height="61dp"
android:layout_marginStart="160dp"
android:layout_marginLeft="160dp"
android:layout_marginTop="184dp"
android:text="開手電筒"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/off"
android:layout_width="117dp"
android:layout_height="57dp"
android:layout_marginBottom="40dp"
android:text="關手電筒"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/on"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/on"
app:layout_constraintTop_toBottomOf="@+id/on"
app:layout_constraintVertical_bias="1.0" />
</androidx.constraintlayout.widget.ConstraintLayout>
|
Step4: 之後在MainActivity.java的onCreate()中產生兩個按鈕類別來連結layout上的兩個按鈕,跟Step2的程式碼只差在紅色字部分。
private static final int REQUEST = 1;
Button flashlightOn, flashlightOff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int readPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(readPermission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
}
//取得layout上的連結
flashlightOn = findViewById(R.id.on);
flashlightOff = findViewById(R.id.off);
}
|
Step5: 將兩個按鈕分別註冊Listener事件,並且撰寫開啟閃光燈與關閉閃光燈的觸發程式,最後完整版程式碼如下:
package tw.idv.ken.flashlightdemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final int REQUEST = 1;
Button flashlightOn, flashlightOff;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
int readPermission = ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
if(readPermission!= PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
} else {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CAMERA}, REQUEST);
}
//取得layout上的連結
flashlightOn = findViewById(R.id.on);
flashlightOff = findViewById(R.id.off);
//註冊listener
flashlightOn.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
open();
}
});
flashlightOff.setOnClickListener(new View.OnClickListener(){
public void onClick(View v){
close();
}
});
}
Camera mCamera = null; //設定為全域變數
Camera.Parameters parameters; //camera參數
//開啟閃光燈
public void open() {
mCamera = Camera.open();
parameters = mCamera.getParameters(); //取得Camera的參數
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
}
//關閉閃光燈
public void close() {
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); //取得Camera的參數
mCamera.setParameters(parameters);
mCamera.release(); //使用完記得釋放掉
}
}
|
Reference:
https://stockwfj3.pixnet.net/blog/post/116904140