您的位置:首页 > 移动开发 > Android开发

Android使用摄像头,分别获取照片的缩略图与原图

2016-07-01 16:47 369 查看
看了慕课网的摄像头入门,于是记一下

本文主要有以下两个功能:

1、打开摄像头拍照,将一张缩略图显示在imageView中

2、将照片的原图显示在imageView中

布局先行:



先来实现第一个功能

即按下“取缩略图”这个按钮,进入系统相机视图,拍照后返回,在下面的imageView中显示所拍下的图片。

public class MainActivity extends Activity {
private ImageView imageView;
private int REQ_1 = 1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
}
public void showCompressed(View view){ //通过xml文件中button的android:onClick="showCompressed"实现
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//打开相机,是不是很简单呢
startActivityForResult(intent,REQ_1);//因为要调回数据(图片),所以要用这个方法
}
//REQ_1为请求标记码,有了她,在回调时可以根据不同的请求码作出相应的处理,不慌乱

/**
*因为用了startActivityForResult这个方法来请求返回的数据,
* 所以要用下面这个回调方法来获取并处理返回的数据。
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {          //RESULT_OK代表请求结果返回成功
if (requestCode == REQ_1) {         //判断请求码,以便作出相应处理
Bundle bundle = data.getExtras();       //从intent中取出Bundle类型数据
Bitmap bitmap = (Bitmap) bundle.get("data");//通过图像处理类处理bundle数据
imageView.setImageBitmap(bitmap);
}
}
}
}


以上要注意startActivityForResult这个方法,获取图片的关键。

通过以上代码即可完成第一个功能,只不过这里在imagView中显示的图片是原图的缩略图,这是Android系统默认的。那么如何在imageView中获取照片的原图呢?如下:

第二个功能

即即按下“取原图”这个按钮,进入系统相机视图,拍照后返回,在下面的imageView中显示所拍下的图片的原图

具体步骤:

1、首先在SD卡上指定一条路径

2、拍照后将照片的原图保存于这条路径上

3、根据此路径将这张原图读取出来

连同第一个功能的代码一起列出如下

public class MainActivity extends Activity {
private ImageView imageView;
private int REQ_1 = 1;
private int REQ_2 = 2;
private String filePath;  //定义一个String类型表示文件路径
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
filePath = Environment.getExternalStorageDirectory().getPath();//获取SD卡路径
filePath = filePath + "/"+"temp.png";    //为将要用摄像头获取的图片提前设定一条路径
}
public void showCompressed(View view){ //通过xml文件中button的android:onClick="showCompressed"实现
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  //打开相机,是不是很简单呢
startActivityForResult(intent,REQ_1); //因为要调回数据(图片),所以要用这个方法
//REQ_1为请求标记码,有了她,在回调时可以根据不同的请求码作出相应的处理,不慌乱
}
public void showOriginal(View view){     // android:onClick="showOriginal"
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//打开相机
Uri uri = Uri.fromFile(new File(filePath));  //用这条路径生成一个Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);//将设备产生的数据保存到这个设定的uri上
startActivityForResult(intent, REQ_2);

}

/**
*因为用了startActivityForResult这个方法来请求返回的数据,所以要用下面这个回调
* 方法来获取并处理返回来的数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {      //RESULT_OK代表请求结果返回成功
if (requestCode == REQ_1) {        //判断请求码,以便作出相应处理
Bundle bundle = data.getExtras();   //从intent中取出Bundle类型数据
Bitmap bitmap = (Bitmap) bundle.get("data");  //通过图像处理类Bitmap来处理bundle数据
imageView.setImageBitmap(bitmap);
}
else if (requestCode ==REQ_2){    //根据请求码,做出获取原图的行为
FileInputStream  fis=null;  //FileInputStream 用于读取本地文件中的字节数据
try {
fis = new FileInputStream(new File(filePath));//读取路径上文件流
Bitmap bitmap = BitmapFactory.decodeStream(fis);//解码文件流
imageView.setImageBitmap(bitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

}
}
}


因为涉及到在SD上创建文件,所以要添加使用权限

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


最后附上xml代码

<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context="com.hao.bond.mycamera.MainActivity">

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="showCompressed"
android:text="取缩略图"
/>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:onClick="showOriginal"
android:text="取原图" />

<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal" />
</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 摄像头 图片