zoukankan      html  css  js  c++  java
  • android手机拍照或选取相册里面的图片

    three.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
     <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
      
      <Button
        android:id="@+id/buttonLocal"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="本地相册选取头像" />
      
      <Button
        android:id="@+id/buttonCamera"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="手机拍照选取头像" />
    </LinearLayout>

    ThreeActivity.class:

    package com.example.day4_three;
    
    import java.io.File;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    import android.app.Activity;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.net.Uri;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
      
    public class ThreeActivity extends Activity {
      
      /* 头像文件 */
      private static final String IMAGE_FILE_NAME = "temp_head_image.jpg";
      
      /* 请求识别码 */
      private static final int CODE_GALLERY_REQUEST = 0xa0;
      private static final int CODE_CAMERA_REQUEST = 0xa1;
      private static final int CODE_RESULT_REQUEST = 0xa2;
      
      // 裁剪后图片的宽(X)和高(Y),480 X 480的正方形。(生成bitmap貌似有时要报错?可试下把大小弄小点)
      private static int output_X = 480;
      private static int output_Y = 480;
      
      private ImageView headImage = null;
      
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.three);
      
        headImage = (ImageView) findViewById(R.id.imageView);
      
        Button buttonLocal = (Button) findViewById(R.id.buttonLocal);
        buttonLocal.setOnClickListener(new OnClickListener() {
      
          @Override
          public void onClick(View v) {
            choseHeadImageFromGallery();
          }
        });
       
        Button buttonCamera = (Button) findViewById(R.id.buttonCamera);
        buttonCamera.setOnClickListener(new View.OnClickListener() {
      
          @Override
          public void onClick(View v) {
            choseHeadImageFromCameraCapture();
          }
        });
      }
      
      // 从本地相册选取图片作为头像
      private void choseHeadImageFromGallery() {
        Intent intentFromGallery = new Intent();
        // 设置文件类型
        intentFromGallery.setType("image/*");
        intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(intentFromGallery, CODE_GALLERY_REQUEST);
      }
      
      // 启动手机相机拍摄照片作为头像
      private void choseHeadImageFromCameraCapture() {
        Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      
        // 判断存储卡是否可用,存储照片文件
        if (hasSdcard()) {
          intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri
              .fromFile(new File(Environment
                  .getExternalStorageDirectory(), IMAGE_FILE_NAME)));
        }
      
        startActivityForResult(intentFromCapture, CODE_CAMERA_REQUEST);
      }
      
      @Override
      protected void onActivityResult(int requestCode, int resultCode,
          Intent intent) {
      
        // 用户没有进行有效的设置操作,返回
        if (resultCode == RESULT_CANCELED) {
          Toast.makeText(getApplication(), "取消", Toast.LENGTH_LONG).show();
          return;
        }
      
        switch (requestCode) {
        case CODE_GALLERY_REQUEST:
          cropRawPhoto(intent.getData());
          break;
      
        case CODE_CAMERA_REQUEST:
          if (hasSdcard()) {
            File tempFile = new File(
                Environment.getExternalStorageDirectory(),
                IMAGE_FILE_NAME);
            cropRawPhoto(Uri.fromFile(tempFile));
          } else {
            Toast.makeText(getApplication(), "没有SDCard!", Toast.LENGTH_LONG)
                .show();
          }
      
          break;
      
        case CODE_RESULT_REQUEST:
          if (intent != null) {
            setImageToHeadView(intent);
          }
      
          break;
        }
      
        super.onActivityResult(requestCode, resultCode, intent);
      }
      
      /**
       * 裁剪原始的图片
       */
      public void cropRawPhoto(Uri uri) {
      
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(uri, "image/*");
      
        // 设置裁剪
        intent.putExtra("crop", "true");
      
        // aspectX , aspectY :宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
      
        // outputX , outputY : 裁剪图片宽高
        intent.putExtra("outputX", output_X);
        intent.putExtra("outputY", output_Y);
        intent.putExtra("return-data", true);
      
        startActivityForResult(intent, CODE_RESULT_REQUEST);
      }
      
      /**
       * 提取保存裁剪之后的图片数据,并设置头像部分的View
       */
      private void setImageToHeadView(Intent intent) {
        Bundle extras = intent.getExtras();
        if (extras != null) {
          Bitmap photo = extras.getParcelable("data");
          headImage.setImageBitmap(photo);
        }
      }
      
      /**
       * 检查设备是否存在SDCard的工具方法
       */
      public static boolean hasSdcard() {
        String state = Environment.getExternalStorageState();
        if (state.equals(Environment.MEDIA_MOUNTED)) {
          // 有存储的SDCard
          return true;
        } else {
          return false;
        }
      }
    }
  • 相关阅读:
    不叹惜、不呼唤我也不哭泣
    WCF笔记(一)Service Layer and Channel Layer
    C#数据结构(四)树和二叉树
    Python and django(四)详解python中的数字和序列
    Python and django(三)python中的对象
    IIS与ASP.NET Http Runtime Pipeline
    迈进程序员的大门
    实例学习SSIS(四)使用日志记录和错误流重定向
    DbUtility alpha1版本发布
    关于ref和out的详细区别。
  • 原文地址:https://www.cnblogs.com/123p/p/5379909.html
Copyright © 2011-2022 走看看