当前我想使用使用Android camera api1创建一个demo.一个画布,底部一个按钮作为拍照键。展示图片并保存到系统相册。右下角在添加一个相册图标用于显示最后一张缩略图。
时间: 2024-03-24 12:36:24 浏览: 12
好的,以下是实现步骤:
1. 在 AndroidManifest.xml 文件中添加相机和存储权限:
```xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```
2. 在布局文件中添加一个 SurfaceView 作为相机预览,一个 Button 作为拍照按钮,一个 ImageView 作为展示图片的容器,一个 ImageButton 作为最后一张缩略图的容器:
```xml
<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<Button
android:id="@+id/takePhotoButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take photo"
android:layout_gravity="bottom|center_horizontal" />
<ImageView
android:id="@+id/photoImageView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone" />
<ImageButton
android:id="@+id/thumbnailImageButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:src="@drawable/ic_photo_library_black_24dp" />
```
3. 在 Activity 中获取视图控件,并实现拍照逻辑:
```java
public class MainActivity extends AppCompatActivity implements SurfaceHolder.Callback {
private Camera camera;
private SurfaceView surfaceView;
private SurfaceHolder surfaceHolder;
private Button takePhotoButton;
private ImageView photoImageView;
private ImageButton thumbnailImageButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
surfaceView = findViewById(R.id.surfaceView);
takePhotoButton = findViewById(R.id.takePhotoButton);
photoImageView = findViewById(R.id.photoImageView);
thumbnailImageButton = findViewById(R.id.thumbnailImageButton);
surfaceHolder = surfaceView.getHolder();
surfaceHolder.addCallback(this);
takePhotoButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
camera.takePicture(null, null, pictureCallback);
}
});
thumbnailImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO: 显示最后一张缩略图
}
});
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camera.setPreviewDisplay(surfaceHolder);
camera.startPreview();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
// 重新设置相机预览的大小和方向
Camera.Parameters parameters = camera.getParameters();
Camera.Size previewSize = getBestPreviewSize(parameters, width, height);
parameters.setPreviewSize(previewSize.width, previewSize.height);
camera.setParameters(parameters);
camera.setDisplayOrientation(90);
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera.release();
}
private Camera.PictureCallback pictureCallback = new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
// 将图片保存到系统相册
File pictureFile = getOutputMediaFile();
if (pictureFile == null) {
Log.d("MainActivity", "Error creating media file, check storage permissions");
return;
}
try {
FileOutputStream fos = new FileOutputStream(pictureFile);
fos.write(data);
fos.close();
} catch (FileNotFoundException e) {
Log.d("MainActivity", "File not found: " + e.getMessage());
} catch (IOException e) {
Log.d("MainActivity", "Error accessing file: " + e.getMessage());
}
// 显示图片并隐藏相机预览
photoImageView.setImageBitmap(BitmapFactory.decodeByteArray(data, 0, data.length));
surfaceView.setVisibility(View.GONE);
photoImageView.setVisibility(View.VISIBLE);
}
};
private static File getOutputMediaFile() {
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "MyCameraApp");
if (!mediaStorageDir.exists()) {
if (!mediaStorageDir.mkdirs()) {
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"IMG_" + timeStamp + ".jpg");
return mediaFile;
}
private static Camera.Size getBestPreviewSize(Camera.Parameters parameters, int width, int height) {
Camera.Size bestSize = null;
List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();
bestSize = sizeList.get(0);
for (int i = 1; i < sizeList.size(); i++) {
if ((sizeList.get(i).width * sizeList.get(i).height) >
(bestSize.width * bestSize.height)) {
bestSize = sizeList.get(i);
}
}
return bestSize;
}
}
```
4. 实现显示最后一张缩略图的逻辑,可参考以下代码:
```java
private void showLastThumbnail() {
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, null, null, MediaStore.Images.Media.DATE_ADDED + " DESC LIMIT 1");
if (cursor != null && cursor.moveToFirst()) {
String imagePath = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
thumbnailImageButton.setImageBitmap(bitmap);
cursor.close();
}
}
```
以上就是使用 Android camera api1 创建一个 demo 的全部步骤,希望可以帮到你。