Android 实例讲解添加本地图片和调用系统拍照图片

在项目的开发过程我们离不开图片,而有时候需要调用本地的图片,有时候需要调用拍照图片。同时实现拍照的方法有两种,一种是调用系统拍照功能,另一种是自定义拍照功能。而本博文目前只讲解第一种方法,第二种方法后期在加以讲解。

添加本地图片和调用系统拍照图片主要是通过调用acitivity跳转startActivityForResult(Intent intent, int requestCode)方法和activity返回结果onActivityResult(int requestCode, int resultCode, Intent data)方法来实现的。具体实现代码如下:

一.添加本地图片

1.

[html] view plaincopyprint?

  1. Intent intent = new Intent();
  2. /* 开启Pictures画面Type设定为image */
  3. intent.setType(IMAGE_TYPE);
  4. /* 使用Intent.ACTION_GET_CONTENT这个Action */
  5. intent.setAction(Intent.ACTION_GET_CONTENT);
  6. /* 取得相片后返回本画面 */
  7. startActivityForResult(intent, LOCAL_IMAGE_CODE);</span>

2.

[html] view plaincopyprint?

  1. Uri uri = data.getData();
  2. url = uri.toString().substring(uri.toString().indexOf("///") + 2);
  3. if (url.contains(".jpg") && url.contains(".png")) {
  4. Toast.makeText(this, "请选择图片", Toast.LENGTH_SHORT).show();
  5. return;
  6. }
  7. bitmap = HelpUtil.getBitmapByUrl(url);

二.调用系统拍照图片

1.

[java] view plaincopyprint?

  1. String fileName = "IMG_" + curFormatDateStr + ".png";
  2. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  3. intent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(rootUrl, fileName)));
  4. intent.putExtra("fileName", fileName);
  5. startActivityForResult(intent, CAMERA_IMAGE_CODE);

2.

[html] view plaincopyprint?

  1. url = rootUrl + "/" + "IMG_" + curFormatDateStr + ".png";
  2. bitmap = HelpUtil.getBitmapByUrl(url);
  3. showImageIv.setImageBitmap(HelpUtil.createRotateBitmap(bitmap));

注意:由于拍照所得图片放在ImageView中自动逆时针旋转了90度,当显示的实现需要顺时针旋转90度,达到正常显示水平,方法如下

[html] view plaincopyprint?

  1. /**
  2. * bitmap旋转90度
  3. *
  4. * @param bitmap
  5. * @return
  6. */
  7. public static Bitmap createRotateBitmap(Bitmap bitmap) {
  8. if (bitmap != null) {
  9. Matrix m = new Matrix();
  10. try {
  11. m.setRotate(90, bitmap.getWidth() / 2, bitmap.getHeight() / 2);// 90就是我们需要选择的90度
  12. Bitmap bmp2 = Bitmap.createBitmap(bitmap, 0, 0,
  13. bitmap.getWidth(), bitmap.getHeight(), m, true);
  14. bitmap.recycle();
  15. bitmap = bmp2;
  16. } catch (Exception ex) {
  17. System.out.print("创建图片失败!" + ex);
  18. }
  19. }
  20. return bitmap;
  21. }

三.实例给出整个效果的详细代码

1.效果图

2.布局文件activity_main.xml

[html] view plaincopyprint?

  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent" >
  5. <LinearLayout
  6. android:id="@+id/id_insert_btns_ll"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:layout_alignParentTop="true"
  10. android:orientation="horizontal" >
  11. <Button
  12. android:id="@+id/id_local_img_btn"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"
  15. android:layout_weight="1"
  16. android:text="插入本地图片" />
  17. <Button
  18. android:id="@+id/id_camera_img_btn"
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:layout_weight="1"
  22. android:text="插入拍照图片" />
  23. </LinearLayout>
  24. <TextView
  25. android:id="@+id/id_show_url_tv"
  26. android:layout_width="match_parent"
  27. android:layout_height="wrap_content"
  28. android:gravity="center"
  29. android:layout_alignParentBottom="true"
  30. android:textColor="#FF0000"
  31. android:text="显示图片路径" />
  32. <ImageView
  33. android:id="@+id/id_image_iv"
  34. android:layout_width="wrap_content"
  35. android:layout_height="wrap_content"
  36. android:layout_below="@id/id_insert_btns_ll"
  37. android:layout_above="@id/id_show_url_tv"
  38. android:layout_centerHorizontal="true"
  39. />
  40. </RelativeLayout>

3.主类文件MainActivity.java

[html] view plaincopyprint?

  1. package com.example.insertimagedemo;
  2. import java.io.File;
  3. import java.util.Calendar;
  4. import android.app.Activity;
  5. import android.content.Intent;
  6. import android.graphics.Bitmap;
  7. import android.net.Uri;
  8. import android.os.Bundle;
  9. import android.os.Environment;
  10. import android.provider.MediaStore;
  11. import android.util.Log;
  12. import android.view.View;
  13. import android.view.View.OnClickListener;
  14. import android.widget.Button;
  15. import android.widget.ImageView;
  16. import android.widget.TextView;
  17. import android.widget.Toast;
  18. public class MainActivity extends Activity implements OnClickListener {
  19. private static final int LOCAL_IMAGE_CODE = 1;
  20. private static final int CAMERA_IMAGE_CODE = 2;
  21. private static final String IMAGE_TYPE = "image/*";
  22. private String rootUrl = null;
  23. private String curFormatDateStr = null;
  24. private Button localImgBtn, cameraImgBtn;
  25. private TextView showUrlTv;
  26. private ImageView showImageIv;
  27. @Override
  28. protected void onCreate(Bundle savedInstanceState) {
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_main);
  31. findById();
  32. initData();
  33. }
  34. /**
  35. * 初始化view
  36. */
  37. private void findById() {
  38. localImgBtn = (Button) this.findViewById(R.id.id_local_img_btn);
  39. cameraImgBtn = (Button) this.findViewById(R.id.id_camera_img_btn);
  40. showUrlTv = (TextView) this.findViewById(R.id.id_show_url_tv);
  41. showImageIv = (ImageView) this.findViewById(R.id.id_image_iv);
  42. localImgBtn.setOnClickListener(this);
  43. cameraImgBtn.setOnClickListener(this);
  44. }
  45. /**
  46. * 初始化相关data
  47. */
  48. private void initData() {
  49. rootUrl = Environment.getExternalStorageDirectory().getPath();
  50. }
  51. @Override
  52. public void onClick(View v) {
  53. switch (v.getId()) {
  54. case R.id.id_local_img_btn:
  55. processLocal();
  56. break;
  57. case R.id.id_camera_img_btn:
  58. processCamera();
  59. break;
  60. }
  61. }
  62. /**
  63. * 处理本地图片btn事件
  64. */
  65. private void processLocal() {
  66. Intent intent = new Intent();
  67. /* 开启Pictures画面Type设定为image */
  68. intent.setType(IMAGE_TYPE);
  69. /* 使用Intent.ACTION_GET_CONTENT这个Action */
  70. intent.setAction(Intent.ACTION_GET_CONTENT);
  71. /* 取得相片后返回本画面 */
  72. startActivityForResult(intent, LOCAL_IMAGE_CODE);
  73. }
  74. /**
  75. * 处理camera图片btn事件
  76. */
  77. private void processCamera() {
  78. curFormatDateStr = HelpUtil.getDateFormatString(Calendar.getInstance()
  79. .getTime());
  80. String fileName = "IMG_" + curFormatDateStr + ".png";
  81. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  82. intent.putExtra(MediaStore.EXTRA_OUTPUT,
  83. Uri.fromFile(new File(rootUrl, fileName)));
  84. intent.putExtra("fileName", fileName);
  85. startActivityForResult(intent, CAMERA_IMAGE_CODE);
  86. }
  87. /**
  88. * 处理Activity跳转后返回事件
  89. */
  90. @Override
  91. public void onActivityResult(int requestCode, int resultCode, Intent data) {
  92. if (resultCode == RESULT_OK) {
  93. String url = "";
  94. Bitmap bitmap = null;
  95. if (requestCode == LOCAL_IMAGE_CODE) {
  96. Uri uri = data.getData();
  97. url = uri.toString().substring(
  98. uri.toString().indexOf("///") + 2);
  99. Log.e("uri", uri.toString());
  100. if (url.contains(".jpg") && url.contains(".png")) {
  101. Toast.makeText(this, "请选择图片", Toast.LENGTH_SHORT).show();
  102. return;
  103. }
  104. bitmap = HelpUtil.getBitmapByUrl(url);
  105. showImageIv.setImageBitmap(HelpUtil.getBitmapByUrl(url));
  106. /**
  107. * 获取bitmap另一种方法
  108. *
  109. * ContentResolver cr = this.getContentResolver(); bitmap =
  110. * HelpUtil.getBitmapByUri(uri, cr);
  111. */
  112. } else if (requestCode == CAMERA_IMAGE_CODE) {
  113. url = rootUrl + "/" + "IMG_" + curFormatDateStr + ".png";
  114. bitmap = HelpUtil.getBitmapByUrl(url);
  115. showImageIv.setImageBitmap(HelpUtil.createRotateBitmap(bitmap));
  116. /**
  117. * 获取bitmap另一种方法
  118. *
  119. * File picture = new File(url);
  120. * Uri uri = Uri.fromFile(picture);
  121. * ContentResolver cr = this.getContentResolver();
  122. * bitmap = HelpUtil.getBitmapByUri(uri, cr);
  123. */
  124. }
  125. showUrlTv.setText(url);
  126. } else {
  127. Toast.makeText(this, "没有添加图片", Toast.LENGTH_SHORT).show();
  128. }
  129. }
  130. }

4.帮助类文件HelpUtil.java

[html] view plaincopyprint?

    1. package com.example.insertimagedemo;
    2. import java.io.FileInputStream;
    3. import java.io.FileNotFoundException;
    4. import java.io.IOException;
    5. import java.text.SimpleDateFormat;
    6. import java.util.Date;
    7. import android.annotation.SuppressLint;
    8. import android.content.ContentResolver;
    9. import android.graphics.Bitmap;
    10. import android.graphics.BitmapFactory;
    11. import android.graphics.Matrix;
    12. import android.net.Uri;
    13. public class HelpUtil {
    14. /**
    15. * 根据图片路径获取本地图片的Bitmap
    16. *
    17. * @param url
    18. * @return
    19. */
    20. public static Bitmap getBitmapByUrl(String url) {
    21. FileInputStream fis = null;
    22. Bitmap bitmap = null;
    23. try {
    24. fis = new FileInputStream(url);
    25. bitmap = BitmapFactory.decodeStream(fis);
    26. } catch (FileNotFoundException e) {
    27. // TODO Auto-generated catch block
    28. e.printStackTrace();
    29. bitmap = null;
    30. } finally {
    31. if (fis != null) {
    32. try {
    33. fis.close();
    34. } catch (IOException e) {
    35. // TODO Auto-generated catch block
    36. e.printStackTrace();
    37. }
    38. fis = null;
    39. }
    40. }
    41. return bitmap;
    42. }
    43. /**
    44. * bitmap旋转90度
    45. *
    46. * @param bitmap
    47. * @return
    48. */
    49. public static  Bitmap createRotateBitmap(Bitmap bitmap) {
    50. if (bitmap != null) {
    51. Matrix m = new Matrix();
    52. try {
    53. m.setRotate(90, bitmap.getWidth() / 2, bitmap.getHeight() / 2);// 90就是我们需要选择的90度
    54. Bitmap bmp2 = Bitmap.createBitmap(bitmap, 0, 0,
    55. bitmap.getWidth(), bitmap.getHeight(), m, true);
    56. bitmap.recycle();
    57. bitmap = bmp2;
    58. } catch (Exception ex) {
    59. System.out.print("创建图片失败!" + ex);
    60. }
    61. }
    62. return bitmap;
    63. }
    64. public static Bitmap getBitmapByUri(Uri uri,ContentResolver cr){
    65. Bitmap bitmap = null;
    66. try {
    67. bitmap = BitmapFactory.decodeStream(cr
    68. .openInputStream(uri));
    69. } catch (FileNotFoundException e) {
    70. // TODO Auto-generated catch block
    71. e.printStackTrace();
    72. bitmap = null;
    73. }
    74. return bitmap;
    75. }
    76. /**
    77. * 获取格式化日期字符串
    78. * @param date
    79. * @return
    80. */
    81. @SuppressLint("SimpleDateFormat")
    82. public static String getDateFormatString(Date date) {
    83. if (date == null)
    84. date = new Date();
    85. String formatStr = new String();
    86. SimpleDateFormat matter = new SimpleDateFormat("yyyyMMdd_HHmmss");
    87. formatStr = matter.format(date);
    88. return formatStr;
    89. }
时间: 2024-10-22 23:58:00

Android 实例讲解添加本地图片和调用系统拍照图片的相关文章

Android 实例讲解自定义Camera拍照和预览以及前后置摄像头切换

上一篇博文讲解了怎么去调用本地图片和调用系统拍照图片(http://blog.csdn.net/a123demi/article/details/40003695)的功能. 而本博文将通过实例实现自定义Camera的功效.具体功能如下: 1.实现自定义Camera拍照: 2.实现前后置摄像头的切换: 3.实现Camera拍照后图片缩小显示以及正常预览: 4.实现Camera拍照后图片保存: 在具体实现代码之前,我们先来了解一下Android api对实现自定义Camera的介绍. 根据api的介

Android 实例讲解HorizontalScrollView实现左右滑动

本博文主要讲解怎么使用HorizontalScrollView实现左右滑动的效果. HorizontalScrollView实际上是一个FrameLayout ,一般通过只放置一个LinearLayout子控件.如果要使其添加其他的控件,就使用LinearLayout子控件来添加其他的控件,最后达到丰富其内容的效果.其中,LinearLayout设置的orientation布局为Horizontal.HorizontalScrollView不可以和ListView同时用,因为ListView有自

Android上传图片之调用系统拍照和从相册选择图片

Android上传图片之调用系统拍照和从相册选择图片 前言: 万丈高楼平底起,万事起于微末.不知不觉距离上篇博文已近四个月,2015年12月17日下午发了第一篇博文,现在是2016年4月6日.时间间隔长的过分啊,我自己都看不下去了.原因呢?当然是自己的原因,其实是有很多时间来些博客的,但是这些时间都花在DOTA上了(还是太年轻啊).请原谅我的过错--. 一.概述: 现在几乎应用都会用到上传图片的功能,而要上传图片,首先得选择图片,本文不针对如何上传图片到服务器(每个项目与服务器交互的方式不同,因

Android上传图片之调用系统拍照和从相冊选择图片

Android上传图片之调用系统拍照和从相冊选择图片 本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布 前言: 万丈高楼平底起,万事起于微末.不知不觉距离上篇博文已近四个月,2015年12月17日下午发了第一篇博文.如今是2016年4月6日.时间间隔长的过分啊,我自己都看不下去了. 原因呢?当然是自己的原因.事实上是有非常多时间来些博客的,可是这些时间都花在DOTA上了(还是太年轻啊).请原谅我的过错--. 一.概述: 如今差点儿应用都会用到上传图片的功能,而要上传图片,首先得

android 调用系统相机获取图片、调用系统相册获取图片,并对图片进行截取

打开系统相册获取图片并截取,代码相对简单 1 Intent intent = new Intent(Intent.ACTION_GET_CONTENT,null); 2 intent.setType("image/*"); 3 intent.putExtra("crop", "true"); 4 5 //WIDTH 和 HEIGHT指的是截取框的宽高比例,如设WIDTH = 1,HEIGHT = 1,截取框就为正方形 6 intent.putEx

android 调用系统分享图片及文字

调用系统分享文字:public static void shareText(Context context, String extraText) {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_SUBJECT, "连接分享");intent.putExtra(Intent.EXTRA_TEXT, extr

android调用系统拍照那些事

小时候都知道每天写日记是个好习惯,慢慢发现自己忘记了这些习惯,好久没有给这干枯的博客添加一点新意了,这回也冒出个小芽来刷新一下博客. 今天写的一点也不复杂,就是回顾一些老的知识而已,也算是记一个笔记,好了闲话不多说了,开始今天的主题吧. 关于拍照,这里不是自己实现拍照,是调用系统拍照,很简单的,可是有些时候我也遇到一个问题,就是我没有主动压缩,系统却自动帮我压缩了,可是我需要这些高清的图片,解决方式网上也有说,但是我做的是自己的笔记,所以也不在乎赘余,最起码我是经过验证后,才写我笔记的. 下面是

关于android中调用系统拍照,返回图片是旋转90度..

由于项目的需要,没有自定义拍照功能,仅仅调用了系统的拍照程序..但是出现了一个问题,就是拍照完成显示图片居然是被旋转的图片.... 解决办法: /** * 获取图片的旋转角度,有些系统把拍照的图片旋转了,有的没有旋转 */ int degree = readPictureDegree(f.getAbsolutePath()); BitmapFactory.Options opts=new BitmapFactory.Options();//获取缩略图显示到屏幕上 opts.inSampleSiz

从相册获取图片及调用相机拍照获取图片,最后上传图片到服务器

调用相机拍照获取图片: 跳转到到拍照界面: Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //下面这句指定调用相机拍照后的照片存储的路径 mSzImageFileName = Long.toString(System.currentTimeMillis()) + ".png"; takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new F