设为首页 加入收藏

TOP

Android 4.1 无预览拍照(一)
2014-11-24 08:29:37 来源: 作者: 【 】 浏览:0
Tags:Android 4.1 预览 拍照

1、setParameters failed解决方法


2、无预览拍照


看代码吧,其实实现特简单。主要是思路问题。


public class NoPreviewTakePicActivity extends Activity{
private Camera mCamera;
private CameraPreview mPreview;
private ToneGenerator mTone;
private static final int OPTION_SNAPSHOT = 0;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPreview = new CameraPreview(this);
setContentView(R.layout.main);
addContentView(mPreview, new LayoutParams(1, 1));// 在Layout中加入了一个宽高为1的一个预览区域。但用户确实看不到,就莫名其妙的拍照了。
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int itemId = item.getItemId();
switch(itemId){
case OPTION_SNAPSHOT:
mCamera.takePicture(shutterCallback, null, jpegCallback);
break;
}
return true;
}
private PictureCallback jpegCallback = new PictureCallback(){

public void onPictureTaken(byte[] data, Camera camera) {
Parameters ps = camera.getParameters();
if(ps.getPictureFormat() == PixelFormat.JPEG){
String path = save(data);
Uri uri = Uri.fromFile(new File(path));
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.setDataAndType(uri, "image/jpeg");
startActivity(intent);
}
}
};

private ShutterCallback shutterCallback = new ShutterCallback(){
public void onShutter() {
if(mTone == null){
mTone = new ToneGenerator(AudioManager.STREAM_MUSIC,ToneGenerator.MAX_VOLUME);
}
mTone.startTone(ToneGenerator.TONE_PROP_BEEP2);
}
};

private String save(byte[] data){
String path = "/mnt/sdcard/"+System.currentTimeMillis()+".jpg";
try {
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
String storage = Environment.getExternalStorageDirectory().toString();
StatFs fs = new StatFs(storage);
long available = fs.getAvailableBlocks()*fs.getBlockSize();
if(available return null;
}
File file = new File(path);
if(!file.exists()){
file.createNewFile();
}
FileOutputStream fos = new FileOutputStream(file);
fos.write(data);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return path;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(0, OPTION_SNAPSHOT, 0, R.string.snapshot);
return super.onCreateOptionsMenu(menu);
}

class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

SurfaceHolder mHolder;

public CameraPreview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
//mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); // 4.0+ auto
}
public void surfaceCreated(SurfaceHolder holder) {
mCamera = Camera.open(1);
try {
mCamera.setPreviewDisplay(holder);
} catch (IOException exception) {
mCamera.release();
mCamera = null;
}
}

public void surfaceDestroyed(SurfaceHolder holder) {
mCamera.stopPrevie

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇调整Android手机屏幕亮度 下一篇Java内存泄漏的定位与分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何从内核协议栈到 (2025-12-27 03:19:09)
·什么是网络协议?有哪 (2025-12-27 03:19:06)
·TCP/ IP协议有哪些 (2025-12-27 03:19:03)
·怎样用 Python 写一 (2025-12-27 02:49:19)
·如何学习python数据 (2025-12-27 02:49:16)