android 相机与手电筒的互斥

相机和SystemUI。


在android5.0的快捷开关上面有一个手电筒的开关,并且支持后台运行。
需要明确的一点就是,之所以他们两个不能一起使用是因为手电筒其实调用的也是相机里面的闪光灯。他们作为同一个硬件是不能一起使用的
首先看一下手电筒是怎么工作的:
/SystemUI_q5.1/src/com/android/systemui/statusbar/policy/FlashlightController.java
    private void postUpdateFlashlight() {
        ensureHandler();
        mHandler.post(mUpdateFlashlightRunnable);
    }
重点在于他如何实现Runnable接口的
    private final Runnable mUpdateFlashlightRunnable = new Runnable() {
        @Override
        public void run() {
            updateFlashlight(false /* forceDisable */);
        }
    };

   private void updateFlashlight(boolean forceDisable) {
        try {
            boolean enabled;
            synchronized (this) {
                enabled = mFlashlightEnabled && !forceDisable;
            }
            if (enabled) {
                if (mCameraDevice == null) {
                    startDevice();
                    return;
                }
                if (mSession == null) {
                    startSession();
                    return;
                }
                if (mFlashlightRequest == null) {
                    CaptureRequest.Builder builder = mCameraDevice.createCaptureRequest(
                            CameraDevice.TEMPLATE_PREVIEW);
                    builder.set(CaptureRequest.FLASH_MODE, CameraMetadata.FLASH_MODE_TORCH);
                    builder.addTarget(mSurface);
                    CaptureRequest request = builder.build();
                    mSession.capture(request, null, mHandler);
                    mFlashlightRequest = request;
                }
            } else {
                if (mCameraDevice != null) {
                    mCameraDevice.close();
                    teardown();
                }
            }


        } catch (CameraAccessException|IllegalStateException|UnsupportedOperationException e) {
            Log.e(TAG, "Error in updateFlashlight", e);
            handleError();
        }
    }

打开手电筒说白了就是先打开相机,利用相机中的闪光灯作为一个光源。


所以你打开了手电筒在去打开相机那是肯定不行的。一件裤子两个人穿那是肯定要打架的。


对于如何实现那是很简单的。
1、当打开相机的时候向手电筒发一个广播。判断状态,如果是开的则将手电筒关闭;
/SystemUI_q5.1/src/com/android/systemui/qs/tiles/FlashlightTile.java


2、当打开手电筒,放相机发一个广播,判断状态,如果是开着的则退出相机。

/SnapdragonCamera/src/com/android/camera/CameraActivity.java


修改代码如下:

一、/SystemUI_q5.1/src/com/android/systemui/qs/tiles/FlashlightTile.java

定义变量如下:

//added
    private static final String CAMERA_OPEN_ACTION = "camera_open";
    private static final String FLASHLIGHT_OPEN_ACTION = "flashlight_open";
//added end

修改构造方法如下:

    public FlashlightTile(Host host) {
        super(host);
        //added  Camera and FlashlightTile Mutex
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(CAMERA_OPEN_ACTION);
        mContext.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
if(mState.value == true){
handleClick();
}
}
        }, intentFilter);
        //added end

        mFlashlightController = host.getFlashlightController();
        mFlashlightController.addListener(this);
    }

修改 protected void handleClick()方法如下:

    protected void handleClick() {
        if (ActivityManager.isUserAMonkey()) {
            return;
        }
boolean newState = !mState.value;
//added Camera and FlashlightTile Mutex
if (newState == true) {
Intent intent = new Intent(FLASHLIGHT_OPEN_ACTION);
mContext.sendBroadcast(intent);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// added end

mFlashlightController.setFlashlight(newState);
        refreshState(newState ? UserBoolean.USER_TRUE : UserBoolean.USER_FALSE);
    }



二、/SnapdragonCamera/src/com/android/camera/CameraActivity.java

修改onCreate()方法如下:

    public void onCreate(Bundle state) {
        super.onCreate(state);
        //added Camera and FlashlightTile Mutex
        sendBroadcast(new Intent("camera_open"));
        try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
        IntentFilter flashLightFilter = new IntentFilter();
        flashLightFilter.addAction("flashlight_open");
        registerReceiver(mFlashLightOpenReceiver, flashLightFilter);
        //end


接收到广播之后的处理方法

      //added  Camera and FlashlightTile Mutex
    private BroadcastReceiver mFlashLightOpenReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            finish();
        }
    };
    //end


最后在onDestory()方法中对广播进行注销

//added  Camera and FlashlightTile Mutex
        if(mFlashLightOpenReceiver != null){
        unregisterReceiver(mFlashLightOpenReceiver);
        }
        //end





  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值