2023年7月7日发(作者:)
android7⾃定义相机预览及拍照功能本⽂实例为⼤家分享了Android实现摄像头切换,拍照及保存到相册,预览等功能,解决android7拍照之后不能连续预览的问题、参数设置相关问题以及前后摄像头语⾔颠倒等问题。import st;
import ty;
import t;
import ;
import eManager;
import ;
import Factory;
import ;
import ormat;
import ;
import ;
import ;
import ;
import nment;
import r;
import tyCompat;
import ;
import nt;
import eHolder;
import eView;
import ;
import Manager;
import ew;
import r.R;
import ;
import tputStream;
import ption;
import ist;
import or;
import ;
public class CamaraActivity extends Activity implements kListener {
@Bind(_back)
TextView returnBack;
@Bind(ch_camera)
TextView tvswitchCamera;
//启动摄像机
private Camera mCamera;
public boolean isopen_camara = false;
private SurfaceView surfaceView;
private SurfaceHolder mholder = null;
private SurfaceCallback previewCallBack;
private boolean isTakingPhoto;//是否正在拍照
@Override
protected void onCreate(Bundle savedInstanceState) {
te(savedInstanceState);
verifyPermission(new String[]{});
// getWindow().setFlags(_FULLSCREEN, _FULLSCREEN);
setContentView(ty_camara);
(this);
// 预览控件
surfaceView = (SurfaceView) this
.findViewById(eView);
// 设置参数
der().setKeepScreenOn(true);
der().setType(E_TYPE_PUSH_BUFFERS);
lickListener(this);
lickListener(this);
ault().register(this);
}
public void verifyPermission(String[] permissions) {
if (permissions != null) {
List
for (int i = 0; i < ; i++) {
if (elfPermission(this, permissions[i]) != SION_GRANTED) {
if (ShowRequestPermissionRationale(this, permissions[i])) {
}
(permissions[i]);
}
}
if (() > 0) {
String[] ps = new String[()];
for (int i = 0; i < (); i++) {
ps[i] = (i);
}
tPermissions(this, ps, 1);
}
}
}
@Override
protected void onRestart() {
art();
}
@Override
protected void onStart() {
t();
}
private void takePhoto() {
if (!isopen_camara) {
previewCallBack = new SurfaceCallback();
der().addCallback(previewCallBack);
} else {
autoTakePhoto();
}
}
@Override
protected void onResume() {
me();
if(mCamera == null){
if (!isopen_camara) {
previewCallBack = new SurfaceCallback();
der().addCallback(previewCallBack);
}
}
}
@Override
public void onClick(View v) {
switch (()) {
case _back:
finish();
break;
case ch_camera:
switchCamara();
break;
}
}
// 预览界⾯回调
private final class SurfaceCallback implements ck {
// 预览界⾯被创建
public void surfaceCreated(SurfaceHolder holder) {
try {
//1代表打开后置摄像头,0代表打开前置摄像头.
mCamera = (cameraPosition);// 打开摄像头
setParams(holder,cameraPosition);
} catch (Exception e) {
tackTrace();
if (mCamera != null) {
eview();
();
e();
mCamera = null;
}
finish();
//xt(getApplicationContext(), "该⼿机不⽀持⾃动拍照功能", _LONG).show();
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
n("surfaceChanged"); isopen_camara = true;
//autoTakePhoto();
}
// 预览界⾯被销毁
public void surfaceDestroyed(SurfaceHolder holder) {
n("surfaceDestroyed");
if(!isopen_camara)
return;
if (mCamera != null) {
Callback(this);
viewCallback(null);
eview();
();
e();
mCamera = null;
}
}
}
public void reset(){
Info cameraInfo = new Info();
if (mCamera != null) {
if(surfaceView != null && der() != null && previewCallBack != null){
der().removeCallback(previewCallBack);
}
viewCallback(null);
eview();
();
e();
mCamera = null;
mCamera = (cameraPosition);
if (null != mholder)
setParams(mholder,);
}
}
@Override
protected void onDestroy() {
roy();
if (mCamera != null) {
if(surfaceView != null && der() != null && previewCallBack != null){
der().removeCallback(previewCallBack);
}
viewCallback(null);
eview();
();
e();
mCamera = null;
}
(this);
ault().unregister(this);
}
private void setParams(SurfaceHolder mySurfaceView,int postion) {
try {
int PreviewWidth = 0;
int PreviewHeight = 0;
WindowManager wm = (WindowManager) getSystemService(_SERVICE);//获取窗⼝的管理器
/*PreviewWidth = display.();
PreviewHeight = ght();*/
ters parameters = ameters();
// 选择合适的预览尺⼨
List<> sizeList = portedPreviewSizes();
// 如果sizeList只有⼀个我们也没有必要做什么了,因为就他⼀个别⽆选择
if (() > 1) {
Iterator<> itor = or();
while (t()) {
cur = ();
/*if ( >= PreviewWidth
&& >= PreviewHeight) {*/
if ( >= PreviewWidth
&& >= PreviewHeight) {
PreviewWidth = ;
PreviewHeight = ;
break;
}
}
}
viewSize(PreviewWidth, PreviewHeight); //获得摄像区域的⼤⼩
//viewFrameRate(3);//每秒3帧 每秒从摄像头⾥⾯获得3个画⾯
//viewFpsRange(3,);
List
int[] v = null;
int index = 0;
int min = 0;
for (int i = 0; i < (); i++) {
v = (i);
if (v[0] > min) {
min = v[0];
index = i;
}
}
viewFpsRange((index)[0], (index)[1]);
tureFormat();//设置照⽚输出的格式
("jpeg-quality", 85);//设置照⽚质量
tureSize(PreviewWidth, PreviewHeight);//设置拍出来的屏幕⼤⼩
ation(180); //Java部分
if (_INT >= 24) {
if(postion == 0){
playOrientation(90);
}else {
playOrientation(270);
}
} else {
playOrientation(90);
}
ameters(parameters);//把上⾯的设置 赋给摄像头
viewDisplay(mySurfaceView);//把摄像头获得画⾯显⽰在SurfaceView控件⾥⾯
mholder = mySurfaceView;
viewCallback(new wCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
}
});
review();//开始预览
// mPreviewRunning = true;
} catch (IOException e) {
Log.e("tag", ng());
}
}
Handler handler = null;
private void autoTakePhoto() {
// 拍照前需要对焦 获取清析的图⽚
if (null == mCamera) return;
cus(new cusCallback() {
@Override
public void onAutoFocus(boolean success, Camera camera) {
if (success && isopen_camara) {
// 对焦成功
// xt(, "对焦成功 !!",_SHORT).show();
if(!isTakingPhoto) {
isTakingPhoto = true;
handler = new Handler();
(new Runnable() {
@Override
public void run() {
cture(null, null, new MyPictureCallback());
}
});
}
}
}
});
}
// 照⽚回调
private final class MyPictureCallback implements eCallback {
// 照⽚⽣成后
@Override
public void onPictureTaken(byte[] data, Camera camera) {
try {
Bitmap bitmap = ByteArray(data, 0, ); Matrix matrix = new Matrix();
ate(270);
File jpgFile = new File(ernalStorageDirectory() + "/DCIM/camera");
if (!()) {
();
}
File jpgFile1 = new File(oluteFile(), tTimeMillis() + ".jpg");
bitmap = Bitmap(bitmap, 0, 0, th(), ght(), matrix, true);
FileOutputStream fos = new FileOutputStream(jpgFile1);
ss(, 80, fos);
(getApplicationContext(), getString(_success));
();
Intent intent = new Intent(_MEDIA_SCANNER_SCAN_FILE);
Uri uri = le(jpgFile1);
a(uri);
sendBroadcast(intent);
} catch (Exception e) {
tackTrace();
}finally {
if(_INT>=24){
reset();
}
isTakingPhoto = false;
}
}
}
private int cameraPosition = 1;//0代表前置摄像头,1代表后置摄像头
private void switchCamara() {
//切换前后摄像头
int cameraCount = 0;
Info cameraInfo = new Info();
cameraCount = berOfCameras();//得到摄像头的个数
for (int i = 0; i < cameraCount; i++) {
eraInfo(i, cameraInfo);//得到每⼀个摄像头的信息
if (cameraPosition == 1) {
//现在是后置,变更为前置
if ( == _FACING_BACK) {//代表摄像头的⽅位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
if(surfaceView != null && der() != null && previewCallBack != null){
der().removeCallback(previewCallBack);
}
viewCallback(null);
eview();//停掉原来摄像头的预览
();
e();//释放资源
mCamera = null;//取消原来摄像头
mCamera = (i);//打开当前选中的摄像头
/* try {
if (null != mholder)
viewDisplay(mholder);//通过surfaceview显⽰取景画⾯
} catch (IOException e) {
// TODO Auto-generated catch block
tackTrace();
}
review();//开始预览*/
if (null != mholder)
setParams(mholder,_FACING_BACK);
cameraPosition = 0;
break;
}
} else {
//现在是前置, 变更为后置
if ( == _FACING_FRONT) {//代表摄像头的⽅位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
if(surfaceView != null && der() != null && previewCallBack != null){
der().removeCallback(previewCallBack);
}
viewCallback(null);
eview();//停掉原来摄像头的预览
();
e();//释放资源
mCamera = null;//取消原来摄像头
mCamera = (i);//打开当前选中的摄像头
/*try {
if (null != mholder)
viewDisplay(mholder);//通过surfaceview显⽰取景画⾯
} catch (IOException e) {
// TODO Auto-generated catch block
tackTrace();
}
review();//开始预览*/ if (null != mholder)
setParams(mholder,_FACING_FRONT);
cameraPosition = 1;
break;
}
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == E_VOLUME_DOWN) {///⾳量减拍照
takePhoto();
return true;
}
return own(keyCode, event);
}
}
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
发布者:admin,转转请注明出处:http://www.yc00.com/news/1688678093a161799.html
评论列表(0条)