本文实例为大家分享了Android打开系统相机并拍照的具体实现代码,供大家参考,具体内容如下 目标效果: 第二张为点击第一个按钮拍照后显示的,比较模糊,第三章为点击第二个按钮拍照后显示的,比较清楚。 1.activity_main.xml页面设置布局。 activity_main.xml页面: <RelativeLayout xmlns:android=http://schemas.android.com/apk/res/android xmlns:tools=http://schemas.android.com/tools android:layout_width=matc 在Android开发中,有时我们需要集成系统相机功能,让用户可以拍照并获取拍摄的图片。本文将详细介绍两种不同的方法来实现这一功能。这两种方法主要的区别在于图片的处理方式,从而影响最终显示的效果。 我们来看看布局文件`activity_main.xml`的设计。布局包含两个按钮,分别用于触发不同的拍照操作:`btnOpenCamera`用于拍照后立即显示,`btnSavePhoto`则是拍照后存储到相册再显示。同时,还有一个`ImageView`组件`ivShowPicture`用于显示拍摄的图片。 ```xml <RelativeLayout 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" tools:context=".MainActivity"> <Button android:id="@+id/btnOpenCamera" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="10dp" android:text="拍照立即显示" /> <Button android:id="@+id/btnSavePhoto" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="60dp" android:text="拍照存储后显示" /> <ImageView android:id="@+id/ivShowPicture" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerHorizontal="true" android:layout_marginTop="130dp" /> </RelativeLayout> ``` 接下来,是`MainActivity.java`的实现。这里我们实现了`OnClickListener`接口,以便处理按钮的点击事件。定义了两个请求码`REQUEST_CAMERA_1`和`REQUEST_CAMERA_2`,分别对应两种拍照方法。 ```java public class MainActivity extends Activity implements OnClickListener { private Button btnOpenCamera, btnSavePhoto; private ImageView ivShowPicture; private static int REQUEST_CAMERA_1 = 1; private static int REQUEST_CAMERA_2 = 2; private String mFilePath; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); bindClick(); } // 初始化控件和变量 private void init() { btnOpenCamera = (Button) findViewById(R.id.btnOpenCamera); btnSavePhoto = (Button) findViewById(R.id.btnSavePhoto); ivShowPicture = (ImageView) findViewById(R.id.ivShowPicture); } // 绑定控件的点击事件 private void bindClick() { btnOpenCamera.setOnClickListener(this); btnSavePhoto.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btnOpenCamera: openCamera(REQUEST_CAMERA_1); break; case R.id.btnSavePhoto: openCamera(REQUEST_CAMERA_2); break; } } // 打开相机并处理返回的数据 private void openCamera(int requestCode) { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (requestCode == REQUEST_CAMERA_1) { // 第一种方法:拍照后立即显示,图片可能较模糊 cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(createImageFile())); startActivityForResult(cameraIntent, requestCode); } else if (requestCode == REQUEST_CAMERA_2) { // 第二种方法:拍照后保存到相册再显示,图片更清晰 startActivityForResult(cameraIntent, requestCode); } } // 创建一个临时文件用于存储图片 private File createImageFile() { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); mFilePath = image.getAbsolutePath(); return image; } // 处理相机返回的结果 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == REQUEST_CAMERA_1) { // 第一种方法:读取文件并显示 Bitmap bitmap = BitmapFactory.decodeFile(mFilePath); ivShowPicture.setImageBitmap(bitmap); } else if (resultCode == RESULT_OK && requestCode == REQUEST_CAMERA_2) { // 第二种方法:从数据中获取Bitmap并显示 Bundle extras = data.getExtras(); Bitmap bitmap = (Bitmap) extras.get("data"); ivShowPicture.setImageBitmap(bitmap); } } } ``` 在这段代码中,我们使用`ACTION_IMAGE_CAPTURE`启动系统相机应用。第一种方法(`REQUEST_CAMERA_1`)通过设置`EXTRA_OUTPUT`参数,使得图片直接保存到指定的文件中。当用户完成拍照后,我们读取这个文件并显示在`ImageView`上。这种方法通常适用于需要快速显示小尺寸图片的场景,但可能因为图片压缩而较模糊。 第二种方法(`REQUEST_CAMERA_2`)没有指定输出文件,因此相机应用会处理图片并返回一个缩略图。我们在`onActivityResult`中从返回的`Intent`中获取`Bitmap`数据,然后显示在`ImageView`上。这种方式得到的图片质量通常更好,适合显示大图,但可能会有延迟。 总结来说,这两种方法的主要区别在于图片的处理方式和显示时机。第一种方法通过指定文件路径,避免了处理返回数据的过程,但可能牺牲了图片质量。第二种方法虽然会有一些延迟,但能够获得高质量的图片。开发者可以根据具体需求选择合适的方法。在实际应用中,还可以进一步优化,比如添加权限检查、错误处理等。
- 粉丝: 6
- 资源: 910
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助