Android之调用摄像头拍照和从相册中选择照片

来源:互联网 发布:傻黑的淘宝店 编辑:程序博客网 时间:2024/05/22 15:08
很多应用程序都可能会用到调用摄像头拍照的功能,比如说程序里需要上传一张图片作为用户的头像,这时就会调用手机的摄像头,下面我们可以用一个例子来学习下。

新建一个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();
    }
 });

……
}

这样,你就可以对相册中的照片进行选择了。

0 0