下面是我自己整理的源码,网络上好多不能够运行,或者有bug。
我在emulator android 2.1运行良好,源码注释一定程度能够自我解释
强烈推荐配合adb locat Take2:d *:s查看程序运行函数调用情况
对Activity生命周期不是很理解的,请先看我之前的一片文章
http://menuz.iteye.com/blog/1255320
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<Button android:layout_width="fill_parent"
android:layout_height="wrap_content" android:id="@+id/cameraButton"
android:text="拍照" />
<SurfaceView android:id="@+id/surface_camera"
android:layout_width="fill_parent" android:layout_height="10dip"
android:layout_weight="1">
</SurfaceView>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.busclient"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.CAMERA" /> <!-- 注意必须在application上面-->
<application android:icon="@drawable/icon" android:label="@string/app_name">
<uses-library android:name="com.google.android.maps" />
<activity android:name=".Take2"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
<uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
</manifest>
package com.busclient;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import android.app.Activity;
import android.hardware.Camera;
import android.hardware.Camera.PictureCallback;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class Take2 extends Activity implements SurfaceHolder.Callback {
private final static String TAG = "Take2";;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Camera mCam;
private boolean hasStartPreview = false;
private Button btnTakePicture;
// Camera API:
// Call release() to release the camera for use by other applications.
// Applications should release the camera immediately in onPause() (and
// re-open() it in onResume()).
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.takephoto);
Log.d(TAG, "onCreate");
// 取得surfaceView的引用,surface在surfaceView中展现
// 当surfaceView可见时,surface会被创建,实现surfaceCreated进行特定操作
surfaceView = (SurfaceView) findViewById(R.id.surface_camera);
btnTakePicture = (Button) findViewById(R.id.cameraButton);
// 注册按钮实现拍照
btnTakePicture.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mCam != null) {
// 调用mCam进行拍照
// param1 Camera.ShutterCallback
// param2 Camera.PictureCallback raw 当原始图片数据获得时,会执行PictureCallback
// param3 Camera.PictureCallback compressed 当压缩数据获得时,会执行PictureCallback
mCam.takePicture(null, null, pictureCallBack);
}
}
});
// 要操作surface,只有通过surfaceHolder
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
private PictureCallback pictureCallBack = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
if (mCam != null) {
if (data != null) {
File f = new File("/data/data/com.busclient/picture1.jpg");
FileOutputStream fout = null;
try {
if (!f.exists())
f.createNewFile();
fout = new FileOutputStream(f);
fout.write(data);
fout.close();
Log.d(TAG, "write success");
Thread.sleep(1500);
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
if (fout != null) {
fout.close();
fout = null;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
finish();
}
}
};
// surface只能够由一个线程操作,一旦被操作,其他线程就无法操作surface
@Override
public void surfaceCreated(SurfaceHolder holder) {
Log.d(TAG, "surfaceCreated");
try {
// 必须设置一个初始化的surfaceHolder,若没有surface(由holder操作surface),
// 则camera无法启动预览 (就是一般打开照相机屏幕能够动态显示场景??描述的不够好)
mCam.setPreviewDisplay(surfaceHolder);
} catch (IOException e) {
Log.d(TAG, "error");
mCam.release();
mCam = null;
}
}
// 在surfaceCreated后调用,当surface发生变化也会触发该方法,这个方法
// 一般至少被调用一次
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
Log.d(TAG, "surfaceChanged");
// 调用startPreview使预览surface可以更新,拍照
// 必须启动预览,而startPreview必须在setPreviewDisplay(surfaceHolder)之后
if (mCam != null && hasStartPreview == false) {
mCam.startPreview();
hasStartPreview = true;
}
}
// 析构surface
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(TAG, "surfaceDestroyed");
// 活都被onPause抢去了
}
@Override
protected void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
// onPause比surfaceDestroyed() 先调用
@Override
protected void onPause() {
Log.d(TAG, "onPause");
if (hasStartPreview) {
mCam.stopPreview();
}
mCam.release();
mCam = null;
hasStartPreview = false;
super.onPause();
}
@Override
protected void onRestart() {
Log.d(TAG, "onRestart");
super.onRestart();
}
@Override
protected void onResume() {
Log.d(TAG, "onResume");
if (mCam == null)
mCam = Camera.open();
super.onResume();
}
@Override
protected void onStart() {
Log.d(TAG, "onStart");
super.onStart();
}
@Override
protected void onStop() {
Log.d(TAG, "onStop");
super.onStop();
}
}
分享到:
相关推荐
这是github的项目源码地址。Android Studio2.3.3调用系统的Camera实现拍照功能,并将照片保存到本地内存卡中
Android 调用系统相机/相册 获取照片 在照片上添加文字水印
android studio 调用摄像头拍照或选择相册照片,拿到图片并存储图片
使用Qt for android调用原生系统的摄像头来录取设备,稳定高效,使用于安卓7.0版本及以上,测试在魅族5.0会后台死掉,但是录像会成功
调用系统相机进行拍照demo,代码是自己跟着慕课网课程《Android摄像头基础》(https://www.imooc.com/u/2950649/courses)中手动敲的,如果大家不想下载可以直接去看视频讲解,很短而且讲的不错。需要注意的是在真机...
delphi xe5 android 调用照相机摄像头拍照片camera,简单非常实用的原代码,无特定组件!
Android如何调用系统现有的照相机拍照与摄像,详细参见博客:http://www.cnblogs.com/plokmju/p/Android_SystemCamera.html
android 调用照相机拍照,其中对对焦进行了一定的优化
http://blog.csdn.net/shen332401890/article/details/9313379 ,菜鸟提供,请大神多多提意见。
首先创建一个文件,用于保存拍照图像,然后根据不同系统版本获取Uri,传递给Intent,然后调起相机(可以考虑将outputImage、imageUri设置为全局变量)。 3、处理回调 使用BitmapFactory读取imageUri,得到bitmap,...
android 实现调用系统的照相机照相,并简单的显示显示
MainActivity类是调用系统摄像头 MyCameroActivity类是通过surfaceholder的方式调用camera拍照的,只用拍照功能。适合初学者的。
在Android中,调用系统相机拍照时,将会接收到返回的图像数据,但是这些图片并不是全尺寸的图像,而是系统给的缩略图,当对拍照的图片进行裁切后显示时,得到的却是模糊的图片。下面针对这个问题提出解决的方法。 ...
资源中的打开相机和相册均是原生Java代码实现,在我自己手机和安卓7.0版本上面稳定可靠,测试在魅族5.0版本左右打开相机会死掉,由Qt调用,demo可学习Qt如何与原生Java的交互通信,代码均有注释,里面还有微信等接口...
本文实例讲述了Android调用摄像头功能的方法。分享给大家供大家参考,具体如下: 我们要调用摄像头的拍照功能,显然 第一步必须加入调用摄像头硬件的权限,拍完照后我们要将图片保存在SD卡中,必须加入SD卡读写权限...
程序运行后,打开照相机摄像头能够自动连续拍照5次。次数可以在程序中自动修改。照相头可以选择前置摄像头或者后置摄像头。5次拍照完成后,程序会自动退出,照片保存在手机的SD卡上面。
android一个demo,演示功能:调用系统相机拍照,将返回的照片显示在屏幕上,并存储到sd上。
安卓开发调用系统拍照和摄像功能并保存到自定义文件夹中
Android调用相机并将照片显示出来,使用的是Android-17 设置权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_...
本例子通过一个Intent打开系统的自带照相机照相,并把图片显示出来