2个安卓实现实现 拍照 选择图片 剪裁等的代码,都是从正式项目中提取出来了,非常实用,有需要的小伙伴可以参考下。

前言,版本兼容问题主要是由于4.4以前和4.4以后的Uri的格式不同所造成的错误

1.拍照 和选择图片
  ①选择图片

?
1
2
3
intent = new Intent(Intent.ACTION_GET_CONTENT);
      intent.setType("image/*");
      startActivityForResult(intent, GALLERY_REQUEST_CODE);

②拍照

?
1
2
intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      startActivityForResult(intent, CAMERA_REQUEST_CODE);

2.获取系统传来的值

标记符

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private static int CAMERA_REQUEST_CODE = 1;
private static int GALLERY_REQUEST_CODE = 2;
private static int CROP_REQUEST_CODE = 3;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == CAMERA_REQUEST_CODE) {
    if (data == null) {
      return;
    } else { //拍照
      Bundle extras = data.getExtras();
      if (extras != null) {
        Bitmap bm = extras.getParcelable("data");
        Uri uri = saveBitmap(bm);
        startImageZoom(uri);
      }
    }
  } else if (requestCode == GALLERY_REQUEST_CODE) {
    if (data == null) {//相册
      return;
    }
    Uri uri;
    uri = data.getData();
    Uri fileUri = convertUri(uri);
    startImageZoom(fileUri);
  } else if (requestCode == CROP_REQUEST_CODE) {
    if (data == null) {
      return;
    }//剪裁后的图片
    Bundle extras = data.getExtras();
    if (extras == null) {
      return;
    }
    Bitmap bm = extras.getParcelable("data");
    ShowImageView(bm);
  }
}

3.图片选取后 根据Url 转成流 并保存

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private Uri convertUri(Uri uri) {
    InputStream is = null;
    try {
      is = getContentResolver().openInputStream(uri);
      Bitmap bitmap = BitmapFactory.decodeStream(is);
      is.close();
      return saveBitmap(bitmap);
    } catch (FileNotFoundException e) {
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      return null;
    }
  }

4.保存图片 记得加权限

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private Uri saveBitmap(Bitmap bm) {
    File tmpDir = new File(Environment.getExternalStorageDirectory()
        + "/xiaoxin");
    if (!tmpDir.exists()) {
      tmpDir.mkdir();
    }
    File img = new File(tmpDir.getAbsolutePath() + "love.png");
    try {
      FileOutputStream fos = new FileOutputStream(img);
      bm.compress(Bitmap.CompressFormat.PNG, 85, fos);
      fos.flush();
      fos.close();
      Toast.makeText(MainActivity.this, "成功了", Toast.LENGTH_SHORT).show();
      return Uri.fromFile(img);
    } catch (FileNotFoundException e) {
      Toast.makeText(MainActivity.this, "失敗了", Toast.LENGTH_SHORT).show();
      e.printStackTrace();
      return null;
    } catch (IOException e) {
      e.printStackTrace();
      Toast.makeText(MainActivity.this, "失敗了", Toast.LENGTH_SHORT).show();
      return null;
    }
  }

5.剪裁图片

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
   * 剪裁图片
   *
   * @param uri
   */
  private void startImageZoom(Uri uri) {
    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", 150);
    intent.putExtra("outputY", 150);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, CROP_REQUEST_CODE);
  }

下面我们再来看一个实例:先是代码的部分,部分是从网路上摘录的,自己整理后当做工具类使用

配置文件:布局很简单,一个ImageButton和一个Button,点击都可以实现图像选择的功能,具体的实现根据大家在实际中用的效果而定
—————————————————————————————————————————————————
AndroidManifest.xml

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.cogent.piccut"
  android:versionCode="1"
  android:versionName="1.0" >
  
  <uses-sdk android:minSdkVersion="10" />
  
  <application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <activity
      android:label="@string/app_name"
      android:name=".PicCutActivity"
      android:screenOrientation="portrait" >
      <intent-filter >
        <action android:name="android.intent.action.MAIN" />
  
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
  
</manifest>

—————————————————————————————————————————————————
Java代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
package com.cogent.piccut;
import java.io.File;
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.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
public class PicCutActivity extends Activity implements OnClickListener {
  private ImageButton img_btn;
  private Button btn;
  private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照
  private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择
  private static final int PHOTO_REQUEST_CUT = 3;// 结果
  // 创建一个以当前时间为名称的文件
  File tempFile = new File(Environment.getExternalStorageDirectory(),getPhotoFileName());
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    init();
  }
  //初始化控件
  private void init() {
    img_btn = (ImageButton) findViewById(R.id.img_btn);
    btn = (Button) findViewById(R.id.btn);
     
    //为ImageButton和Button添加监听事件
    img_btn.setOnClickListener(this);
    btn.setOnClickListener(this);
  }
  //点击事件
  @Override
  public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.img_btn:
      showDialog();
      break;
    case R.id.btn:
      showDialog();
      break;
    }
  }
   
  //提示对话框方法
  private void showDialog() {
    new AlertDialog.Builder(this)
        .setTitle("头像设置")
        .setPositiveButton("拍照", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            dialog.dismiss();
            // 调用系统的拍照功能
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 指定调用相机拍照后照片的储存路径
            intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(tempFile));
            startActivityForResult(intent, PHOTO_REQUEST_TAKEPHOTO);
          }
        })
        .setNegativeButton("相册", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            dialog.dismiss();
            Intent intent = new Intent(Intent.ACTION_PICK, null);
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");
            startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
          }
        }).show();
  }
  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    switch (requestCode) {
    case PHOTO_REQUEST_TAKEPHOTO:
      startPhotoZoom(Uri.fromFile(tempFile), 150);
      break;
    case PHOTO_REQUEST_GALLERY:
      if (data != null)
        startPhotoZoom(data.getData(), 150);
      break;
    case PHOTO_REQUEST_CUT:
      if (data != null)
        setPicToView(data);
      break;
    }
    super.onActivityResult(requestCode, resultCode, data);
  }
  private void startPhotoZoom(Uri uri, int size) {
    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", size);
    intent.putExtra("outputY", size);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, PHOTO_REQUEST_CUT);
  }
  //将进行剪裁后的图片显示到UI界面上
  private void setPicToView(Intent picdata) {
    Bundle bundle = picdata.getExtras();
    if (bundle != null) {
      Bitmap photo = bundle.getParcelable("data");
      Drawable drawable = new BitmapDrawable(photo);
      img_btn.setBackgroundDrawable(drawable);
    }
  }
  // 使用系统当前日期加以调整作为照片的名称
  private String getPhotoFileName() {
    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
    return dateFormat.format(date) + ".jpg";
  }
}

心得总结:Androi系统内部自带了图片的剪裁功能,开发是只要调用即可,Intent的很多用法比较实用,但是太多了,需要用到的时候去查询或者平时多看看官方文档,很多代码看着简单但还是要实际自己去写更好些,理解的更深入一些。

android完美实现 拍照 选择图片 剪裁等代码分享相关推荐

  1. H5页面支持拍照选择图片

    Html5原生的就能够支持拍照选择图片,不需要JS调用. 下面的是单一调用的,只支持一种方式: <!-- 调用照相机,拍照 --> <input type="file&qu ...

  2. Android自定义相机拍照、图片裁剪的实现

    原文:Android自定义相机拍照.图片裁剪的实现 最近项目里面又要加一个拍照搜题的功能,也就是用户对着不会做的题目拍一张照片,将照片的文字使用ocr识别出来,再调用题库搜索接口搜索出来展示给用户,类 ...

  3. JS实现选择图片剪裁及保存

    JS实现选择图片剪裁及保存 以下是一个简单的示例代码,实现了显示一个文件上传框和一个canvas元素.用户可以选择一张图片文件后,该图像将显示在canvas中,并且用户可以通过鼠标拖拽来选取需要剪裁的 ...

  4. Android端h5不能选择图片,weui公众号开发h5部分手机不能选择图片及拍照问题

    在使用weui采用h5进行公众号开发时,input file选择图片控件,在部分安卓手机不能拍照.不能选择图片. 经过创软公众号开发团队分析,将input代码设置如下方式即可选择图片或者拍摄图片,成功 ...

  5. Android上传头像,图片剪裁,压缩图片

    点击头像的时候开始调用camera()方法 private byte[] mContent = new byte[1024];// 保存照片转换后的字节,用与上传到服务器private Bitmap ...

  6. android crop 大图,com.android.camera.action.CROP 实现图片剪裁

    APP 中选取图片之后,有时候需要进行剪裁,比如头像. 以下是启动代码. 在我的项目中,传的是 filePath,所以我转了一下,但实际上从相册选择图片后,用 data.getData() 就可获得 ...

  7. android从本地相册选择图片uri三星手机适配问题

    转载地址:http://blog.csdn.net/CathyChen0910/article/details/62456438 启动系统相册intent Intent intentFromGalle ...

  8. 学习笔记之Android调用系统相册选择图片

    文章目录 前言 使用步骤 小结 参考资料 前言 在相册里选择图片上传也是很常见的功能了例如微信朋友圈等等.但是他们是自定义的选择器,可以选择多张图片并修改.这里我们讲一个最简单的:调用系统的相册选择一 ...

  9. Android --- 从相册中选择图片或者拍着选择图片遇到的问题

    1.从相册选择的图片会存储到 data 里面,而相机拍照的图片不会存储到 data 里面 2.由于从相册选择的图片会存储到 data 里面,而相机拍照的图片不会存储到 data 里面,所以在获取图片资 ...

最新文章

  1. 3D相机的数据处理方式
  2. java linkedlist和arraylist添加元素时性能比较
  3. ptrace和wait的理解 (ptrace监控进程)
  4. 记录解决二次编码问题
  5. c++中用new和不用new创建对象的本质区别
  6. 前端学习(142):行级标签和块级标签
  7. 贪心算法——合并区间(Leetcode 56)
  8. PowerDesigner 常用配置修改
  9. 随机效应估算与固定效应估算_纯电动汽车的电池价格,可以怎么估算?
  10. 内存非延续分派治理方法
  11. 使用Xshell连接Linux虚拟机(NAT)
  12. Python2.x(3.x)安装及Ulipad的安装和使用
  13. 风行状告芒果卫视,电视台“耍霸道”屡禁不止?
  14. 通过PackageManager、PackageInfo、ApplicationInfo、ActivityInfo获得你想要的 App 信息
  15. GM300单片硅钢铁损测试仪操作使用指引
  16. OpenCV+OCR文字识别
  17. 用树莓派搜寻地外文明
  18. python 将列表按指定长度拆分
  19. Load balancer does not have available server for client问题
  20. python编写一个名片_详解Python做一个名片管理系统

热门文章

  1. ROS launch调用摄像头问题(已解决)
  2. Python文字游戏:升级、打怪、属性点、装备等(一)
  3. unity gameframework 《starforce》 DialogForm UI学习
  4. android 酷狗demo_Android仿酷狗皮肤预览界面的实现(利用canvas缩放的原理)
  5. 大学开学第一天——计算机达人成长之路(32)
  6. 你(程序员)知道怎样教别人炸“薯条”吗?
  7. 重教育、包装设计两方面促进可持续包装
  8. Linux网络中的DNS域名正向与反向解析实操
  9. 企业没有管理非常可怕,但管理过度更可怕!
  10. 快手Java社招面试题解析