调用系统拍照及裁剪功能主要代码实现

  1. 本文章来自转载.允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://mzh3344258.blog.51cto.com/1823534/808837转载自http://mzh3344258.blog.51cto.com/1823534/808837
  2. package com.xiaoma.piccut.demo;  
  3.  
  4. import java.io.File;  
  5. import android.app.Activity;  
  6. import android.app.AlertDialog;  
  7. import android.content.DialogInterface;  
  8. import android.content.Intent;  
  9. import android.graphics.Bitmap;  
  10. import android.graphics.drawable.BitmapDrawable;  
  11. import android.graphics.drawable.Drawable;  
  12. import android.net.Uri;  
  13. import android.os.Bundle;  
  14. import android.os.Environment;  
  15. import android.provider.MediaStore;  
  16. import android.view.View;  
  17. import android.view.View.OnClickListener;  
  18. import android.widget.Button;  
  19. import android.widget.ImageButton;  
  20. import android.widget.ImageView;  
  21. /**  
  22.  * @Title: PicCutDemoActivity.java  
  23.  * @Package com.xiaoma.piccut.demo  
  24.  * @Description: 图片裁剪功能测试  
  25.  * @author XiaoMa  
  26.  */ 
  27. public class PicCutDemoActivity extends Activity implements OnClickListener {  
  28.  
  29.     private ImageButton ib = null;  
  30.     private ImageView iv = null;  
  31.     private Button btn = null;  
  32.     private String tp = null;  
  33.       
  34.  
  35.     /** Called when the activity is first created. */ 
  36.     @Override 
  37.     public void onCreate(Bundle savedInstanceState) {  
  38.         super.onCreate(savedInstanceState);  
  39.         setContentView(R.layout.main);  
  40.         //初始化  
  41.         init();  
  42.     }  
  43.       
  44.     /**  
  45.      * 初始化方法实现  
  46.      */ 
  47.     private void init() {  
  48.         ib = (ImageButton) findViewById(R.id.imageButton1);  
  49.         iv = (ImageView) findViewById(R.id.imageView1);  
  50.         btn = (Button) findViewById(R.id.button1);  
  51.         ib.setOnClickListener(this);  
  52.         iv.setOnClickListener(this);  
  53.         btn.setOnClickListener(this);  
  54.     }  
  55.  
  56.       
  57.     /**  
  58.      * 控件点击事件实现  
  59.      *   
  60.      * 因为有朋友问不同控件的背景图裁剪怎么实现,  
  61.      * 我就在这个地方用了三个控件,只为了自己记录学习  
  62.      * 大家觉得没用的可以跳过啦  
  63.      */ 
  64.     @Override 
  65.     public void onClick(View v) {  
  66.         switch (v.getId()) {  
  67.         case R.id.imageButton1:  
  68.             ShowPickDialog();  
  69.             break;  
  70.         case R.id.imageView1:  
  71.             ShowPickDialog();  
  72.             break;  
  73.         case R.id.button1:  
  74.             ShowPickDialog();  
  75.             break;  
  76.  
  77.         default:  
  78.             break;  
  79.         }  
  80.     }  
  81.  
  82.     /**  
  83.      * 选择提示对话框  
  84.      */ 
  85.     private void ShowPickDialog() {  
  86.         new AlertDialog.Builder(this)  
  87.                 .setTitle("设置头像...")  
  88.                 .setNegativeButton("相册"new DialogInterface.OnClickListener() {  
  89.                     public void onClick(DialogInterface dialog, int which) {  
  90.                         dialog.dismiss();  
  91.                         /**  
  92.                          * 刚开始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源码,  
  93.                          * 可以发现里面很多东西,Intent是个很强大的东西,大家一定仔细阅读下  
  94.                          */ 
  95.                         Intent intent = new Intent(Intent.ACTION_PICK, null);  
  96.                           
  97.                         /**  
  98.                          * 下面这句话,与其它方式写是一样的效果,如果:  
  99.                          * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
  100.                          * intent.setType(""image/*");设置数据类型  
  101.                          * 如果朋友们要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"  
  102.                          * 这个地方小马有个疑问,希望高手解答下:就是这个数据URI与类型为什么要分两种形式来写呀?有什么区别?  
  103.                          */ 
  104.                         intent.setDataAndType(  
  105.                                 MediaStore.Images.Media.EXTERNAL_CONTENT_URI,  
  106.                                 "image/*");  
  107.                         startActivityForResult(intent, 1);  
  108.  
  109.                     }  
  110.                 })  
  111.                 .setPositiveButton("拍照"new DialogInterface.OnClickListener() {  
  112.                     public void onClick(DialogInterface dialog, int whichButton) {  
  113.                         dialog.dismiss();  
  114.                         /**  
  115.                          * 下面这句还是老样子,调用快速拍照功能,至于为什么叫快速拍照,大家可以参考如下官方  
  116.                          * 文档,you_sdk_path/docs/guide/topics/media/camera.html  
  117.                          * 我刚看的时候因为太长就认真看,其实是错的,这个里面有用的太多了,所以大家不要认为  
  118.                          * 官方文档太长了就不看了,其实是错的,这个地方小马也错了,必须改正  
  119.                          */  
  120.                         Intent intent = new Intent(  
  121.                                 MediaStore.ACTION_IMAGE_CAPTURE);  
  122.                         //下面这句指定调用相机拍照后的照片存储的路径  
  123.                         intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri  
  124.                                 .fromFile(new File(Environment  
  125.                                         .getExternalStorageDirectory(),  
  126.                                         "xiaoma.jpg")));  
  127.                         startActivityForResult(intent, 2);  
  128.                     }  
  129.                 }).show();  
  130.     }  
  131.  
  132.     @Override 
  133.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  134.         switch (requestCode) {  
  135.         // 如果是直接从相册获取  
  136.         case 1:  
  137.             startPhotoZoom(data.getData());  
  138.             break;  
  139.         // 如果是调用相机拍照时  
  140.         case 2:  
  141.             File temp = new File(Environment.getExternalStorageDirectory()  
  142.                     + "/xiaoma.jpg");  
  143.             startPhotoZoom(Uri.fromFile(temp));  
  144.             break;  
  145.         // 取得裁剪后的图片  
  146.         case 3:  
  147.             /**  
  148.              * 非空判断大家一定要验证,如果不验证的话,  
  149.              * 在剪裁之后如果发现不满意,要重新裁剪,丢弃  
  150.              * 当前功能时,会报NullException,小马只  
  151.              * 在这个地方加下,大家可以根据不同情况在合适的  
  152.              * 地方做判断处理类似情况  
  153.              *   
  154.              */ 
  155.             if(data != null){  
  156.                 setPicToView(data);  
  157.             }  
  158.             break;  
  159.         default:  
  160.             break;  
  161.  
  162.         }  
  163.         super.onActivityResult(requestCode, resultCode, data);  
  164.     }  
  165.       
  166.     /**  
  167.      * 裁剪图片方法实现  
  168.      * @param uri  
  169.      */ 
  170.     public void startPhotoZoom(Uri uri) {  
  171.         /*  
  172.          * 至于下面这个Intent的ACTION是怎么知道的,大家可以看下自己路径下的如下网页  
  173.          * yourself_sdk_path/docs/reference/android/content/Intent.html  
  174.          * 直接在里面Ctrl+F搜:CROP ,之前小马没仔细看过,其实安卓系统早已经有自带图片裁剪功能,  
  175.          * 是直接调本地库的,小马不懂C C++  这个不做详细了解去了,有轮子就用轮子,不再研究轮子是怎么  
  176.          * 制做的了...吼吼  
  177.          */ 
  178.         Intent intent = new Intent("com.android.camera.action.CROP");  
  179.         intent.setDataAndType(uri, "image/*");  
  180.         //下面这个crop=true是设置在开启的Intent中设置显示的VIEW可裁剪  
  181.         intent.putExtra("crop""true");  
  182.         // aspectX aspectY 是宽高的比例  
  183.         intent.putExtra("aspectX"1);  
  184.         intent.putExtra("aspectY"1);  
  185.         // outputX outputY 是裁剪图片宽高  
  186.         intent.putExtra("outputX"150);  
  187.         intent.putExtra("outputY"150);  
  188.         intent.putExtra("return-data"true);  
  189.         startActivityForResult(intent, 3);  
  190.     }  
  191.       
  192.     /**  
  193.      * 保存裁剪之后的图片数据  
  194.      * @param picdata  
  195.      */  
  196.     private void setPicToView(Intent picdata) {  
  197.         Bundle extras = picdata.getExtras();  
  198.         if (extras != null) {  
  199.             Bitmap photo = extras.getParcelable("data");  
  200.             Drawable drawable = new BitmapDrawable(photo);  
  201.               
  202.             /**  
  203.              * 下面注释的方法是将裁剪之后的图片以Base64Coder的字符方式上  
  204.              * 传到服务器,QQ头像上传采用的方法跟这个类似  
  205.              */ 
  206.               
  207.             /*ByteArrayOutputStream stream = new ByteArrayOutputStream();  
  208.             photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);  
  209.             byte[] b = stream.toByteArray();  
  210.             // 将图片流以字符串形式存储下来  
  211.               
  212.             tp = new String(Base64Coder.encodeLines(b));  
  213.             这个地方大家可以写下给服务器上传图片的实现,直接把tp直接上传就可以了,  
  214.             服务器处理的方法是服务器那边的事了,吼吼  
  215.               
  216.             如果下载到的服务器的数据还是以Base64Coder的形式的话,可以用以下方式转换  
  217.             为我们可以用的图片类型就OK啦...吼吼  
  218.             Bitmap dBitmap = BitmapFactory.decodeFile(tp);  
  219.             Drawable drawable = new BitmapDrawable(dBitmap);  
  220.             */ 
  221.             ib.setBackgroundDrawable(drawable);  
  222.             iv.setBackgroundDrawable(drawable);  
  223.         }  
  224.     }  
  225.  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值