通過圖庫選圖片主要就是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"; } }