首页 > 代码库 > Android 实例讲解添加本地图片和调用系统拍照图片

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


3.主类文件MainActivity.java

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


4.帮助类文件HelpUtil.java

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

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