Android摄像头基础——第一阶段 简单利用系统相机并且获取照片

1.布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/startCamera"
        android:text="Start Camera"/>

    <Button 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/startCamera2"
        android:text="Start Camera2"/>

    <ImageView 
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/imageView" />

</LinearLayout>

第一个按钮用于获取拍照后返回的缩略图,第二个按钮用于将拍照后的照片存储到指定路径,再从指定路径获取原图


2.Activity代码

public class MainActivity extends Activity {
    private Button startCamera;
    private Button startCamera2;
    private ImageView imageView;

    private String photoFilePath;// 照片存放路径

    private static final int REQ_1 = 1;
    private static final int REQ_2 = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startCamera = (Button) findViewById(R.id.startCamera);
        startCamera2 = (Button) findViewById(R.id.startCamera2);
        imageView = (ImageView) findViewById(R.id.imageView);
        photoFilePath = Environment.getExternalStorageDirectory().getPath();// 获取sd卡目录的路径
        photoFilePath += "/test.jpg";
        startCamera.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 指定action,隐式Intent
                startActivityForResult(intent, REQ_1);// 在指定的新的Activity结束后返回此Activity中,并且返回了数据
                // REQ_1相当于一个标记,当时指定的Activity结束后会返回REQ_1给onActivityResult中的requestCode
                // 表明是需要的Activity返回的数据
            }
        });

        startCamera2.setOnClickListener(new OnClickListener() {
            // 从照片存储的系统目录中去获取原图
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                Uri photoUri = Uri.fromFile(new File(photoFilePath));// 这里包含两步
                // 首先根据指定路径创建一个文件对象
                // 然后根据这个文件对象获得Uri
                intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);// 根据EXTRA_OUTPUT参数,系统相机将会在获取照片后根据相应的Uri存储照片
                // 一定要注意,是uri,不是文件的路径字符串!!!!!!!!!!

                startActivityForResult(intent, REQ_2);
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == RESULT_OK) {// 判断新启动的Activity是否顺利结束
            if (requestCode == REQ_1) {
                Bundle bundle = data.getExtras();// Bundle类是一个key-value对,两个activity之间的通讯可以通过bundle类来实现
                // data中的图片数据是缩略图,而不是原图(因此imageView中显示的图片不会像原图那样清晰)
                // 因为如果返回原图可能会数据量太大导致数据溢出

                // Bitmap是Android系统中的图像处理的最重要类之一
                Bitmap bitmap = (Bitmap) bundle.get("data");// 将得到的图片数据存储在bitmap中

                if(bitmap!=null) startCamera.setText(""+bitmap.getWidth()+" "+bitmap.getHeight());
                else startCamera.setText("null");

                imageView.setImageBitmap(bitmap);
            } else if (requestCode == REQ_2) {
                FileInputStream fis = null;// 局部变量需要初始化
                try {
                    fis = new FileInputStream(photoFilePath);

//需要注意,布局里面的ImageView的height和width都是match_parent

                    Bitmap bitmap = BitmapFactory.decodeStream(fis);
                    //这里如果图片尺寸太大,可能无法在ImageViwe中显示出来
                    // 因为硬件加速的时候,对图片的大小有限制。不同设备可能有不同的最大值。
                    //这个问题悲催的地方是,程序貌似没有捕获到这个exception, 结果是程序也不报错,图片也显示不出来。
                    //只有看debug log才能发现这个error message
                    //这里可参考一下这儿http://blog.it985.com/14166.html

//解决方法,适当的把图片按比例缩小再创建bitmap对象
//                  BitmapFactory.Options options=new BitmapFactory.Options();
//                  options.inJustDecodeBounds=false;//如果为true,bitmap将会为null
//                  options.inSampleSize=2;//把图片的尺寸缩小一半
//                  Bitmap bitmap = BitmapFactory.decodeStream(fis,null,options);
//或者也可以用一个简单暴力的方法:禁止硬件加速
//在AndroidManifest.xml中的application添加如下代码
//<application android:hardwareAccelerated="false" ...>

                    if(bitmap!=null) startCamera2.setText(""+bitmap.getWidth()+" "+bitmap.getHeight());
                    else startCamera2.setText("null");

                    imageView.setImageBitmap(bitmap);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

这里写图片描述因图片尺寸太大而报错


3.在AndroidMainfest.xml中添加相应的权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

允许程序写入外部存储,如SD卡上写文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值