diff --git a/app/src/main/java/com/simplemobiletools/flashlight/MainActivity.java b/app/src/main/java/com/simplemobiletools/flashlight/MainActivity.java index 62b71f4..0e0a38e 100644 --- a/app/src/main/java/com/simplemobiletools/flashlight/MainActivity.java +++ b/app/src/main/java/com/simplemobiletools/flashlight/MainActivity.java @@ -47,7 +47,7 @@ public class MainActivity extends AppCompatActivity implements MyCamera { } private void setupCameraImpl() { - cameraImpl = new MyCameraImpl(this); + cameraImpl = new MyCameraImpl(this, this); cameraImpl.toggleFlashlight(); } diff --git a/app/src/main/java/com/simplemobiletools/flashlight/MyCameraImpl.java b/app/src/main/java/com/simplemobiletools/flashlight/MyCameraImpl.java index cabce29..8ddfde3 100644 --- a/app/src/main/java/com/simplemobiletools/flashlight/MyCameraImpl.java +++ b/app/src/main/java/com/simplemobiletools/flashlight/MyCameraImpl.java @@ -1,15 +1,24 @@ package com.simplemobiletools.flashlight; +import android.annotation.TargetApi; +import android.content.Context; import android.hardware.Camera; +import android.hardware.camera2.CameraAccessException; +import android.hardware.camera2.CameraManager; +import android.os.Build; +import android.util.Log; public class MyCameraImpl { + private static final String TAG = MyCameraImpl.class.getSimpleName(); private Camera camera; private Camera.Parameters params; private boolean isFlashlightOn; private MyCamera callback; + private Context context; - public MyCameraImpl(MyCamera camera) { + public MyCameraImpl(MyCamera camera, Context cxt) { callback = camera; + context = cxt; setupCamera(); } @@ -25,6 +34,9 @@ public class MyCameraImpl { } public void setupCamera() { + if (isMarshmallow()) + return; + if (camera == null) { try { camera = Camera.open(); @@ -35,33 +47,58 @@ public class MyCameraImpl { if (isFlashlightOn) enableFlashlight(); } catch (Exception e) { + Log.e(TAG, "setup camera " + e.getMessage()); callback.cameraUnavailable(); } } } private void enableFlashlight() { - if (camera == null || params == null) - return; + if (isMarshmallow()) { + toggleMarshmallowFlashlight(true); + } else { + if (camera == null || params == null) + return; - params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); - camera.setParameters(params); + params.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); + camera.setParameters(params); + } callback.enableFlashlight(); } private void disableFlashlight() { - if (camera == null || params == null) - return; + if (isMarshmallow()) { + toggleMarshmallowFlashlight(false); + } else { + if (camera == null || params == null) + return; - params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); - camera.setParameters(params); + params.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); + camera.setParameters(params); + } callback.disableFlashlight(); } + @TargetApi(Build.VERSION_CODES.M) + private void toggleMarshmallowFlashlight(boolean enable) { + try { + final CameraManager manager = (CameraManager) context.getSystemService(Context.CAMERA_SERVICE); + final String[] list = manager.getCameraIdList(); + manager.setTorchMode(list[0], enable); + } catch (CameraAccessException e) { + Log.e(TAG, "toggle marshmallow flashlight " + e.getMessage()); + callback.cameraUnavailable(); + } + } + public void releaseCamera() { if (camera != null) { camera.release(); camera = null; } } + + private boolean isMarshmallow() { + return android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M; + } } diff --git a/app/src/main/java/com/simplemobiletools/flashlight/MyWidgetProvider.java b/app/src/main/java/com/simplemobiletools/flashlight/MyWidgetProvider.java index eb0c3ab..184b9b7 100644 --- a/app/src/main/java/com/simplemobiletools/flashlight/MyWidgetProvider.java +++ b/app/src/main/java/com/simplemobiletools/flashlight/MyWidgetProvider.java @@ -37,7 +37,7 @@ public class MyWidgetProvider extends AppWidgetProvider implements MyCamera { final PendingIntent pendingIntent = PendingIntent.getBroadcast(cxt, 0, intent, 0); remoteViews = new RemoteViews(cxt.getPackageName(), R.layout.widget); remoteViews.setOnClickPendingIntent(R.id.toggle_btn, pendingIntent); - cameraImpl = new MyCameraImpl(this); + cameraImpl = new MyCameraImpl(this, cxt); final Resources res = cxt.getResources(); final int appColor = res.getColor(R.color.colorPrimary);