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

来源:互联网 发布:行知学园地址 编辑:程序博客网 时间:2024/05/21 20:33
public class MainActivity extends Activity {private static final int TAKE_PHOTO = 1;private static final int CROP_PHOTO = 2;private static final int CHOOSE_PHOTO = 3;private Button btn,btn1;private ImageView iv;private Uri imageUri;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);iv = (ImageView) findViewById(R.id.iv);btn = (Button) findViewById(R.id.btn);btn1 = (Button) findViewById(R.id.btn1);//直接拍照btn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 创建File对象,用于存储拍照后的图片 //Environment.getExternalStorageDirectory()方法获取到的就是手机SD卡的根目录,后面跟的是图片的名字File outputImage = new File(Environment.getExternalStorageDirectory(), "output_image.jpg");try {if (outputImage.exists()) {outputImage.delete();}outputImage.createNewFile();} catch (IOException e) {e.printStackTrace();}//将File对象转换成Uri对象,标识它的唯一地址imageUri = Uri.fromFile(outputImage);//指定它的actionIntent intent = new Intent("android.media.action.IMAGE_CAPTURE");//指定图片的输出地址,Uriintent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//启动相机程序startActivityForResult(intent, TAKE_PHOTO);}});btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {//指定它的actionIntent intent=new Intent("android.intent.action.GET_CONTENT");//设置它的类型intent.setType("image/*");//打开相册startActivityForResult(intent, CHOOSE_PHOTO);}});}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {case TAKE_PHOTO:if (resultCode == RESULT_OK) {//指定它的actionIntent intent = new Intent("com.android.camera.action.CROP");//设置数据和类型intent.setDataAndType(imageUri, "image/*");//是否保留比率intent.putExtra("scale", true);//指定图片的输出地址,Uriintent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//启动裁剪程序startActivityForResult(intent, CROP_PHOTO);}break;case CROP_PHOTO:if (resultCode == RESULT_OK) {try {//将图片解析成Bitmap对象Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));//将裁减后的照片显示出来iv.setImageBitmap(bitmap);} catch (FileNotFoundException e) {e.printStackTrace();}}break;//从手机里面找case CHOOSE_PHOTO:if (resultCode == RESULT_OK) {//判断手机系统版本号if (Build.VERSION.SDK_INT>=19) {//4.4及以上系统使用这个方法处理图片handleImageOnKitKat(data);}else{//4.4及以下系统使用这个方法处理图片handleImageBeforeKitKat(data);}}break;default:break;}}@SuppressLint("NewApi")private void handleImageOnKitKat(Intent data) {String imagePath=null;Uri uri=data.getData();if (DocumentsContract.isDocumentUri(this, uri)) {//如果是document类型的Uri,则通过document id处理String docId=DocumentsContract.getDocumentId(uri);if ("com.android.providers.media.documents".equals(uri.getAuthority())) {//解析出数字格式的idString id=docId.split(":")[1];String selection =MediaStore.Images.Media._ID+"="+id;imagePath=getImagePath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,selection);}else if("com.android.providers.downloads.documents".equals(uri.getAuthority())){Uri contentUri=ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"),Long.valueOf(docId));imagePath=getImagePath(contentUri, null);}}else if ("content".equalsIgnoreCase(uri.getScheme())) {//如果不是document类型的Uri,则使用普通方式处理imagePath=getImagePath(uri, null);}displayImage(imagePath);}private void handleImageBeforeKitKat(Intent data){Uri uri=data.getData();String imagePath=getImagePath(uri, null);displayImage(imagePath);}private String getImagePath(Uri uri,String selection) {String path=null;//通过Uri和selection来获取真实地图片路径Cursor cursor=getContentResolver().query(uri, null, selection,null,null);if(cursor!=null){if (cursor.moveToFirst()) {path=cursor.getString(cursor.getColumnIndex(Media.DATA));}cursor.close();}return path;}private void displayImage(String imagePath){if (imagePath!=null) {Bitmap bitmap=BitmapFactory.decodeFile(imagePath);iv.setImageBitmap(bitmap);}else{Toast.makeText(this,"失败了",Toast.LENGTH_SHORT).show();}}}

权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


0 0