Yanıtlar:
Bu sorun için şunları yapmalısınız:
El fenerinin mevcut olup olmadığını kontrol ettiniz mi?
Öyleyse Kapat / Aç
Değilse, uygulamanızın ihtiyaçlarına göre her şeyi yapabilirsiniz.
İçin flaş kullanılabilirliğini kontrol etme cihazında:
Aşağıdakileri kullanabilirsiniz:
context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FLASH);
hangi flaş mevcutsa true, değilse false döndürecektir.
Daha fazla bilgi için bkz.
Http://developer.android.com/reference/android/content/pm/PackageManager.html .
El fenerini açmak / kapatmak için:
Ben googled ve android.permission.FLASHLIGHT hakkında bu var. Android bildirilerinin izni umut verici görünüyor:
<!-- 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" />
Ardından Kamera'yı kullanın ve Kamera'yı ayarlayın. Parametreler . Burada kullanılan ana parametre FLASH_MODE_TORCH'dir .
Örneğin.
Kamera el fenerini açmak için Kod Parçacığı.
Camera cam = Camera.open();
Parameters p = cam.getParameters();
p.setFlashMode(Parameters.FLASH_MODE_TORCH);
cam.setParameters(p);
cam.startPreview();
Kod snippet'i kamera led ışığını kapatmak için.
cam.stopPreview();
cam.release();
Bu izni kullanan bir proje buldum. Hızlı ayarların src kodunu kontrol edin. burada http://code.google.com/p/quick-settings/ (Not: Bu bağlantı şimdi kesilmiştir)
El feneri için doğrudan http://code.google.com/p/quick-settings/source/browse/trunk/quick-settings/#quick-settings/src/com/bwx/bequick/flashlight adresini ziyaret edin (Not: Bu bağlantı şimdi kırıldı)
Güncelleme6 Ayrıca , hangi API tarafından kontrol edilebilen Galaxy Nexus'ta bu cevap LED el fenerinde açıklandığı gibi bir SurfaceView eklemeyi deneyebilirsiniz ? Bu, birçok telefonda çalışan bir çözüm gibi görünüyor.
Güncelleme 5 Büyük Güncelleme
Alternatif bir Bağlantı buldum (yukarıdaki kırık bağlantılar için): http://www.java2s.com/Open-Source/Android/Tools/quick-settings/com.bwx.bequick.flashlight.htm Şimdi bunu kullanabilirsiniz bağlantı. [Güncelleme: 14/9/2012 Bu bağlantı şimdi kesildi]
Güncelleme 1
Başka bir Açık Kaynak Kodu: http://code.google.com/p/torch/source/browse/
Güncelleme 2
Motorola Droid'de LED'in nasıl etkinleştirileceğini gösteren örnek: http://code.google.com/p/droidled/
Başka bir Açık Kaynak Kodu:
http://code.google.com/p/covedesigndev/
http://code.google.com/p/search-light/
Güncelleme 3 (Kamera ledini açmak / kapatmak için widget)
Eğer kamera led açar / kapatır bir widget geliştirmek istiyorsanız, o zaman android benim kamera feneri açmak / kapatmak için benim cevap Widget başvurmak gerekir ..
Güncelleme 4
Kamera LED'inden çıkan ışığın yoğunluğunu ayarlamak isterseniz , bir Android cihazın LED yoğunluğunu değiştirebilir miyim? tam gönderi. Yalnızca köklü HTC cihazlarının bu özelliği desteklediğini unutmayın.
** Sorunlar:**
Feneri Açma / Kapatma sırasında da bazı sorunlar var. Örneğin. sahip olmayan FLASH_MODE_TORCH
veya olsa bile cihazlar için el feneri açılmaz vb.
Tipik olarak Samsung birçok sorun yaratır.
Aşağıdaki listede yer alan sorunlara başvurabilirsiniz:
Android'de kamera feneri kullanma
Samsung Galaxy Ace 2.2.1 ve Galaxy Tab'de Kamera LED'ini / flaş ışığını açın / kapatın
Deneyimlerime göre, uygulamanız hem dikey hem de yatay yönde çalışacak şekilde tasarlanmışsa, değişkeni cam
statik olarak bildirmeniz gerekir . Aksi takdirde, onDestroy()
anahtarlama yönelimi olarak adlandırılır, onu yok eder, ancak Kamera'yı serbest bırakmaz, bu yüzden tekrar açmak mümkün değildir.
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();
}
}
}
tezahür ettirmek için bu satırı koymak zorunda kaldım
<uses-permission android:name="android.permission.CAMERA" />
dan http://developer.android.com/reference/android/hardware/Camera.html
yukarıdaki önerilen satırlar benim için çalışmadı.
you need to declare the variable cam as static
Camera
Sınıfı sınıf olmasına AndroidStudio
dikkat android.hardware
...
API 23 veya Üzeri (Android M, 6.0)
Kodu aç
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();
}
}
Kodu KAPATIN
camManager.setTorchMode(cameraId, false);
Ve İzinler
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.FLASHLIGHT"/>
İLAVE DÜZENLEME
İnsanlar hala cevabımı düzeltiyorlar, bu yüzden ek kod göndermeye karar verdim.
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();
}
}
}
AutoFlash ışığının altında basit Üç Adım var.
<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" />
Kamera Kodunuzda bu şekilde yapın.
//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();
Build + Run -> Şimdi Loş ışık alanına gidin ve Fotoğraf çekin, cihaz destekliyorsa otomatik flaş ışığı almalısınız.
Android Lollipop, camera2 API'sını tanıttı ve önceki kamera API'sını kullanımdan kaldırdı . Ancak, flaşı açmak için kullanımdan kaldırılmış API'yı kullanmak hala işe yarıyor ve yeni API'yi kullanmaktan çok daha basit.
Yeni API'nin özel tam özellikli kamera uygulamalarında kullanılmak üzere tasarlandığı ve mimarlarının el fenerini açmak gibi daha basit kullanım durumlarını gerçekten dikkate almadığı anlaşılıyor. Şimdi bunu yapmak için, bir CameraManager almak, sahte bir Yüzeye sahip bir CaptureSession oluşturmak ve son olarak bir CaptureRequest oluşturmak ve başlatmak gerekir. İstisna yönetimi, kaynak temizleme ve uzun geri aramalar dahildir!
Lollipop ve daha yeni bir el fenerinin nasıl açılacağını görmek için AOSP projesindeki FlashlightController'a bir göz atın (değiştirilen en yeni eski API'ları bulmaya çalışın). Gerekli izinleri ayarlamayı unutmayın.
Android Marshmallow nihayet setTorchMode ile flaşı açmanın basit bir yolunu tanıttı .
Android El Feneri Uygulaması için Komple Kod
Belirgin
<?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>
MainActivity.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;
}
}
}
Farklı Android sürümlerinde Camera Flash'a erişmenin farklı yolları vardır. Lollipop'ta birkaç API çalışmayı bıraktı ve sonra Marshmallow'da tekrar değişti. Bunun üstesinden gelmek için, birkaç projemde kullandığım basit bir kütüphane oluşturdum ve iyi sonuçlar veriyor. Hala eksik, ancak kodu kontrol etmeye ve eksik parçaları bulmaya çalışabilirsiniz. İşte bağlantı - NoobCameraFlash .
Sadece kodunuza entegre etmek istiyorsanız, bunun için not kullanabilirsiniz. İşte talimatlar (doğrudan Benioku dosyasından alınmıştır) -
Adım 1. JitPack deposunu derleme dosyanıza ekleyin. Depoların sonunda kök build.gradle dosyasına ekleyin:
allprojects {
repositories {
...
maven { url "https://jitpack.io" }
}
}
2. Adım. Bağımlılığı ekleyin
dependencies {
compile 'com.github.Abhi347:NoobCameraFlash:0.0.1'
}
NoobCameraManager
Singleton'u başlatın .
NoobCameraManager.getInstance().init(this);
Hata ayıklama günlüğü için isteğe bağlı olarak Günlük Düzeyi'ni ayarlayabilirsiniz. Günlüğe kaydetme işlemi LumberJack kitaplığını kullanır . Varsayılan LogLevelLogLevel.None
NoobCameraManager.getInstance().init(this, LogLevel.Verbose);
Bundan sonra kamera flaşını açmak veya kapatmak için singleton'u aramanız yeterlidir.
NoobCameraManager.getInstance().turnOnFlash();
NoobCameraManager.getInstance().turnOffFlash();
NoobCameraManager'ı başlatmadan önce Kamera'ya erişmek için çalışma zamanı izinlerine dikkat etmeniz gerekir. Sürüm 0.1.2 veya önceki sürümlerde, doğrudan kitaplıktan izinler için destek sağlamaktaydık, ancak Activity nesnesine bağımlılık nedeniyle bunu kaldırmamız gerekiyor.
Flash'ı da değiştirmek kolaydır
if(NoobCameraManager.getInstance().isFlashOn()){
NoobCameraManager.getInstance().turnOffFlash();
}else{
NoobCameraManager.getInstance().turnOnFlash();
}
You have to take care of the runtime permissions to access Camera yourself, before initializing the NoobCameraManager. In version 0.1.2 or earlier we used to provide support for permissions directly from the library, but due to dependency on the Activity object, we have to remove it.
SurfaceView kullanarak parçaları aracılığıyla benim uygulamada bu işlevi uyguladık. Bu yığın akışı sorusunun bağlantısı ve yanıtı burada bulunabilir
Bu yardımcı olur umarım :)
Marshmallow ve üstünde, CameraManager'ın `` setTorchMode () '' cevabı gibi görünüyor. Bu benim için çalışıyor:
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);
Bunu dene.
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();
}