Android 简单相机和照片查看器的制作

这篇博客介绍了如何在Android应用中实现简单的相机功能和照片查看器。首先讲解了如何利用SurfaceView和SurfaceHolder来实现相机拍照,包括权限设置、照片存储、动态权限请求。接着,博主详细阐述了照片查看器的实现,包括图片路径显示、图片显示、删除功能以及在Activity之间的切换。代码示例和布局文件也在文中给出。
摘要由CSDN通过智能技术生成

第一篇:本人的第一篇博客

相机是手机内部必不可少的一个软件…那我们如何做出一个简单的相机呢?在Android内部提供了一个内部类android.view.SurfaceHolder这个类,这个类提供了SurfaceView,这个类可以帮助我们实现照相功能…


1.实现拍照

  • 实现拍照就必须要有对相机的访问权限
  • 拍照所得的照片的存储就需要有对SD卡的访问权限以及对SD卡中文件夹的创建和删除的权限
    -
    添加到AndroidManifest.xml中
 <uses-permission android:name="android.permission.WRITE_EXTENAL_STORAGE"/>
 //sdcard的写权限
    <uses-permission    android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    //sdcard的读权限
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
    //允许挂载和反挂载文件系统可移动存储

调用摄像机
//现在的相机一般都有两个摄像头,我们需要定义我们想要打开哪个摄像头,默认的是后置的摄像头...这里打开的也是后置的摄像头...
if(Camera.getNumberOfCameras()==2){
camera=Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
}else{
camera=Camera.open(0);
}

获取相机参数
Parameters param=Camera1.this.camera.getParameters()
//Camera1是我所建的类名,根据实际情况更改

预览
try { Camera1.this.camera.setPreviewDisplay(Camera1.this.surfaceHolder);//设置我们预览时的SurfaceHolder...
} catch (IOException e) {
e.printStackTrace();
}
Camera1.this.camera.startPreview();//开始预览...

拍照

Camera1.this.camera.takePicture(shutter, raw, jpeg);
//Camera.takePicture(shutterCallback,rawCallback,pictureCallback ); 三个回调参数分别代表:按下快门执行的代码;如需要处理raw执行的代码;图片存储执行的代码。 

存储
针对Android 6.0以上,除了需要静态权限,还需要动态权限。
ActivityCompat.requestPermissions(Camera1.this, new String[]{android
.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);

弹出请求后获得权限立马进入public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults)中。

     @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,@NonNull int[] grantResults) {
        switch (requestCode) {
            case 1:
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //创建文件夹
                    if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                      //这里执行获取权限的代码。 

                    }
                    break;
                }
        }
    }   

新建文件夹

String filename = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator + "CameraPhoto"  ;
File file = new File(filename);
if (!file.exists())
 {
  //如果不存在,就创建一个。最后一般来说会在根目录下找到CameraPhoto文件夹
    file.mkdirs();
}

将照片转化成字节数据

Bitmap bmp = BitmapFactory.decodeByteArray(data, 0, data.length);

将照片存入file里面

FileOutputStream buf = new FileOutputStream(filename+File.separator+"picture.jpg");                                           

bmp.compress(Bitmap.CompressFormat.JPEG, 100, buf);

最后我们可以在CameraPhoto文件中找到名为picture.jpg的照片。因为这里是固定的照片名,每次拍照存储都把之前的照片替换掉了,所以只能存储一张照片。当然可以在文件名上面加上System.currentTimeMillis()函数,这样每次照片的名字都不一样。
完整代码

  1. Activity代码
package com.example.myapplication;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.os.Bundle;
import android.os.Environment;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.view.Display;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * Created by 邓磊 on 2017/7/30.
 */

public class Camera1 extends Activity implements View.OnClickListener {
   
    
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值