public class Main extends Activity implements SurfaceHolder.Callback,
OnClickListener, PictureCallback {
private Camera camera;// 相机
private boolean isboolean = true;
public static final int ITEM0 = Menu.FIRST;
public static final int ITEM1 = Menu.FIRST + 1;
public static final int ITEM2 = Menu.FIRST + 2;
byte[] data;
SurfaceView surfaceView;
ImageButton take_btn;// 拍照
ImageButton tool_btn;// 工具
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);//
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
getView();// 实例化
surfaceView.getHolder().setFixedSize(320, 240); // 设置分辨率
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(this);// 回调
}
public void getView() {
surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
take_btn = (ImageButton) findViewById(R.id.shutter);
tool_btn = (ImageButton) findViewById(R.id.finish);
take_btn.setOnClickListener(this);
tool_btn.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.shutter:// 拍照
camera.takePicture(null, null, this);
break;
case R.id.finish:// 工具
Main.super.openOptionsMenu();// 打开菜单
break;
default:
break;
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
// 在界面尺寸改变时被调用,设置相机的参数(大小,格式)
if (isboolean) {
camera.stopPreview();
}
// 相机参数设置
Camera.Parameters para = camera.getParameters();
para.setPictureFormat(PixelFormat.JPEG);
para.setPreviewSize(w, h);
para.setPictureSize(640, 480);// 照片大小
para.set("rotation", 90);
camera.setParameters(para);
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
camera.startPreview();
isboolean = true;
}
public void surfaceCreated(SurfaceHolder holder) {
// 界面创建时被调用,一般是用来,打开相机,设置预览
camera = Camera.open();// 不能放在构造函数里,否则产生不了预览效果
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
isboolean = false;
camera.release();
}
private Dialog buildDialog(Context context) {
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setTitle("是否储存照片");
builder.setPositiveButton("存储", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) {
savepicture(data);
}
});
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
camera.startPreview();
}
});
return builder.create();
};
public Dialog onCreateDialog(int i) {
switch (i) {
case 1:
return buildDialog(Main.this);
}
return null;
};
@SuppressWarnings("static-access")
public void savepicture(byte[] _data) {
String string = null;
// 获取系统时间,并格式化
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int year = calendar.get(Calendar.YEAR);
int mounth = calendar.get(Calendar.MONTH) + 1;
int day = calendar.get(Calendar.DATE);
int hour = calendar.get(calendar.HOUR);
int min = calendar.get(calendar.MINUTE);
int secound = calendar.get(calendar.SECOND);
// 格式一:2011-11-1 12-12-66 作为文件名
String formateDate1 = String.valueOf(year) + "-"
+ String.valueOf(mounth) + "-" + String.valueOf(day) + " "
+ String.valueOf(hour) + "-" + String.valueOf(min) + "-"
+ String.valueOf(secound);
// 格式二:2011年11月1日 12时12分45秒 写在照片上
String formateDate2 = String.valueOf(year) + "年"
+ String.valueOf(mounth) + "月" + String.valueOf(day) + "日 "
+ String.valueOf(hour) + "时" + String.valueOf(min) + "分"
+ String.valueOf(secound) + "秒";
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HHmmss");
// String date = sdf.format(new Date());
try {
Bitmap bitmap = BitmapFactory.decodeByteArray(_data, 0,
_data.length);
Bitmap newbitmap = dateBitmap(bitmap, formateDate2);
String photoName = formateDate1 + ".jpg";// 照片名称
string = photoName;
File file = new File(Utils.getSDPath(), photoName);// 创建图片文件
FileOutputStream outStream = new FileOutputStream(file);
newbitmap.compress(CompressFormat.JPEG, 100, outStream);
outStream.close();
camera.stopPreview();
camera.startPreview();// 开始预览
} catch (Exception e) {
}
Toast.makeText(Main.this, "照片存储路径:" + Utils.getSDPath() + "/" + string,
2000).show();
}
// 往照片上写入日期
private Bitmap dateBitmap(Bitmap bitmap, String date) {
if (bitmap == null) {
return null;
}
int w = bitmap.getWidth();
int h = bitmap.getHeight();
// 创建一个空白的bitmap
Bitmap newbitmap = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图
Canvas canvas = new Canvas(newbitmap);
canvas.drawBitmap(bitmap, 0, 0, null);// 在 0,0坐标开始画入src
Paint paint = new Paint();
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.RED);
paint.setTextSize(25);
// canvas.drawText(date, 80, 50, paint);//居顶
canvas.drawText(date, 80, 620, paint);// 居底
canvas.save(Canvas.ALL_SAVE_FLAG);// 保存
canvas.restore();// 存储
return newbitmap;
}
public void onPictureTaken(byte[] _data, Camera camera) {
data = _data;
showDialog(1);// 弹出对话框,提示是否要保存图片
}
// Menu菜单
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, ITEM0, 0, "相册");
menu.add(0, ITEM2, 2, "退出");
menu.findItem(ITEM1);
return true;
}
// Menu菜单点击事件
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case ITEM0:// 相册
Intent intent = new Intent(Main.this, Album.class);
startActivity(intent);
break;
case ITEM2:// 退出
finish();
break;
}
return super.onOptionsItemSelected(item);
}
}
分享到:
相关推荐
在Android平台上,自定义相机开发是一项常见的任务,Camera2 API是Google为了提供更高级、更灵活的相机控制而引入的接口。本教程将深入探讨如何使用Camera2 API创建一个自定义相机应用,通过分析提供的OneSelfCamera...
本文将深入探讨如何利用`android.hardware.camera` API来构建一个自定义相机应用,并结合SurfaceView进行预览显示。 首先,我们需要了解`Camera`类是Android系统提供的核心组件,用于与设备的物理相机硬件进行交互...
Camera2 API是Android系统提供的一种高级相机接口,它为开发者提供了更底层的控制,能够实现更为复杂和精细的相机功能。本文将深入探讨如何利用Camera2 API来实现自定义相机界面,包括拍照、保存照片以及摄像头切换...
《专业相机Camera FV-5 1.1汉化版:深入解析专业级相机应用》 在移动设备日益普及的今天,手机摄影已经成为日常生活的一部分。专业相机应用如Camera FV-5 1.1汉化版,为用户提供了与传统单反相机相似的功能和体验,...
"相机Camera+Orbit.rar"这个压缩包文件很可能包含了一个用于实现旋转(Orbit)相机控制的资源集合。在这个场景中,"Orbit"通常指的是允许玩家围绕一个中心点进行旋转查看的游戏相机行为,类似于行星围绕太阳的运动。...
Jelly Bean风格相机 Camera JB+ v3.1 当前版本:3.1软件语言:非中文软件类别:特效相机软件大小:7.59 MB适用固件:4.0.3及更高固件内置广告:没有广告适用平台:Android 软件介绍 Camera JB+是一款果冻豆风格的...
总结起来,"相机cameraX,借鉴别人的项目"这个主题涉及到Android平台上的相机应用开发,重点是使用CameraX库实现预览和图像捕获功能,并且能够将拍摄的照片直接保存到媒体库,同时允许开发者对ImageProxy进行自定义...
在安卓平台上,开发一款相机应用是一项常见的任务,而“简易安卓相机Camera应用”是一个很好的学习和参考案例。这款应用利用了安卓系统自带的Camera组件,提供了丰富的设置选项和功能,如自动循环聚焦、白平衡调整、...
在Android开发中,自定义相机(Custom Camera)是常见的需求之一,它允许开发者根据特定的应用场景和用户体验来设计和控制相机功能。本教程将详细讲解如何利用SurfaceView实现一个自定义相机,支持调整分辨率、切换...
在Android开发中,自定义相机(Camera)是一个常见的需求,特别是在开发涉及图像处理或拍照功能的应用时。Android原生提供了Camera API,但直接使用可能会遇到一些问题,如图像拉伸、拍照翻转等。本教程将详细介绍...
2. **配置参数**:使用`Camera.getParameters()`获取相机参数,并通过修改返回的`Camera.Parameters`对象来配置相机的特性,如分辨率、对焦模式等。之后,调用`Camera.setParameters(Camera.Parameters)`将这些设置...
"Android自定义相机Camera实现手动对焦的方法示例" Android自定义相机Camera实现手动对焦的方法示例是Android开发者非常关心的一方面,手动对焦的实现可以让用户更加方便地控制相机的对焦行为。本文将详细介绍...
在Android平台上,相机功能是应用开发中的重要组成部分。...同时,随着Android版本的更新,相机API也有所变化,如从早期的`Camera`类到现在的`Camera2` API,开发者需要根据目标平台选择合适的相机接口。
在Android系统中,Camera2 API是自Android 5.0(API级别21)开始引入的一个新特性,它为开发者提供了更底层、更强大的相机控制能力。相较于早期的Camera API,Camera2 API允许开发者实现更专业级的摄影功能,如手动...
android 自定义相机apk 是的安装包,请结合我的博客:http://blog.csdn.net/qq_38416326/article/details/71124946
在Android开发中,自定义相机(Camera)是一个常见的需求,特别是在构建涉及图像捕获和处理的应用时。然而,由于Android设备的多样性,开发者经常会遇到一些挑战,比如相机预览显示偏转90度的问题。本篇文章将深入...
主要包含三个方面,Android启动系统相机生成缩略图、Android启动系统相机生成原图以及Android自定义相机等。 博客地址:http://blog.csdn.net/chenzheng8975/article/details/53943775
在Android应用开发中,自定义相机功能是一项常见的需求。然而,开发者在实现这一功能时可能会遇到...开发者在进行相机功能开发时,应充分理解Android Camera API,结合设备特性进行优化,以提供稳定、良好的用户体验。
[Camera ZOOM是一款功能非常强大的拍照软件 软件功能: 智能防抖设计; 4倍数码变焦功能; 免费的软件皮肤包专业四格相片展示; 自动定时拍照 可语音激活 ; 可在拍照前自由设定照片大小质量 内置多款不类型 风格的特效...
Camera camera = new Camera(); // 设置分辨率 camera.Resolution = new Size(640, 480); // 启动预览 camera.Preview += new PreviewEventHandler(Camera_Preview); camera.StartPreview(); private static void...