很多应用程序都可能会用到调用摄像头拍照的功能,比如说程序里需要上传一张图片作为用户的头像,这时就会调用手机的摄像头,下面我们可以用一个例子来学习下。
新建一个PicDemo项目,然后修改main.xml中的代码,代码如下:
<RelativeLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:id=”@+id/activity_main”
android:layout_width=”match_parent”
android:layout_height=”match_parent”><Button
android:id=”@+id/take_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Take Photo”/><ImageView
android:id=”@+id/picture”
android:layout_width=”400dp”
android:layout_height=”400dp”
android:layout_centerInParent=”true”/></RelativeLayout>
可以看到,布局里面只有两个控件,Button和ImageView.Button适用于打开摄像头进行拍照的,而ImageView则是用于将拍到的图片显示出来。
下面我们开始编写具体逻辑
public class MainActivity extends AppCompatActivity {
public static final int TAKE_PHOTO = 1;
public static final int CROP_PHOTO = 2;
private Button takephoto,choosephoto;
private ImageView picture;
private Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
takephoto = (Button)findViewById(R.id.take_photo);
picture = (ImageView) findViewById(R.id.picture);
//调用手机相机
takephoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//创建File对象,用于储蓄拍照后的照片
File outputImage = newFile(Environment.getExternalStorageDirectory(),
“tempImage.jpg”);
try{
if (outputImage.exists()){
outputImage.delete();
}
outputImage.createNewFile();
}catch (Exception e){
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent =new Intent(“android.media.action.IMAGE_CAPTURE”);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode){
case TAKE_PHOTO:
if (resultCode == RESULT_OK){
Intent intent = new Intent(“com.android.camera.action.CROP”);
intent.setDataAndType(imageUri,”image/*”);
intent.putExtra(“scale”,true);
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,CROP_PHOTO);
}
break;
case CROP_PHOTO:
if (resultCode == RESULT_OK){
try{
Bitmap bitmap = BitmapFactory.decodeStream(
getContentResolver().openInputStream(imageUri));
picture.setImageBitmap(bitmap);
}catch (FileNotFoundException e){
e.printStackTrace();
}
}
break;
default:
break;
}
}
}
上述代码中,我们调用了手机相机拍照,将照片储存在SD卡的根目录中,并在显示照片时对照片进行剪裁,现在在ImageView中。由于涉及到SD卡的读写,我们还要在AndroidManifest.xml文件中申明权限:
…
<uses-permission android:name=”android.permission.WRITE_EXTERNAL_STORAGE” />
…
这样代码就完成,单机takephoto按钮就可以进行拍照了。
从相册中选择照片
首先在main.xml文件中加入一个Button,代码如下:
<RelativeLayout
xmlns:android=”http://schemas.android.com/apk/res/android”
android:id=”@+id/activity_main”
android:layout_width=”match_parent”
android:layout_height=”match_parent”><Button
android:id=”@+id/take_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Take Photo”/><Button
android:id=”@+id/choose_photo”
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:text=”Choose Photo”
android:layout_centerHorizontal=”true”/><ImageView
android:id=”@+id/picture”
android:layout_width=”400dp”
android:layout_height=”400dp”
android:layout_centerInParent=”true”/></RelativeLayout>
然后修改MainActivity中的代码,代码如下:
……
private Button choose_photo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
……
choose_photo = (Button)findViewById(R.id.choose_photo);
choosephoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Thread(){
@Override
public void run() {
File outputImage = new File(Environment.getExternalStorageDirectory(),”output_image.jpg” );
try{
if (outputImage.exists()) {
outputImage.delete();
}
outputImage.createNewFile();
}catch (IOException e){
e.printStackTrace();
}
imageUri = Uri.fromFile(outputImage);
Intent intent = new Intent(“android.intent.action.GET_CONTENT”);
intent.setType(“image/*”);
intent.putExtra(“crop”,true);//图片是否可以剪裁
intent.putExtra(“scale”,true);//图片加载模式
intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intent,TAKE_PHOTO);
}
}.start();
}
});
}
……
}
这样,你就可以对相册中的照片进行选择了。