安卓开发之调用系统照相机拍照并剪辑

调用系统照相机拍照并剪辑

在Android开发过程中,很多时候我们都需要调用照相机拍照,尤其在发布微博的时候。

自己继承Camera类写一个拍照功能显然不是最好的方案,因为我们不能考虑的非常全面。

这个时候,调用系统的照相机无疑是一个很好的解决方法。

下面,我们就写一个调用系统照相机拍照并对照片进行剪辑。

 

 代码如下 复制代码

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/","temp.jpg")));

 startActivityForResult(intent, 1);

 

上面的代码就是调用系统照相机拍照,并保存到sdcard目录下temp.jpg

但这个时候还不够,因为通常情况,照相机拍的照片尺寸都很大,显然不能用于上传,我们需要对照片进行剪辑。

 

 代码如下 复制代码

 public void startPhotoZoom(Uri uri) {

 Intent intent = new Intent("com.android.camera.action.CROP");

 intent.setDataAndType(uri, IMAGE_UNSPECIFIED);

 intent.putExtra("crop", "true");

 // aspectX aspectY 是宽高的比例

 intent.putExtra("aspectX", 1);

 intent.putExtra("aspectY", 1);

 // outputX, outputY 是裁剪图片宽高

 intent.putExtra("outputX", 250);

 intent.putExtra("outputY", 250);

 intent.putExtra("return-data", true);

 startActivityForResult(intent, PHOTORESOULT);

 }

 

上面的代码实现了图片的剪辑,我们只需要传入相应的Uri即可,接下来我们传入Uri。

 

 代码如下 复制代码

 File picture = new File(Environment.getExternalStorageDirectory()+"/" + "temp.jpg");

 startPhotoZoom(Uri.fromFile(picture));

 

当然,剪辑完了,我们肯定要拿到剪辑后的照片。

 

 代码如下 复制代码

 if (requestCode == PHOTORESOULT) {

 Bundle extras = data.getExtras();

 if (extras != null) {

 Bitmap photo = extras.getParcelable("data");

 ByteArrayOutputStream stream = new ByteArrayOutputStream();

 if(photo!=null){

 photo.compress(Bitmap.CompressFormat.JPEG, 75, stream);// (0 – 100)压缩文件

 pic.setImageBitmap(photo);

 }

 }

 }

 

android调用系统照相机拍照并剪辑

这样,我们就通过调用系统照相机,实现拍照并剪辑图片的功能。

1.调用系统的照相机程序
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
 startActivityForResult(intent, TAKE_PHOTO_WITH_DATA);

2.在onActivityResult中处理返回的data
final Bitmap photo = data.getParcelableExtra("data");
如果不需要做剪切处理就可以直接使用图片了,比如输出到ImageView上
imageView.setImageBitmap(photo);
如果需要做剪切处理,就继续向下执行

3.做剪切处理

 代码如下 复制代码
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");
        intent.putExtra("data", data);
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 128);
        intent.putExtra("outputY", 128);
        intent.putExtra("return-data", true);
startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);

4.在onActivityResult中处理
与第二步相同。

完整代码:

 代码如下 复制代码

public class SdCardUriTestActivity extends Activity {
    /** Called when the activity is first created. */
    private Button btnTake = null;
    private ImageView lblImage = null;
  
    private static final int PHOTO_PICKED_WITH_DATA = 3021;
    private static final int CAMERA_WITH_DATA = 3023;
  
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
      
        btnTake = (Button)findViewById(R.id.btnTake);
        lblImage = (ImageView)findViewById(R.id.lblImage);
        btnTake.setOnClickListener(new View.OnClickListener() {
          
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                startActivityForResult(intent, CAMERA_WITH_DATA);
            }
        });
      
    }
  
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        if(resultCode!=RESULT_OK)
            return;
        switch(requestCode){
        case CAMERA_WITH_DATA:
            final Bitmap photo = data.getParcelableExtra("data");
            if(photo!=null){
                doCropPhoto(photo);
            }
        case PHOTO_PICKED_WITH_DATA:
            Bitmap photo1 = data.getParcelableExtra("data");
            if(photo1!=null){
                lblImage.setImageBitmap(photo1);
            }
          
        }
    }
  
    protected void doCropPhoto(Bitmap data){
        Intent intent = getCropImageIntent(data);
        startActivityForResult(intent, PHOTO_PICKED_WITH_DATA);
    }
  
    public static Intent getCropImageIntent(Bitmap data) {
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setType("image/*");
        intent.putExtra("data", data);
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", 128);
        intent.putExtra("outputY", 128);
        intent.putExtra("return-data", true);
        return intent;
    }
}

布局文件略

时间: 2024-10-24 19:28:54

安卓开发之调用系统照相机拍照并剪辑的相关文章

Android 调用系统照相机拍照和录像_Android

本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

Android 实现调用系统照相机拍照和录像的功能_Android

本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

Android 调用系统照相机拍照和录像

本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

Android 实现调用系统照相机拍照和录像的功能

本文实现android系统照相机的调用来拍照 项目的布局相当简单,只有一个Button: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_heig

android-安卓开发关于调用系统自带的分享功能

问题描述 安卓开发关于调用系统自带的分享功能 刚刚做了个调用系统分享功能的事件,点击按钮,进入图库,选择图片时调用系统的分享功能,出现个问题,直接进入qq界面分享到QQ,微信,微博其他的都没出来,求解,下面是代码 //调用图库 public void Getpic(){ Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); intent.putExtra("crop&

Android调用系统相机拍照保存以及调用系统相册的方法

系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保 存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(camera, 100); 相机返回的数据通过下面的回调方法取得,并处理 @Override protected void onActivityResult(int re

android-Fragment中调用系统相机拍照获取照片后跳转问题,求大神···急急急··

问题描述 Fragment中调用系统相机拍照获取照片后跳转问题,求大神···急急急·· 在Fragment中调用系统相机拍照获取照片后,先跳到前一个activity或者桌面,然后再回到调用相机的Activity,这是啥原因呢?急急急·······在线等,求大神帮忙··· 解决方案 http://download.csdn.net/detail/zhai56565/5094196 解决方案二: 转来的··调用系统相机拍照和调用相册

代码-android关于调用系统相机拍照后APP闪退的问题

问题描述 android关于调用系统相机拍照后APP闪退的问题 最近在写一个小APP,就是调用系统相机拍照,然后保存在本地相册,代码没有显示bug,但是在调试时出现了拍照后闪退的问题,我的测试机是小米2S,MIUI 7系统,android5.0.X的,拍照的照片能保存在本地,但是在拍照后点击确定后软件就闪退了,这是我的代码 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState)

android调用系统相机拍照返回图片模糊

问题描述 android调用系统相机拍照返回图片模糊 上传代码 调用系统相机 Intent it = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(it, 1); 然后获取图片 Bundle extras = data.getExtras(); b = (Bitmap) extras.get("data"); String name = new SimpleDateFormat("yyy