Android手机拍照或选取图库图片作为头像

package zhangpgil.photo;

import java.io.File;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
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 MainActivity extends ActionBarActivity {

  /* 头像文件 */
  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.activity_main);

    headImage = (ImageView) findViewById(R.id.imageView);

    Button buttonLocal = (Button) findViewById(R.id.buttonLocal);
    buttonLocal.setOnClickListener(new View.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;
    }
  }
}
<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>

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • android系统在静音模式下关闭camera拍照声音的方法

    话说为了防止偷拍,业内有不成文规定,手机公司在做camera时,点击拍照和录像键的时候,必须要有提示音.因此,google也就非常人性化的将播放拍照声音的函数,放到了cameraService中,防止开发者能开发出不响的camera,从而只要调用拍照函数,一定会响,这是写死在framework中的. 话说这个规定在当今有点不合时宜,这不,今天我收到测试提的一个BUG,说是公司的新需求,要求在静音模式下拍照声音也得取消.这么无耻的需求,也许就在我们中国最大的山寨手机公司才会提到.废话不多说,看看是

  • Android中使用Camera类编写手机拍照App的实例教程

    Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下.它主要用于摄像头捕获图片.启动/停止预览图片.拍照.获取视频帧等,它是设备本地的服务,负责管理设备上的摄像头硬件. Camera既然用于管理设备上的摄像头硬件,那么它也为开发人员提供了相应的方法,并且这些方法大部分都是native的,用C++在底层实现,下面简单介绍一下Camera的一些方法: static Camera open():打开Camera,返回一个Camera实

  • Android启动相机拍照并返回图片

    具体实现过程请看下面代码: 简单的调用了一下系统的拍照功能 代码如下所示: //拍照的方法 private void openTakePhoto(){ /** * 在启动拍照之前最好先判断一下sdcard是否可用 */ String state = Environment.getExternalStorageState(); //拿到sdcard是否可用的状态码 if (state.equals(Environment.MEDIA_MOUNTED)){ //如果可用 Intent intent

  • Android拍照得到全尺寸图片并进行压缩

    废话不多说了,直接给大家贴代码了,具体代码如下所示: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <

  • Android实现拍照、选择图片并裁剪图片功能

    一. 实现拍照.选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果. 二. uCrop项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做了修改Android-Crop,把定制界面独立出来,让用户去自由设置.下图为使用Android-Crop实现的模仿微信选择图片并裁剪Demo. 三. 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径: 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图

  • Android调用手机拍照功能的方法

    本文实例讲述了Android调用手机拍照功能的方法.分享给大家供大家参考.具体如下: 一.main.xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" andr

  • android 拍照和上传的实现代码

    复制代码 代码如下: import java.io.ByteArrayOutputStream;   import java.io.File;   import android.app.Activity;   import android.content.Intent;   import android.graphics.Bitmap;   import android.net.Uri;   import android.os.Bundle;   import android.os.Enviro

  • Android实现调用系统相册和拍照的Demo示例

    本文讲述了Android实现调用系统相册和拍照的Demo示例.分享给大家供大家参考,具体如下: 最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题,用高于4.4版本的系统就崩溃.所以,我还是想提取出来,给大家整理一下,一个比较完整无bug的demo,让大家收藏,留着以后用. 其实对于调用手机图库,高版本的系统会崩溃,是因为获取方法变了,所以我们应该

  • Android开发实现拍照功能的方法实例解析

    本文实例讲述了Android开发实现拍照功能的方法.分享给大家供大家参考,具体如下: 解析: 1)判断是否有摄像头checkCameraHardware(this) 2)获得相机camera = Camera.open(0); 3)把相机添加到mPreView = new SurfacePreView(this, mCamera); 4)实现拍照 mCamera.autoFocus 5)在拍照后使用mCamera.takePicture(null, null, mPicture);方法把图片保存

  • Android设置拍照或者上传本地图片的示例

    前几天,我们客户端这边收到了市场部的一个需求,需要在我们订单成交后,我们的客户端有一个上传交易凭证的功能,那么如何在Android实现上传图片的这个功能呢?在我进行编码之前,我先问自己几个问题. 第一, 图片是直接选择图库里的,还是需要拍照和选择图片两个选项? 因为在选择图片的时候,会有一个拍照的按钮,也可以实现拍照的功能. 第二, 需不需要本地缓存? 本地缓存值得是,在我们的图片上传后,是否在下次直接显示,而不是从服务器读取. 第三,图片是否需要压缩? 众所周知,图片这种资源,因为体积较大,在

  • Android 7.0中拍照和图片裁剪适配的问题详解

    前言 Android 7.0系统发布后,拿到能升级的nexus 6P,就开始了7.0的适配.发现在Android 7.0以上,在相机拍照和图片裁剪上,可能会碰到以下一些错误: Process: com.yuyh.imgsel, PID: 22995 // 错误1 android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.yuyh.imgsel/cache/1486438962645.jpg ex

随机推荐