android照相及图片裁剪预览(图文)

其中的类:


package com.example.photo1;


import java.io.ByteArrayOutputStream;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;


import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;


public class MainActivity extends Activity implements OnClickListener{


	private Button capture=null,show=null;
	private ImageView picture=null,img=null;
	private TextView text=null;
	 private File tempFile = new File(Environment.getExternalStorageDirectory(),
	            getPhotoFileName());
	    
	    private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照
	    private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择
	    private static final int PHOTO_REQUEST_CUT = 3;// 结果




	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		show = (Button) findViewById(R.id.show);
		capture = (Button) findViewById(R.id.capture);
		picture = (ImageView) findViewById(R.id.picture);
		img = (ImageView) findViewById(R.id.img);
		text = (TextView) findViewById(R.id.text);
		capture.setOnClickListener(this);
		show.setOnClickListener(this);
	 
	        Log.i("TAG-->", ""+Environment.getExternalStorageDirectory());
	    }


	    
	    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
	        switch (requestCode) {
	        case PHOTO_REQUEST_TAKEPHOTO:// 当选择拍照时调用
	            startPhotoZoom(Uri.fromFile(tempFile));
	            break;
	        case PHOTO_REQUEST_GALLERY:// 当选择从本地获取图片时
	            // 做非空判断,当我们觉得不满意想重新剪裁的时候便不会报异常,下同
	            if (data != null)
	                startPhotoZoom(data.getData());
	            break;
	        case PHOTO_REQUEST_CUT:// 返回的结果
	            if (data != null)
	                // setPicToView(data);
	                sentPicToNext(data);
	            break;
	        }
	        super.onActivityResult(requestCode, resultCode, data);
	    }
	   
	    @Override
	    public boolean onCreateOptionsMenu(Menu menu) {
//	        getMenuInflater().inflate(R.menu.activity_crama, menu);
	        return true;
	    }
	    
	    
	    
	    private void startPhotoZoom(Uri uri) {
	        Intent intent = new Intent("com.android.camera.action.CROP");
	        intent.setDataAndType(uri, "image/*");
	        // crop为true是设置在开启的intent中设置显示的view可以剪裁
	        intent.putExtra("crop", "true");


	        // aspectX aspectY 是宽高的比例
	        intent.putExtra("aspectX", 1);
	        intent.putExtra("aspectY", 1);


	        // outputX,outputY 是剪裁图片的宽高
	        intent.putExtra("outputX", 200);
	        intent.putExtra("outputY", 200);
	        intent.putExtra("return-data", true);
	        intent.putExtra("noFaceDetection", true);
	        startActivityForResult(intent, PHOTO_REQUEST_CUT);
	    }


	    // 将进行剪裁后的图片传递到下一个界面上
	    private void sentPicToNext(Intent picdata) {
	        Bundle bundle = picdata.getExtras();
	        if (bundle != null) {
	            Bitmap photo = bundle.getParcelable("data");
	            if (photo==null) {
	                picture.setImageResource(R.drawable.ic_launcher);
	            }else {
	            	picture.setImageBitmap(photo);
//	                设置文本内容为    图片绝对路径和名字
	                text.setText(tempFile.getAbsolutePath());
	            }
	            
	            ByteArrayOutputStream baos = null;
	            try {
	                baos = new ByteArrayOutputStream();
	                photo.compress(Bitmap.CompressFormat.JPEG, 100, baos);
	                byte[] photodata = baos.toByteArray();
	                System.out.println(photodata.toString());
	                // Intent intent = new Intent();
	                // intent.setClass(RegisterActivity.this, ShowActivity.class);
	                // intent.putExtra("photo", photodata);
	                // startActivity(intent);
	                // finish();
	            } catch (Exception e) {
	                e.getStackTrace();
	            } finally {
	                if (baos != null) {
	                    try {
	                        baos.close();
	                    } catch (Exception e) {
	                        e.printStackTrace();
	                    }
	                }
	            }
	        }
	    }


	    // 使用系统当前日期加以调整作为照片的名称
	    private String getPhotoFileName() {
	        Date date = new Date(System.currentTimeMillis());
	        SimpleDateFormat dateFormat = new SimpleDateFormat(
	                "'IMG'_yyyyMMdd_HHmmss");
	        return dateFormat.format(date) + ".jpg";
	    }


		@Override
		public void onClick(View v) {
			// TODO Auto-generated method stub
			if(v==capture){
				Intent cameraintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	            // 指定调用相机拍照后照片的储存路径
	            cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,
	                    Uri.fromFile(tempFile));
	            startActivityForResult(cameraintent, PHOTO_REQUEST_TAKEPHOTO);
			}
			if(v==show){
				show();
			}
		}
		
		private void show() {
			// TODO Auto-generated method stub
			
			if(tempFile.getAbsolutePath()==null){
				img.setImageResource(R.drawable.ic_launcher);
			}else{
				Bitmap bmp=BitmapFactory.decodeFile(tempFile.getAbsolutePath());
				img.setImageBitmap(bmp);
			}
		}
	}


其中的xml文件:

<RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >


   <LinearLayout 
       android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical"
       >
	<ImageView 
    	android:id="@+id/picture"
    	android:layout_width="200dp"
        android:layout_height="200dp"
        android:background="#0f0"
        android:layout_gravity="center_horizontal"
    	/>
	<LinearLayout 
	     android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:gravity="center"
	    >
	 <Button
        android:id="@+id/capture"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="capture" 
        
        android:layout_marginTop="10dp"
        />
	 <Button
        android:id="@+id/show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="show" 
        android:layout_marginLeft="20dp"
        android:layout_marginTop="10dp"
        />
	 </LinearLayout>
	 <TextView 
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:textSize="16sp"
        android:background="#22000000"
        />
	 <ImageView 
	     android:id="@+id/img"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:background="#00f"
        android:layout_marginTop="10dp"
        android:layout_gravity="center_horizontal"
	     />
	 </LinearLayout>
</RelativeLayout>



效果图:

截图是采用android4.2的模拟器中的摄像头所截的图片,已经真机测试过了,真机测试也没有问题;

上面的图片是裁剪后的预览效果,下面图是问裁剪的图片。



文章是我根据http://blog.csdn.net/qq435757399/article/details/8124269文章更改的;

你可能感兴趣的:(android照相及图片裁剪预览(图文))