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

Screenshot_20201014-132540.png

 

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: layoutactivity_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.javaonCreate()中產生兩個按鈕類別來連結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

arrow
arrow

    葛瑞斯肯 發表在 痞客邦 留言(0) 人氣()