Android에서 프로그래밍 방식으로 전면 플래시 라이트를 켜는 방법은 무엇입니까?
Android에서 전면 플래시 라이트(카메라 미리 보기가 아닌)를 프로그래밍 방식으로 켜려고 합니다.나는 그것을 검색했지만 내가 찾은 도움말은 나를 이 페이지로 안내했습니다.
링크나 샘플 코드를 가지고 있는 사람이 있습니까?
2021년의 경우 Camera X를 사용하면 이제 매우 쉽습니다. https://stackoverflow.com/a/66585201/294884
이 문제에 대해 다음을 수행해야 합니다.
손전등을 사용할 수 있는지 확인하십시오.
그렇다면 해제/설정
그렇지 않다면 앱의 필요에 따라 무엇이든 할 수 있습니다.
디바이스에서 플래시 가용성 확인:
다음을 사용할 수 있습니다.
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
플래시를 사용할 수 있으면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
항목
http://developer.android.com/reference/android/content/pm/PackageManager.html 은 다음과 같습니다.
손전등 켜기/끄기:
저는 구글에서 안드로이드에 대해 알아봤습니다.허가.손전등.Android 매니페스트의 허가는 유망해 보입니다.
<!-- Allows access to the flashlight -->
<permission android:name="android.permission.FLASHLIGHT"
android:permissionGroup="android.permission-group.HARDWARE_CONTROLS"
android:protectionLevel="normal"
android:label="@string/permlab_flashlight"
android:description="@string/permdesc_flashlight" />
그런 다음 카메라를 사용하여 카메라를 설정합니다.매개 변수.여기서 사용되는 기본 매개 변수는 FLASH_MODE_TORCH입니다.
예를 들면
카메라 손전등을 켜는 코드 조각입니다.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
카메라 LED 조명을 끄는 코드 조각입니다.
cam.stopPreview();
cam.release();
저는 방금 이 허가를 사용하는 프로젝트를 찾았습니다.빠른 설정의 rc 코드를 확인합니다.여기 http://code.google.com/p/quick-settings/ (참고:이제 이 링크가 끊어졌습니다.)
Flashlight에 대해서는 http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/ #quick-light/src/com/bwx/bequick/flashlight를 직접 확인하십시오(참고:이제 이 링크가 끊어졌습니다.)
업데이트 6 갤럭시 넥서스에서 어떤 API로 제어할 수 있는 이 답변 LED 손전등에 설명된 대로 서피스 뷰를 추가할 수도 있습니까?이것은 많은 전화기에서 작동하는 해결책인 것 같습니다.
업데이트 5 주요 업데이트
(위의 끊어진 링크에 대한) 다른 링크를 찾았습니다: http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm 이제 이 링크를 사용할 수 있습니다.[업데이트: 2012년 9월 14일 현재 이 링크가 끊어졌습니다.]
업데이트 1
다른 오픈 소스 코드: http://code.google.com/p/torch/source/browse/
업데이트 2
Motorola Droid에서 LED를 활성화하는 방법을 보여주는 예: http://code.google.com/p/droidled/
다른 오픈 소스 코드:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
업데이트 3(카메라 LED 켜기/끄기용 위젯)
카메라 LED를 켜거나 끄는 위젯을 개발하려면 안드로이드에서 카메라 손전등을 켜거나 끄는 위젯을 참조해야 합니다.
업데이트 4
카메라 LED에서 나오는 빛의 세기를 설정하려면 Android 장치의 LED 세기를 변경할 수 있습니까?를 참조하십시오.만석의 우편루트 HTC 장치만 이 기능을 지원합니다.
문제:**
또한 손전등을 켜거나 끄는 동안에도 몇 가지 문제가 발생합니다. 예를 들어 장치가 없는 경우FLASH_MODE_TORCH손전등이 켜지지 않는 등의 경우에도 손전등이 켜지지 않습니다.
일반적으로 삼성은 많은 문제를 일으킵니다.
아래 목록의 문제를 참조할 수 있습니다.
삼성 갤럭시 에이스 2.2.1 & 갤럭시 탭에서 카메라 LED/플래시 라이트 켜기/끄기
API 23 이상 (Android M, 6.0)
코드 켜기
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = null;
try {
cameraId = camManager.getCameraIdList()[0];
camManager.setTorchMode(cameraId, true); //Turn ON
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
코드 끄기
camManager.setTorchMode(cameraId, false);
및 권한
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
추가 편집
사람들이 여전히 제 대답에 찬성표를 던져서 저는 추가 코드를 올리기로 결정했습니다. 이것이 그 당시의 문제에 대한 저의 해결책이었습니다.
public class FlashlightProvider {
private static final String TAG = FlashlightProvider.class.getSimpleName();
private Camera mCamera;
private Camera.Parameters parameters;
private CameraManager camManager;
private Context context;
public FlashlightProvider(Context context) {
this.context = context;
}
private void turnFlashlightOn() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
String cameraId = null;
if (camManager != null) {
cameraId = camManager.getCameraIdList()[0];
camManager.setTorchMode(cameraId, true);
}
} catch (CameraAccessException e) {
Log.e(TAG, e.toString());
}
} else {
mCamera = Camera.open();
parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
}
private void turnFlashlightOff() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
try {
String cameraId;
camManager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE);
if (camManager != null) {
cameraId = camManager.getCameraIdList()[0]; // Usually front camera is at 0 position.
camManager.setTorchMode(cameraId, false);
}
} catch (CameraAccessException e) {
e.printStackTrace();
}
} else {
mCamera = Camera.open();
parameters = mCamera.getParameters();
parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF);
mCamera.setParameters(parameters);
mCamera.stopPreview();
}
}
}
내, 의 응용 과 가로 방향되었다면, .cam정적으로그렇지않으면,onDestroy()방향 전환 시 호출되지만 카메라를 해제하지 않으므로 다시 열 수 없습니다.
package com.example.flashlight;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.view.Menu;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
public static Camera cam = null;// has to be static, otherwise onDestroy() destroys it
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
public void flashLightOn(View view) {
try {
if (getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA_FLASH)) {
cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getBaseContext(), "Exception flashLightOn()",
Toast.LENGTH_SHORT).show();
}
}
public void flashLightOff(View view) {
try {
if (getPackageManager().hasSystemFeature(
PackageManager.FEATURE_CAMERA_FLASH)) {
cam.stopPreview();
cam.release();
cam = null;
}
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getBaseContext(), "Exception flashLightOff",
Toast.LENGTH_SHORT).show();
}
}
}
이 대사를 써야 한다는 걸 보여주기 위해
<uses-permission android:name="android.permission.CAMERA" />
http://developer.android.com/reference/android/hardware/Camera.html 에서
위에 제시된 대사들은 제게 맞지 않았습니다.
아래의 간단한 3단계로 오토플래시 조명을 받았습니다.
- 방금 Manifest.xml 파일에 카메라 및 플래시 권한을 추가했습니다.
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-permission android:name="android.permission.FLASHLIGHT"/> <uses-feature android:name="android.hardware.camera.flash" android:required="false" />
카메라 코드에서 이 방법을 수행합니다.
//Open Camera Camera mCamera = Camera.open(); //Get Camera Params for customisation Camera.Parameters parameters = mCamera.getParameters(); //Check Whether device supports AutoFlash, If you YES then set AutoFlash List<String> flashModes = parameters.getSupportedFlashModes(); if (flashModes.contains(android.hardware.Camera.Parameters.FLASH_MODE_AUTO)) { parameters.setFlashMode(Parameters.FLASH_MODE_AUTO); } mCamera.setParameters(parameters); mCamera.startPreview();빌드 + 실행 —> 이제 밝기 조절 영역 및 스냅 사진으로 이동합니다. 장치가 지원하는 경우 자동 플래시 표시등이 켜집니다.
안드로이드 롤리팝은 camera2 API를 도입하고 기존 카메라 API를 폐지했습니다.그러나 사용되지 않는 API를 사용하여 플래시를 켜는 것은 여전히 작동하며 새 API를 사용하는 것보다 훨씬 간단합니다.
새로운 API는 전용 풀 기능 카메라 앱에서 사용하기 위한 것으로 보이며 설계자들은 손전등을 켜는 것과 같은 단순한 사용 사례를 실제로 고려하지 않은 것으로 보입니다.이제 카메라 관리자를 불러와 더미 서페이스로 캡처 세션을 만들고 마지막으로 캡처 요청을 만들고 시작해야 합니다.예외 처리, 리소스 정리 및 긴 콜백 포함!
롤리팝 이상에서 손전등을 켜는 방법을 보려면 AOSP 프로젝트의 손전등 컨트롤러를 살펴보십시오(오래된 사용 API가 수정됨에 따라 최신 버전을 찾으십시오).필요한 권한을 설정하는 것을 잊지 마십시오.
안드로이드 마시멜로는 마침내 세트 토치 모드로 플래시를 켤 수 있는 간단한 방법을 소개했습니다.
Android 버전에 따라 카메라 플래시에 액세스하는 방법은 다양합니다.몇 개의 API가 롤리팝에서 작동을 멈췄다가 마시멜로에서 다시 변경되었습니다.이를 극복하기 위해 몇 가지 프로젝트에서 사용하던 간단한 라이브러리를 만들어 좋은 결과를 내고 있습니다.아직 미완성이지만, 코드를 확인하고 누락된 조각을 찾을 수 있습니다.여기 링크가 있습니다 - Nooob Camera Flash.
코드를 통합하려면 그라들을 사용하면 됩니다.여기 지침이 있습니다(Readme에서 직접 발췌).
1단계. JitPack 저장소를 빌드 파일에 추가합니다.저장소 끝에 있는 root build.gradle에 추가합니다.
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2단계. 종속성 추가
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
사용.
초기화NoobCameraManager싱글톤
NoobCameraManager.getInstance().init(this);
디버그 로깅에 대한 로그 수준을 선택적으로 설정할 수 있습니다.로깅은 LumberJack 라이브러리를 사용합니다.기본 LogLevel은 다음과 같습니다.LogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
그런 다음 싱글톤을 호출하여 카메라 플래시를 켜거나 끄면 됩니다.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
Noob Camera Manager를 초기화하기 전에 직접 카메라에 액세스할 수 있는 런타임 권한을 처리해야 합니다.0.1.2 이전 버전에서는 라이브러리에서 직접 사용 권한을 지원했지만 Activity 개체에 대한 종속성 때문에 제거해야 합니다.
플래시 전환도 쉽습니다.
if(NoobCameraManager.getInstance().isFlashOn()){
NoobCameraManager.getInstance().turnOffFlash();
}else{
NoobCameraManager.getInstance().turnOnFlash();
}
Android Flashlight 앱에 대한 전체 코드
매니페스트
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.user.flashlight"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="17"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<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>
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" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OFF"
android:id="@+id/button"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:onClick="turnFlashOnOrOff" />
</RelativeLayout>
기본 활동.java
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import java.security.Policy;
public class MainActivity extends AppCompatActivity {
Button button;
private Camera camera;
private boolean isFlashOn;
private boolean hasFlash;
Parameters params;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.button);
hasFlash = getApplicationContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
if(!hasFlash) {
AlertDialog alert = new AlertDialog.Builder(MainActivity.this).create();
alert.setTitle("Error");
alert.setMessage("Sorry, your device doesn't support flash light!");
alert.setButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
alert.show();
return;
}
getCamera();
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isFlashOn) {
turnOffFlash();
button.setText("ON");
} else {
turnOnFlash();
button.setText("OFF");
}
}
});
}
private void getCamera() {
if (camera == null) {
try {
camera = Camera.open();
params = camera.getParameters();
}catch (Exception e) {
}
}
}
private void turnOnFlash() {
if(!isFlashOn) {
if(camera == null || params == null) {
return;
}
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_TORCH);
camera.setParameters(params);
camera.startPreview();
isFlashOn = true;
}
}
private void turnOffFlash() {
if (isFlashOn) {
if (camera == null || params == null) {
return;
}
params = camera.getParameters();
params.setFlashMode(Parameters.FLASH_MODE_OFF);
camera.setParameters(params);
camera.stopPreview();
isFlashOn = false;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
@Override
protected void onPause() {
super.onPause();
// on pause turn off the flash
turnOffFlash();
}
@Override
protected void onRestart() {
super.onRestart();
}
@Override
protected void onResume() {
super.onResume();
// on resume turn on the flash
if(hasFlash)
turnOnFlash();
}
@Override
protected void onStart() {
super.onStart();
// on starting the app get the camera params
getCamera();
}
@Override
protected void onStop() {
super.onStop();
// on stop release the camera
if (camera != null) {
camera.release();
camera = null;
}
}
}
2022년 코틀린 버전:
fun Context.isFlashLightAvailable() = packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH)
val Context.camaraManager: CameraManager get() = getSystemService(CameraManager::class.java)
fun Context.toggleFlashLight(on: Boolean) {
camaraManager.run {
val firstCameraWithFlash = cameraIdList.find { camera ->
getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
}
firstCameraWithFlash?.let {
runCatching { setTorchMode(it, on) }.onFailure { Timber.e(it, "Error setTorchMode") }
} ?: Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")
}
}
또는 결과를 반환하는 일시 중단 기능이 있는 경우
suspend fun Context.toggleFlashLightWithResult(on: Boolean): Boolean {
return suspendCancellableCoroutine { cont ->
runCatching {
camaraManager.run {
val firstCameraWithFlash = cameraIdList.find { camera ->
getCameraCharacteristics(camera).keys.any { it == FLASH_INFO_AVAILABLE }
}
val callback = object : CameraManager.TorchCallback() {
override fun onTorchModeChanged(cameraId: String, enabled: Boolean) {
super.onTorchModeChanged(cameraId, enabled)
if (cont.isActive) cont.resume(enabled)
}
}
if (firstCameraWithFlash == null) {
Timber.e(Throwable("toggleFlashLight"), "Camera with flash not found")
cont.resume(false)
} else {
Timber.tag("~!").d("firstCameraWithFlash: $firstCameraWithFlash")
setTorchMode(firstCameraWithFlash, on)
registerTorchCallback(mainExecutor, callback)
}
cont.invokeOnCancellation { unregisterTorchCallback(callback) }
}
}
.onFailure { Timber.e(it, "Error toggleFlashLight") }
}
}
저는 SurfaceView를 사용하여 fragment를 통해 애플리케이션에 이 기능을 구현했습니다.이 스택 오버플로 질문과 답변에 대한 링크는 여기에서 찾을 수 있습니다.
이것이 도움이 되길 바랍니다 :)
마시멜로 이상에서는 CameraManager의 'setTorchMode()'가 정답인 것 같습니다.이것은 나에게 도움이 됩니다.
final CameraManager mCameraManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
CameraManager.TorchCallback torchCallback = new CameraManager.TorchCallback() {
@Override
public void onTorchModeUnavailable(String cameraId) {
super.onTorchModeUnavailable(cameraId);
}
@Override
public void onTorchModeChanged(String cameraId, boolean enabled) {
super.onTorchModeChanged(cameraId, enabled);
boolean currentTorchState = enabled;
try {
mCameraManager.setTorchMode(cameraId, !currentTorchState);
} catch (CameraAccessException e){}
}
};
mCameraManager.registerTorchCallback(torchCallback, null);//fires onTorchModeChanged upon register
mCameraManager.unregisterTorchCallback(torchCallback);
이거 먹어봐요.
CameraManager camManager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
String cameraId = null; // Usually front camera is at 0 position.
try {
cameraId = camManager.getCameraIdList()[0];
camManager.setTorchMode(cameraId, true);
} catch (CameraAccessException e) {
e.printStackTrace();
}
다음 코드를 사용하여 플래시를 끌 수도 있습니다.
Camera.Parameters params = mCamera.getParameters()
p.setFlashMode(Parameters.FLASH_MODE_OFF);
mCamera.setParameters(params);
언급URL : https://stackoverflow.com/questions/6068803/how-to-turn-on-front-flash-light-programmatically-in-android
'programing' 카테고리의 다른 글
| Ajax 호출에서 MVC 컨트롤러로 다중 매개 변수 전달 방법 (0) | 2023.08.16 |
|---|---|
| SQL Server 2008에서 매개 변수화된 VIEW 생성 (0) | 2023.08.16 |
| 위조 방지 토큰을 사용하여 Ajax 요청을 만드는 방법(mvc) (0) | 2023.08.16 |
| Swift에서 UIBarButtonItem에 대한 작업을 설정하는 방법 (0) | 2023.08.16 |
| 대용량 텍스트 파일에서 특정 줄로 이동하는 방법은 무엇입니까? (0) | 2023.08.16 |