mCurrentCamIndex = camIdx; //设置前置摄像头id
}catch (RuntimeException e){
Log.e(TAG,“相机打开失败:” + e.getLocalizedMessage());
}
}
}
return mCamera;
}
设置旋转角度
private void setCameraDisplayOrientation(Activity activity,int cameraId,Camera camera){
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId,info);
//获得旋转角度
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: //没有旋转
degrees = 0;
break;
case Surface.ROTATION_90: //旋转90°
degrees = 90;
break;
case Surface.ROTATION_180: //180
degrees = 180;
break;
case Surface.ROTATION_270:
degrees = 270;
break;
}
int result = 0;
if(info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT){
//前置摄像头旋转算法
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360;
}else{
result = (info.orientation - degrees + 360) % 360;
}
ROTATE = result + 180;
camera.setDisplayOrientation(result); //设置拍摄角度
}
然后设置焦距和打开的竖屏横屏
private void setCamera(){
if(checkCameraHadware()){
camera = openFrontFacingCameraGingerbread();
//设置摄像头方向调整摄像头旋转90度,成竖屏
setCameraDisplayOrientation(this,mCurrentCamIndex,camera);
Camera.Parameters parameters = camera.getParameters();
parameters.setPictureFormat(ImageFormat.JPEG);
List list= parameters.getSupportedFocusModes(); //获取支持的对焦格式
for(String str : list){
Log.e(TAG,“支持的对焦模式:”+ str );
}
//手机支持的图片尺寸合集
List<Camera.Size> pictureList = parameters.getSupportedPictureSizes();
//手机支持的预览尺寸集合
List<Camera.Size> previewList = parameters.getSupportedPreviewSizes();
//设置为当前使用手机的最大尺寸
parameters.setPictureSize(pictureList.get(0).width,pictureList.get(0).height);
minFocus = parameters.getZoom(); //获得最小焦距
maxFocus = parameters.getMaxZoom();
everyFocus = 1; //每次增加及减少值
nowFocus = minFocus; //当前焦距为最小值
seekBar.setMax(maxFocus); //设置最大焦距
Log.e(TAG,“当前镜头距离:” + minFocus + “\t\t获取最大距离:” + maxFocus); //日志打印
camera.setParameters(parameters);
}
}
最后在surfaceview上打开摄像头
使用了 camera.setPreviewDisplay(holder)来打开
camera.setPreviewCallback(null)、 camera.stopPreview()来关闭
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e(“surfaceCreated”,“绘制开始”);
try{
setCamera();
camera.setPreviewDisplay(holder);
} catch (IOException e) {
camera.release();
camera = null;
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Log.e(“surfaceChanged”,“绘制改变”);
try{
camera.stopPreview();
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e(“surfaceDestroyed”,“绘制结束”);
camera.setPreviewCallback(null);
camera.stopPreview();
camera.release();
camera = null;
}
还有其中对seekbar和buttom的调焦操作
//设置相机参数
private void setZoomValues(int want){
Camera.Parameters parameters = camera.getParameters(); //获得相机参数
seekBar.setProgress(want); //设置进度
parameters.setZoom(want); //设置焦距参数
camera.setParameters(parameters); //设置相机参数,焦距
}
//获取相机参数和当前焦距
private int getZoomValues(){
Camera.Parameters parameters = camera.getParameters();
int values = parameters.getZoom();
return values;
}
//调节焦距
//添加
private void addZoomValues(){
if(nowFocus > maxFocus){
Log.e(TAG,“大于maxFocus是不可能的”);
}else if(nowFocus == maxFocus){
}else {
setZoomValues(getZoomValues() + everyFocus);
}
}
//缩小
private void minusZoomValues(){
if(nowFocus < minFocus){
Log.e(TAG,“小于minFocus是不可能的”);
}else if(nowFocus == minFocus){
}else {
setZoomValues(getZoomValues() - everyFocus);
}
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后
感觉现在好多人都在说什么安卓快凉了,工作越来越难找了。又是说什么程序员中年危机啥的,为啥我这年近30的老农根本没有这种感觉,反倒觉得那些贩卖焦虑的都是瞎j8扯谈。当然,职业危机意识确实是要有的,但根本没到那种草木皆兵的地步好吗?
Android凉了都是弱者的借口和说辞。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
所以,最后这里放上我耗时两个月,将自己8年Android开发的知识笔记整理成的Android开发者必知必会系统学习资料笔记,上述知识点在笔记中都有详细的解读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
读,里面还包含了腾讯、字节跳动、阿里、百度2019-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。
[外链图片转存中…(img-M7vMEiLE-1711770155630)]
以上全套学习笔记面试宝典,吃透一半保你可以吊打面试官,只有自己真正强大了,有核心竞争力,你才有拒绝offer的权力,所以,奋斗吧!骚年们!千里之行,始于足下。种下一颗树最好的时间是十年前,其次,就是现在。
最后,赠与大家一句诗,共勉!
不驰于空想,不骛于虚声。不忘初心,方得始终。