问题始于我司项目中有一项功能有个服务是长期占用相机资源的,但是偶尔又有使用相机的需求,为避免资源占用冲突,需要在调用底层相机前new camera()对象前去发广播去让我们的服务释放资源
首先我们要从framework/base/core/java/android/hardware/Camera.java
Camera类下手,因为每次打开相机都会走Camera.open(),去new Camera(cameraId)
所以我们将在Camera.open()里面return new Camera(cameraId)之前去发送广播,释放资源,整个过程需要时间,所以在这个位置我加了点延时。
*注意:Camera类中有两个open函数,具体的调用应该是根据软件的api来定的,Camera open(int cameraId) /Camera open(),一个带参数一个不带参数,指定前后摄的。
大家都指定广播方式就是sendBroadcast(i);
想用到这个sendBroadcast,要么你的类继承了context,要么就用context.sendBroadcast(i)
我们这边通过获取context来发送这个广播了
public static Context getApplicationContext() {
if (null != applicationContext) {
return applicationContext;
}
final Object activityThread = getActivityThread();
if (null != activityThread) {
try {
final Method getApplication = activityThread.getClass().getDeclaredMethod("getApplication");
getApplication.setAccessible(true);
applicationContext = (Context) getApplication.invoke(activityThread);
} catch (Exception e) {
e.printStackTrace();
}
}
private static Object getActivityThread() {
try {
final Class<?> clz = Class.forName("android.app.ActivityThread");
final Method method = clz.getDeclaredMethod("currentActivityThread");
method.setAccessible(true);
final Object activityThread = method.invoke(null);
return activityThread;
} catch(Exception e) {
e.printStackTrace();
}
return null;
}
这样我们就通过getApplicationContext拿到context了,然后广播发起来
getApplicationContext().sendBroadcast(i);
同理,可以在release()中去处理关闭相机的时候情况
OK!