Android camera无法android 自定义进度条图片分辨率

Android Camera拍照常见问题小结
在用SurfaceView 和Camera 做摄像头程序时,常常会遇到一些比较纠结的问题,这里简单描述下:
1、预览取景反转
这种情况,再低版本sdk中,必须设置为横屏模式[android:screenOrientation=&landscape&]
2、预览图像被拉伸变形
由于预览大小跟SurfaceView
大小不一致引起,常常需要根据surfaceChanged事件的参数width和height,获取系统支持的所有预览尺寸
[getSupportedPictureSizes],然后再取一个比较接近的尺寸进行设置[setPreviewSize]
3、预览速率
需要先根据[GetSupportedPreviewFrameRates]获取系统支持的,然后,选择一个最低的进行设置[setPreviewFrameRate]即可
4、保存图片反转
在拍照[takePicture]之前,先对rotation进行偏转设置[rotation]
5、设置为横屏模式之后,UI界面怎么伪横竖屏
添加个OrientationEventListener根据获取不同方向,调整UI布局,对于一些比较特殊,不变调整的控件,可以采用播放动画的方式来实现。
目前,我还遇到一个比较纠结的问题,就是保存相片时,stopPreview
和再次startPreview之间,SurfaceView上会显示一个静态的画面,该画面被拉伸,不知什么原因,请知道原因的大虾赐教!
请各位遵纪守法并注意语言文明开发相机程序之实现自动对焦和分辨率设置功能
-android100学习网
开发相机程序之实现自动对焦和分辨率设置功能
今天我们来讲一下在Android平台上开发相机的问题!这里讲的是调用系统相机。1、从xml文件中得到surfaceview对象嬀栀琀洀氀崀 猀甀爀昀愀
今天我们来讲一下在Android平台上开发相机的问题!这里讲的是调用系统相机。
1、从xml文件中得到surfaceview对象
[] &surfaceView = (SurfaceView) findViewById(R.id.g3_server_preview); &
surfaceView = (SurfaceView) findViewById(R.id.g3_server_preview);
2、之后声明一些回调方法,用于打开相机,设置相机的参数&
[html] &// SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变 &
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { &
& & @Override &
& & public void surfaceCreated(SurfaceHolder holder) { &
& & & & // 打开相机 &
& & & & camera = Camera.open(); &
& & & & try { &
& & & & & & // 设置预览 &
& & & & & & camera.setPreviewDisplay(holder); &
& & & & } catch (IOException e) { &
& & & & & & e.printStackTrace(); &
& & & & } &
& & @Override &
& & public void surfaceChanged(SurfaceHolder holder, int format, int width, &
& & & & & & int height) { &
& & & & // 获得相机参数 &
& & & & Camera.Parameters parameters = camera.getParameters(); &
& & & & // SDK版本选择,兼容 &
& & & & if (Integer.parseInt(Build.VERSION.SDK) &= 8) { &
& & & & & & setDisplayOrientation(camera, 90); &
& & & & } else { &
& & & & & & if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) { &
& & & & & & & & parameters.set("orientation", "portrait"); &
& & & & & & & & parameters.set("rotation", 90); &
& & & & & & } &
& & & & & & if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { &
& & & & & & & & parameters.set("orientation", "landscape"); &
& & & & & & & & parameters.set("rotation", 90); &
& & & & & & } &
& & & & } &
& & & & // 设置预览大小 &
& & & & parameters.setPreviewSize(width, height); &
& & & & pic_Width = g3_setting.getInt(AppData.G3_PIC_WIDTH, 640); &
& & & & pic_Height = g3_setting.getInt(AppData.G3_PIC_HEIGHT, 800); &
& & & & Log.i("Travel", pic_Width + ":" + pic_Height); &
& & & & // 设置照片大小 &
& & & & parameters.setPictureSize(pic_Width, pic_Height); &
& & & & // 设置照片格式 &
& & & & // parameters.setPictureFormat(PixelFormat.RGB_565); &
& & & & // 开始预览 &
& & & & camera.startPreview(); &
& & & & // 设置相机参数 &
& & & & camera.setParameters(parameters); &
& & @Override &
& & public void surfaceDestroyed(SurfaceHolder holder) { &
& & & & // 停止预览 &
& & & & if (camera != null) { &
& & & & & & camera.stopPreview(); &
& & & & & & // 释放相机资源 &
& & & & & & camera.release(); &
& & & & & & camera = &
& & & & } &
// SurfaceHodler 回调,处理打开相机,关闭相机以及照片尺寸的改变
SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// 打开相机
camera = Camera.open();
// 设置预览
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// 获得相机参数
Camera.Parameters parameters = camera.getParameters();
// SDK版本选择,兼容
if (Integer.parseInt(Build.VERSION.SDK) &= 8) {
setDisplayOrientation(camera, 90);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
parameters.set("orientation", "portrait");
parameters.set("rotation", 90);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
parameters.set("orientation", "landscape");
parameters.set("rotation", 90);
// 设置预览大小
parameters.setPreviewSize(width, height);
pic_Width = g3_setting.getInt(AppData.G3_PIC_WIDTH, 640);
pic_Height = g3_setting.getInt(AppData.G3_PIC_HEIGHT, 800);
Log.i("Travel", pic_Width + ":" + pic_Height);
// 设置照片大小
parameters.setPictureSize(pic_Width, pic_Height);
// 设置照片格式
// parameters.setPictureFormat(PixelFormat.RGB_565);
// 开始预览
camera.startPreview();
// 设置相机参数
camera.setParameters(parameters);
public void surfaceDestroyed(SurfaceHolder holder) {
// 停止预览
if (camera != null) {
camera.stopPreview();
// 释放相机资源
camera.release();
};[html] view plaincopyprint?protected void setDisplayOrientation(Camera camera, int angle) { &
& & Method downP &
& & try { &
& & & & downPolymorphic = camera.getClass().getMethod( &
& & & & & & & & "setDisplayOrientation", new Class[] { int.class }); &
& & & & if (downPolymorphic != null) &
& & & & & & downPolymorphic.invoke(camera, new Object[] { angle }); &
& & } catch (Exception e1) { &
protected void setDisplayOrientation(Camera camera, int angle) {
Method downP
downPolymorphic = camera.getClass().getMethod(
"setDisplayOrientation", new Class[] { int.class });
if (downPolymorphic != null)
downPolymorphic.invoke(camera, new Object[] { angle });
} catch (Exception e1) {
3、然后设置surfaceview参数,加载回调方法&
[html] &// 设置屏幕常亮 &
surfaceView.setKeepScreenOn(true); &
surfaceView.setFocusable(true); &
releaseCamera(); &
// 从SurfaceView中获得SurfaceHolder &
surfaceView.getHolder().addCallback(surfaceCallback); &
// 为SurfaceHolder 添加回调 &
// surfaceHolder.addCallback(surfaceCallback); &
surfaceView.getHolder() &
& & & & .setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); &
// 设置屏幕常亮
surfaceView.setKeepScreenOn(true);
surfaceView.setFocusable(true);
releaseCamera();
// 从SurfaceView中获得SurfaceHolder
surfaceView.getHolder().addCallback(surfaceCallback);
// 为SurfaceHolder 添加回调
// surfaceHolder.addCallback(surfaceCallback);
surfaceView.getHolder()
.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);释放相机资源
[html] &private void releaseCamera() { &
& & // TODO Auto-generated method stub &
& & if (camera != null) { &
& & & & camera.stopPreview(); &
& & & & // 释放相机资源 &
& & & & camera.release(); &
& & & & camera = &
private void releaseCamera() {
// TODO Auto-generated method stub
if (camera != null) {
camera.stopPreview();
// 释放相机资源
camera.release();
4、配置相机响声音还是震动的回调方法&
[html] &Camera.ShutterCallback shutter = new ShutterCallback() { &
& & @Override &
& & public void onShutter() { &
& & & & // TODO Auto-generated method stub &
& & & & if (tone == null) { &
& & & & & & // 发出提示用户的声音 &
& & & & & & tone = new ToneGenerator(AudioManager.STREAM_SYSTEM, &
& & & & & & & & & & ToneGenerator.MAX_VOLUME); &
& & & & } &
& & & & if (g3_setting.getBoolean(AppData.G3_CONFIG_AUDIO, true)) { &
& & & & & & tone.startTone(ToneGenerator.TONE_PROP_BEEP); &
& & & & } else { &
& & & & & & tone.stopTone(); &
& & & & & & Vibrator vibrator = (Vibrator) context &
& & & & & & & & & & .getSystemService(Service.VIBRATOR_SERVICE); &
& & & & & & vibrator.vibrate(100); &
& & & & } &
Camera.ShutterCallback shutter = new ShutterCallback() {
public void onShutter() {
// TODO Auto-generated method stub
if (tone == null) {
// 发出提示用户的声音
tone = new ToneGenerator(AudioManager.STREAM_SYSTEM,
ToneGenerator.MAX_VOLUME);
if (g3_setting.getBoolean(AppData.G3_CONFIG_AUDIO, true)) {
tone.startTone(ToneGenerator.TONE_PROP_BEEP);
tone.stopTone();
Vibrator vibrator = (Vibrator) context
.getSystemService(Service.VIBRATOR_SERVICE);
vibrator.vibrate(100);
小插曲,判断声音能否关闭&
[html] &File file = new File("/system/media/audio/ui/Camera_click.ogg"); &
if (!file.canWrite()) { &
& & Tools.showToast(context, "设置声音无效!"); &
} else { &
& & file.renameTo(new File("/system/media/audio/ui/Camera_click.ogg1")); &
File file = new File("/system/media/audio/ui/Camera_click.ogg");
if (!file.canWrite()) {
Tools.showToast(context, "设置声音无效!");
file.renameTo(new File("/system/media/audio/ui/Camera_click.ogg1"));
5、自动对焦并拍照&
[html] &// 对焦成功再拍照 &
camera.autoFocus(new AutoFocusCallback() { &
& & @Override &
& & public void onAutoFocus(boolean success, Camera camera) { &
& & & & // TODO Auto-generated method stub &
& & & & // success为true表示对焦成功 &
& & & & if (success) { &
& & & & & & if (camera != null) { &
& & & & & & & & // 停止预览 &
& & & & & & & & camera.stopPreview(); &
& & & & & & & & // 拍照 &
& & & & & & & & camera.takePicture(shutter, null, pictureCallback); &
& & & & & & } &
& & & & } &
// 对焦成功再拍照
camera.autoFocus(new AutoFocusCallback() {
public void onAutoFocus(boolean success, Camera camera) {
// TODO Auto-generated method stub
// success为true表示对焦成功
if (success) {
if (camera != null) {
// 停止预览
camera.stopPreview();
camera.takePicture(shutter, null, pictureCallback);
[html] &// 照片回调 &
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() { &
& & @Override &
& & public void onPictureTaken(byte[] data, Camera camera) { &
& & & & Log.i("G3", "picture operating............."); &
& & & & new SavePictureTask().execute(data); &
& & & & camera.startPreview(); &
// 照片回调
Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] data, Camera camera) {
Log.i("G3", "picture operating.............");
new SavePictureTask().execute(data);
camera.startPreview();
[html] &// 保存照片任务类 &
class SavePictureTask extends AsyncTask&byte[], String, String& { &
& & @Override &
& & protected String doInBackground(byte[]... params) { &
& & & & Log.i("G3", "picture saving............."); &
& & & & File path = new File(Tools.getSDPath()); &
& & & & if (!path.exists()) { &
& & & & & & path.mkdirs(); &
& & & & } &
& & & & // 创建文件 &
& & & & File picture = new File(Tools.getSDPath(), Tools.initPhotoName()); &
& & & & try { &
& & & & & & // 获得文件输出流 &
& & & & & & FileOutputStream fos = new FileOutputStream(picture.getPath()); &
& & & & & & // 写到该文件 &
& & & & & & fos.write(params[0]); &
& & & & & & // 关闭文件流 &
& & & & & & fos.close(); &
& & & & } catch (Exception e) { &
& & & & & & e.printStackTrace(); &
& & & & } &
// 保存照片任务类
class SavePictureTask extends AsyncTask&byte[], String, String& {
protected String doInBackground(byte[]... params) {
Log.i("G3", "picture saving.............");
File path = new File(Tools.getSDPath());
if (!path.exists()) {
path.mkdirs();
// 创建文件
File picture = new File(Tools.getSDPath(), Tools.initPhotoName());
// 获得文件输出流
FileOutputStream fos = new FileOutputStream(picture.getPath());
// 写到该文件
fos.write(params[0]);
// 关闭文件流
fos.close();
} catch (Exception e) {
e.printStackTrace();
6、注意事项:&
a.本项目代码已经实现对焦功能,如果你的相机不能对焦,那是手机本身不支持,与硬件有关
b.分辨率的设置,在第3步的surfaceChanged方法里已经实现,数据存在SharedPreference当中
但是有个小问题,配置分辨率页面必须写在另一页面,因为surfaceCallback事件不能被remove
而且camera被释放掉,仍然无作用,但原手机自带系统相机可以实现当页配置,所以如果你实现
此功能,还请赐教!android的自定义camera竖屏时,摄像头自动旋转90度的解决方案
如果说你把屏幕设置竖屏的时候,Android提供的SDK(android.hardware.Camera)里大概不能正常的使用竖屏(portrait
layout)加载照相机,当用竖屏模式加载照相机时会产生以下情况:. 照相机成像左倾90度(倾斜);
目前在百度google上搜到的最多的答案就是设置 parameters.set("orientation",
"portrait");或者设置 parameters.set("rotation", 90);
经过实践测试发现都没有效果。后来发现了一种方法可以这样子做:在声明的camera实例中设置
mCamera.setDisplayOrientation(90);这个参数,可以很好解决竖屏的时候,摄像头旋转90度的问题。这个郁闷了比较久的时间,也很无奈,终于解决了。。希望可以帮到大家!!!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。(转)android CAMERA 设置照片大小
- wpf - ITeye技术网站
博客分类:
最近在 REAL210 android 上调试 CAMERA 驱动。
发现原来的开发板只支持 640*320 以及 320*240 ,
但是用的是 OVW 的摄像头,应该可以拍照到
的分辨率的。
索性把这个 300W 打开吧。
1、看看这里是否支持 300W 的分辨率,原生 ANDROID 是支持到 500W 的。
packages/apps/Camera/res/values/strings.xml
&string name="pref_camera_picturesize_entry_"&5M Pixels&/string&
&string name="pref_camera_picturesize_entry_"&3M Pixels&/string&
&string name="pref_camera_picturesize_entry_"&2M Pixels&/string&
&string name="pref_camera_picturesize_entry_M Pixels&/string&
&!--&string name="pref_camera_picturesize_entry_640x480" translatable="false"&VGA&/string&--&
&!--&string name="pref_camera_picturesize_entry_320x240" translatable="false"&QVGA&/string&--&
&string name="pref_camera_picturesize_entry_640x480"&640 X 480&/string&
&string name="pref_camera_picturesize_entry_320x240"&320 X 240&/string&
2、设置 CAMERA 的最大分辨率
device/samsung/proprietar/libcamera/SecCamera.h
const struct camera_info s5k4ba_info =
// max_preview_width
// max_preview_height
// max_snapshot_width
// max_snapshot_height
完成以上两步在 CAMERA 界面就可以见到
300W 的选择了。
当选择了 300W 拍照后 系统卡住不动了,通过跟踪发现是
device/samsung/proprietar/libs3cjpeg/JpegEncode.cpp
encode_jpg(struct s5pc110_jpg_ctx *jpg_ctx,
struct jpg_enc_proc_param *enc_param)
这个函数里面申请的图片 SIZE 大于允许的范围了。
device/samsung/proprietar/libs3cjpeg/jpeg.h
#define MAX_JPG_WIDTH
#define MAX_JPG_HEIGHT
设置这个最大 SIZE 即可。
但是拍照的时候还是卡住了,通过跟踪发现和 内核的 JPEG 驱动有关,
进入 JPEG 驱动后发现允许的最大 分辨率是 800*480
把这个 SIZE 设置成
#ifdef CONFIG_VIDEO_JPEG_V2
static struct s3c_platform_jpeg jpeg_plat __initdata = {
.max_main_width= 2048,
.max_main_height= 1536,
.max_thumb_width= 320,
.max_thumb_height= 240,
然后再把申请的内存空间放大
S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG (14336 * SZ_1K)
注意:device/samsung/proprietar/libs3cjpeg/jpeg.h里面的
JPG_TOTAL_BUF_SIZE & S5PV210_VIDEO_SAMSUNG_MEMSIZE_JPEG
通过以上的修改
已经可以实现 300W 的拍照了
但是感觉拍出来的照片和 100W 的效果差不多
就是图片的 SIZE 变大了。
读者评论:
你的只是打开了camera的图片的拍照没有300w的效果 原因就是你拍300w的时候 但是调用了640*320 或是320*240的camera的配置 只是把图片拉升了而已 要实现300w的拍照还的在驱动里面配置camera的寄存器。
浏览: 68260 次
来自: 深圳
关于jvm锁的控制,可以参考下这个文章,写的非常详细http: ...
挺多 我试试先
这个加速插件是做什么用的?package com.example.
import java.io.F
import android.net.U
import android.os.B
import android.os.E
import android.text.format.T
import android.util.L
import android.view.D
import android.widget.ImageV
import android.app.A
import android.content.I
import android.graphics.B
import android.graphics.BitmapF
public class MainActivity extends Activity {
private final static String TAG="camera";
private final static int CAMERA_RESULT =0;
private ImageV
private String imageFileP
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//得到当前系统时间
Time t=new Time();
t.setToNow();
int year=t.
int month=t.
int day=t.monthD
int hour=t.
int minute=t.
int second=t.
Log.i(TAG, ""+year+month+day+hour+minute+second);
String filename=""+year+month+day+hour+minute+
//得到SD卡的路径也设置文件名
//这里可以简化的写成imageFilePath=Uri.parse("file:////sdcard/my.jpg");
/*imageFilePath=Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/my01.jpg";*/
imageFilePath=Environment.getExternalStorageDirectory()
.getAbsolutePath()+"/"+filename+".jpg";
//创建文件
File file=new File(imageFilePath);
//格式化为Uri
Uri fileImageFilePath=Uri.fromFile(file);
view=(ImageView)findViewById(R.id.imageview);
Intent i=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);//启动intent
//设置到意图中
i.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, fileImageFilePath);
startActivityForResult(i, CAMERA_RESULT);
//返回接收
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if(resultCode==RESULT_OK){
//以1/8加载原图像的大小
/*BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize=8;
Bitmap bitmap=BitmapFactory.decodeFile(imageFilePath, options);*/
/*Bundle bundle=data.getExtras();
Bitmap bitmap=(Bitmap) bundle.get("data");*/
view.setImageBitmap(bitmap);
//得到图像的大小和显示的大小,动态解压
Display display=getWindowManager().getDefaultDisplay();
int dw=display.getWidth();
int dh=display.getHeight();
//加载图像
BitmapFactory.Options options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;//设置之后可以设置长宽
Bitmap bitmap=BitmapFactory.decodeFile(imageFilePath, options);
int heightRatio=(int)Math.ceil(options.outHeight/(float)dh);
int widthRatio=(int)Math.ceil(options.outWidth/(float)dw);
Log.i(TAG, "heith:"+heightRatio);
Log.i(TAG,"width:"+widthRatio);
//判断长宽哪个大
if(heightRatio&1 && widthRatio&1){
if(heightRatio&widthRatio){
options.inSampleSize=heightR
options.inSampleSize=widthR
//对它进行真正的解码
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(imageFilePath, options);
view.setImageBitmap(bitmap);
阅读(...) 评论()

我要回帖

更多关于 android 自定义标题栏 的文章

 

随机推荐