mirror of
				https://github.com/SimpleMobileTools/Simple-Flashlight.git
				synced 2025-06-05 21:59:19 +02:00 
			
		
		
		
	do not require the Camera permission on marshmallow+
This commit is contained in:
		@@ -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();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user