使用AlertDialog彈窗實現相機拍照或者從圖庫選取圖片顯示

通過圖庫選圖片主要就是onActivityResult方法中返回的intent中獲取Uri,再根據Uri和指定列名使用contentProvider去查找出此圖片的路徑

使用相機拍照顯示之前一篇文章已經有描述,此篇文章不對圖片的大小進行處理。


2016/12/28

今天偶爾看到拍攝後再調用系統截圖的,自己也搬過來吧。



代碼:

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
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.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;


public class MainActivity extends Activity implements OnClickListener {
	private static final int FROM_CAMERA=1;
	private static final int FROM_PIC=2;
	private ImageView img;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		findViewById(R.id.btn).setOnClickListener(this);
		img=(ImageView) findViewById(R.id.img);
	}

	@Override
	public void onClick(View v) {
		initView();
		
	}

	private void initView(){
		AlertDialog.Builder builder=new AlertDialog.Builder(this)
		.setIcon(R.drawable.ic_launcher)
		.setTitle("選擇圖片:")
				//設置兩個item
				.setItems(new String[]{"相機","圖庫"}, new android.content.DialogInterface.OnClickListener(){

					@Override
					public void onClick(DialogInterface dialog, int which) {
						switch (which) {
						case 0:
							pickPicFromCam();
							break;
						case 1:
							pickPicFromPic();
							break;
						default:
							break;
						}
						
					}});
		builder.create().show();
		
		
	}
	
	private void pickPicFromCam(){
		try {
			Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
			intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(createImageFile()));
			startActivityForResult(intent, FROM_CAMERA);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
		
	}
	private void pickPicFromPic(){
		Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
		startActivityForResult(intent, FROM_PIC);
	}
	
	
	
	String mCurrentPhotoPath;  
    //創建路徑  
    private File createImageFile() throws IOException {  
        // Create an image file name  
        // String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new  
        // Date());  
        // String imageFileName = "JPEG_" + timeStamp + "_";  
        // File storageDir =  
        // getExternalFilesDir(Environment.DIRECTORY_PICTURES);//由getExternalFilesDir(),以及getFilesDir()創建的目錄,應用卸載後會被刪除!  
        //  
        // File image = File.createTempFile(  
        // imageFileName, /* prefix */  
        // ".jpg", /* suffix */  
        // storageDir /* directory */  
        // );  
        //  
        // // Save a file: path for use with ACTION_VIEW intents  
        // mCurrentPhotoPath = "file:" + image.getAbsolutePath();  
        // return image;  
        //檢測內存卡是否存在  
        if (!Environment.getExternalStorageState().equals(  
                Environment.MEDIA_MOUNTED)) {  
            Log.d("my", "no SDCARD!!!!");  
  
        } else {  
            String pre = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss_SSS")  
                    .format(new Date());  
            //創建圖片保存的位置  
            File path = new File(Environment.getExternalStorageDirectory(),  
                    "myImage");  
            //如果路徑不存在  
            if (!path.exists()) {  
                //創建路徑,需要權限  
                path.mkdirs();  
            }  
            //組合全部的路徑  
            mCurrentPhotoPath = path.toString() + File.separator + pre + ".jpg";  
  
            Log.d("my", mCurrentPhotoPath);  
            File file = new File(mCurrentPhotoPath);  
  
            return file;  
  
        }  
  
        return null;  
    }  
	
	
	
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    	// TODO Auto-generated method stub
    	super.onActivityResult(requestCode, resultCode, data);
    	
    	if(requestCode==FROM_CAMERA && resultCode==RESULT_OK){
    		//爲了方便起見,沒有對圖片進行壓縮
    		img.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));
    	}
    	//從圖庫選擇返回的結果
    	if(requestCode==FROM_PIC && resultCode==RESULT_OK && data!=null){
    		Uri uri=data.getData();
    		Log.d("my", uri.toString());
    													//要返回的列名
    		Cursor cursor=getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
    		if(cursor.moveToFirst()){
    			String ImgPath=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
    			Log.d("my", ImgPath);
    			img.setImageBitmap(BitmapFactory.decodeFile(ImgPath));
    			
    			
    		}
    		
    	}
    	
    }
	
	
}
//添加後,添加了幾個方法。

package secretbase.testcroppic;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
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.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;


public class MainActivity extends Activity implements OnClickListener {
    private static final int FROM_CAMERA=1;
    private static final int FROM_PIC=2;
    private ImageView img;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        findViewById(R.id.btn).setOnClickListener(this);
        img=(ImageView) findViewById(R.id.img);
    }

    @Override
    public void onClick(View v) {
        initView();

    }

    private void initView(){
        AlertDialog.Builder builder=new AlertDialog.Builder(this)
                .setIcon(R.mipmap.ic_launcher)
                .setTitle("選擇圖片:")
                //設置兩個item
                .setItems(new String[]{"相機","圖庫"}, new android.content.DialogInterface.OnClickListener(){

                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which) {
                            case 0:
                                pickPicFromCam();
                                break;
                            case 1:
                                pickPicFromPic();
                                break;
                            default:
                                break;
                        }

                    }});
        builder.create().show();


    }

    private void pickPicFromCam(){
        try {
            Intent intent=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(createImageFile()));
            startActivityForResult(intent, FROM_CAMERA);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }




    }
    private void pickPicFromPic(){
        Intent intent=new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        startActivityForResult(intent, FROM_PIC);
    }



    String mCurrentPhotoPath;
    //創建路徑
    private File createImageFile() throws IOException {
        // Create an image file name
        // String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new
        // Date());
        // String imageFileName = "JPEG_" + timeStamp + "_";
        // File storageDir =
        // getExternalFilesDir(Environment.DIRECTORY_PICTURES);//由getExternalFilesDir(),以及getFilesDir()創建的目錄,應用卸載後會被刪除!
        //
        // File image = File.createTempFile(
        // imageFileName, /* prefix */
        // ".jpg", /* suffix */
        // storageDir /* directory */
        // );
        //
        // // Save a file: path for use with ACTION_VIEW intents
        // mCurrentPhotoPath = "file:" + image.getAbsolutePath();
        // return image;
        //檢測內存卡是否存在
        if (!Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            Log.d("my", "no SDCARD!!!!");

        } else {
            String pre = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss_SSS")
                    .format(new Date());
            //創建圖片保存的位置
            File path = new File(Environment.getExternalStorageDirectory(),
                    "myImage");
            //如果路徑不存在
            if (!path.exists()) {
                //創建路徑,需要權限
                path.mkdirs();
            }
            //組合全部的路徑
            mCurrentPhotoPath = path.toString() + File.separator + pre + ".jpg";

            Log.d("my", mCurrentPhotoPath);
            File file = new File(mCurrentPhotoPath);

            return file;

        }

        return null;
    }

    //裁剪圖片
    private void cropImageUri(Uri uri, int outputX, int outputY, int requestCode){
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        intent.putExtra("outputX", outputX);
        intent.putExtra("outputY", outputY);
        intent.putExtra("scale", true);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
        //使用Uri返回數據,不用bitmap
        intent.putExtra("return-data", false);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true); // no face detection
        startActivityForResult(intent, requestCode);
    }



    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);

        if(requestCode==FROM_CAMERA && resultCode==RESULT_OK){
            //爲了方便起見,沒有對圖片進行壓縮
            //img.setImageBitmap(BitmapFactory.decodeFile(mCurrentPhotoPath));

            //對圖片進行裁剪
            cropImageUri(Uri.fromFile(new File(mCurrentPhotoPath)),100,100,11);
        }
        //從圖庫選擇返回的結果
        if(requestCode==FROM_PIC && resultCode==RESULT_OK && data!=null){
            Uri uri=data.getData();
            Log.d("my", uri.toString());
            //要返回的列名
            Cursor cursor=getContentResolver().query(uri, new String[]{MediaStore.Images.Media.DATA}, null, null, null);
            if(cursor.moveToFirst()){
                String ImgPath=cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                Log.d("my", ImgPath);
                img.setImageBitmap(BitmapFactory.decodeFile(ImgPath));
            }
        }
            //裁剪後返回的圖片
            if(requestCode==11 && resultCode==RESULT_OK){
                img.setImageBitmap(decodeUriAsBitmap(Uri.fromFile(new File(mCurrentPhotoPath))));
            }


    }


    //可以使用Uri創建BItmap,比用cursor方便
    private Bitmap decodeUriAsBitmap(Uri uri){
        Bitmap bitmap = null;
        try {
            bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return null;
        }
        return bitmap;
    }


}
//比較好的版本
http://blog.csdn.net/yueqinglkong/article/details/24729727


public class MainActivity extends Activity {

        private ImageView img = 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
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            init();
        }

        private void init() {
            // TODO Auto-generated method stub
            img = (ImageView) findViewById(R.id.img);


            ((Button) findViewById(R.id.btn))
                    .setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {
                            // TODO Auto-generated method stub
                            Intent cameraintent = new Intent(
                                    MediaStore.ACTION_IMAGE_CAPTURE);
                            // 指定調用相機拍照後照片的儲存路徑
                            cameraintent.putExtra(MediaStore.EXTRA_OUTPUT,
                                    Uri.fromFile(tempFile));
                            startActivityForResult(cameraintent,
                                    PHOTO_REQUEST_TAKEPHOTO);
                        }
                    });

        }

        /**
         * 回調
         */
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, 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)
                        sentPicToNext(data);
                    break;
            }
        }

        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", 300);
            intent.putExtra("outputY", 300);
            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) {
                    img.setImageResource(R.mipmap.ic_launcher);
                } else {
                    photo = toRoundCorner((Bitmap) bundle.getParcelable("data"), 50);
                    Drawable drawable = new BitmapDrawable(this.getResources(),
                            photo);
                    img.setImageDrawable(drawable);
                    // 設置文本內容爲 圖片絕對路徑和名字
                  ;
                }
            }
        }

        /**
         * 圓角圖片處理
         *
         * @param bitmap
         * @param radius半徑50
         * @return
         */
        public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                    bitmap.getHeight(), Bitmap.Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            final RectF rectF = new RectF(rect);
            final float roundPx = pixels;
            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(color);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);
            return output;
        }

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


}









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章