Android开发_Camera应用

来源:互联网 发布:数据库union用法 编辑:程序博客网 时间:2024/05/17 04:46

1、通过调用系统的照相机实现照相功能

1)将拍照的图片存到本地文件,然后再读取显示

public class MainActivity extends Activity {private Button btn;private ImageView iv;private File file = null;private static final int REQUEST_CODE = 1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn = (Button) findViewById(R.id.btn);iv = (ImageView) findViewById(R.id.iv);// 设置按钮单击事件btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 在sdcard卡中创建一个文件夹,要获取相应的权限File dir = new File(Environment.getExternalStorageDirectory(),"pictures");if (!dir.exists()) {dir.mkdir();}file = new File(dir, System.currentTimeMillis() + ".jpg");if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}// 调用系统的照相机Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));startActivityForResult(i, REQUEST_CODE);}});}// 获取Activity返回结果的方法@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case REQUEST_CODE:iv.setImageURI(Uri.fromFile(file));break;default:break;}super.onActivityResult(requestCode, resultCode, data);}}


2)直接读取拍照的数据,并且显示

public class Main extends Activity implements OnClickListener{private ImageView imageView;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);Button btnTakePicture = (Button)findViewById(R.id.btnTakePicture);btnTakePicture.setOnClickListener(this);imageView = (ImageView)findViewById(R.id.imageview);}protected void onActivityResult(int requestCode, int resultCode, Intent data){if(requestCode == 1){if(resultCode == Activity.RESULT_OK){Bitmap cameraBitmap = (Bitmap)data.getExtras().get("data");imageView.setImageBitmap(cameraBitmap);}}}    public void onClick(View view)    {    Intent intent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    startActivityForResult(intent, 1);        }}

相应的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <ImageView        android:id="@+id/iv"        android:layout_width="match_parent"        android:layout_height="0dp"        android:layout_weight="1" />    <Button        android:id="@+id/btn"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="开始拍照" /></LinearLayout>



2、通过调用Camera类实现照相功能

要使用照相机,需要获取相应的权限<uses-permission android:name="android.permission.CAMERA" />

public class MainActivity extends Activity {private SurfaceView sv;private Camera camera;// 照相机对象private Button btn;// 照相按钮private Callback callback = new Callback() {@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {stopPreview();}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {startPreview();}@Overridepublic void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,int arg3) {}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);sv = (SurfaceView) findViewById(R.id.sv);sv.getHolder().addCallback(callback);btn = (Button) findViewById(R.id.btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {// 照相机拍照camera.takePicture(null, null, new Camera.PictureCallback() {// 拍完照片后的回调方法@Overridepublic void onPictureTaken(byte[] data, Camera camera) {String path = null;if ((path = saveFile(data)) != null) {Intent i = new Intent(MainActivity.this,ImagePreviewActivity.class);i.putExtra("path", path);startActivity(i);} else {// 保存文件失败Toast.makeText(MainActivity.this, "保存照片失败!",Toast.LENGTH_SHORT).show();}}});}});}// 开始预览private void startPreview() {// 打开照相机camera = Camera.open();try {camera.setPreviewDisplay(sv.getHolder());camera.setDisplayOrientation(90);camera.startPreview();} catch (IOException e) {e.printStackTrace();}}// 结束预览private void stopPreview() {camera.stopPreview();camera.release();}// 保存照片的方法private String saveFile(byte[] bytes) {try {// createTempFile()在android 4.x版本后默认的存储路径为:/data/data/应用包名/cache// 而之前的版本该方法会把文件存储在sd上File f = File.createTempFile("img", "");FileOutputStream fos = new FileOutputStream(f);fos.write(bytes);fos.flush();fos.close();return f.getAbsolutePath();} catch (IOException e) {e.printStackTrace();}return null;}}
public class ImagePreviewActivity extends Activity {private ImageView iv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);iv = new ImageView(this);setContentView(iv);// 获取图片的路径String path = getIntent().getStringExtra("path");if (path != null) {// 显示图片iv.setImageURI(Uri.fromFile(new File(path)));}}}
相应的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <SurfaceView        android:id="@+id/sv"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:layout_weight="1" />    <Button        android:id="@+id/btn"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="拍照" /></LinearLayout>

0 0
原创粉丝点击