Android调用相机程序和图片处理程序获得原图并且进行图片处理

分类: Android开发 1376人阅读 评论(3) 收藏 举报 android Android 图片处理 照相机

这篇文章主要介绍的是调用相机程序获得图片,调用Android操作系统自带的图片处理程序处理图片然后返回到我们的程序。

先看看布局文件:

[html] view plain copy print ?
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent"
  5. android:orientation="vertical">
  6. <Button
  7. android:id="@+id/button1"
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="Button"/>
  11. <ImageView
  12. android:id="@+id/imageView1"
  13. android:layout_width="wrap_content"
  14. android:layout_height="wrap_content"/>
  15. </LinearLayout>
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >        <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="Button" />    <ImageView        android:id="@+id/imageView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout>

向布局中加入了一个Button和一个ImageView。

在Button的OnClick方法中启动相机程序,让用户选择使用哪个相机,代码如下:

[java] view plain copy print ?
  1. @Override
  2. publicvoidonClick(Viewv){
  3. //doTakePhoto();
  4. Filefos=null;
  5. try{
  6. fos=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  7. }catch(Exceptione){
  8. e.printStackTrace();
  9. }
  10. Uriu=Uri.fromFile(fos);
  11. Intenti=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
  12. i.putExtra(MediaStore.Images.Media.ORIENTATION,0);
  13. i.putExtra(MediaStore.EXTRA_OUTPUT,u);
  14. this.startActivityForResult(i,9);
  15. }
@Overridepublic void onClick(View v) {//doTakePhoto();File fos=null;try {fos=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");} catch (Exception e) {e.printStackTrace();}Uri u=Uri.fromFile(fos);Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(MediaStore.Images.Media.ORIENTATION, 0);i.putExtra(MediaStore.EXTRA_OUTPUT, u);this.startActivityForResult(i, 9);} 

效果如下:

向Intent中放入一些信息,指定保存原图,额外的保存在我指定的地址。使用this.startActivityForresult();传入intent对象和请求的值。


覆盖父类的onActivityResult方法,当其他Activity结束之后返回到本Activity。

[java] view plain copy print ?
  1. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  2. if(resultCode==RESULT_OK)
  3. {
  4. if(requestCode==9)
  5. {
  6. Filebb=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  7. Intenti=newIntent("com.android.camera.action.CROP");
  8. i.setType("image/*");
  9. //i.putExtra("data",bb);
  10. i.setDataAndType(Uri.fromFile(bb),"image/jpeg");
  11. i.putExtra("crop","true");
  12. i.putExtra("aspectX",1);
  13. i.putExtra("aspectY",1);
  14. i.putExtra("outputX",500);
  15. i.putExtra("outputY",500);
  16. i.putExtra("return-data",true);
  17. this.startActivityForResult(i,7);
  18. }
  19. if(requestCode==7)
  20. {
  21. Bitmapbb=data.getParcelableExtra("data");
  22. i.setImageBitmap(bb);
  23. }
  24. }
  25. }
protected void onActivityResult(int requestCode, int resultCode, Intent data) {                        if(resultCode==RESULT_OK)        {        if(requestCode==9)        {                File  bb=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");                Intent i=new Intent("com.android.camera.action.CROP");        i.setType("image/*");                        //i.putExtra("data", bb);        i.setDataAndType(Uri.fromFile(bb), "image/jpeg");                i.putExtra("crop", "true");                i.putExtra("aspectX", 1);                i.putExtra("aspectY", 1);                i.putExtra("outputX", 500);                i.putExtra("outputY", 500);                i.putExtra("return-data", true);                                this.startActivityForResult(i, 7);        }                if(requestCode==7)        {        Bitmap bb=data.getParcelableExtra("data");        i.setImageBitmap(bb);                }        }                                }

通过返回的请求值,我就知道是从哪个Activity返回来的,如果是从相机程序返回,那就获得拍照之后的数据,跳到图片处理程序。如果是从图片处理程序回来的,就获得返回的数据,显示处理之后的图片。


最后不要忘了在程序退出的时候删除在SDcard上没用的图片。

[java] view plain copy print ?
  1. @Override
  2. protectedvoidonDestroy(){
  3. super.onDestroy();
  4. Filef=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  5. if(f.exists())
  6. {
  7. f.delete();
  8. }
  9. }
@Overrideprotected void onDestroy() {super.onDestroy();File f=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");if(f.exists()){f.delete();}} 

好了,就这样。

下面贴出运行效果图:





下面是本Activity的全部代码:

[java] view plain copy print ?
  1. packagecom.zhycheng.takephoto;
  2. importjava.io.File;
  3. importjava.io.FileNotFoundException;
  4. importjava.io.FileOutputStream;
  5. importandroid.app.Activity;
  6. importandroid.content.Intent;
  7. importandroid.graphics.Bitmap;
  8. importandroid.graphics.BitmapFactory;
  9. importandroid.net.Uri;
  10. importandroid.os.Bundle;
  11. importandroid.os.Environment;
  12. importandroid.provider.MediaStore;
  13. importandroid.view.View;
  14. importandroid.view.View.OnClickListener;
  15. importandroid.widget.Button;
  16. importandroid.widget.ImageView;
  17. publicclassMainActivityextendsActivityimplementsOnClickListener{
  18. StringlocalTempImgFileName;
  19. StringlocalTempImgDir="TestCamera";
  20. Buttonb;
  21. ImageViewi;
  22. @Override
  23. publicvoidonCreate(BundlesavedInstanceState){
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.main);
  26. b=(Button)findViewById(R.id.button1);
  27. b.setOnClickListener(this);
  28. i=(ImageView)findViewById(R.id.imageView1);
  29. }
  30. @Override
  31. publicvoidonClick(Viewv){
  32. //doTakePhoto();
  33. Filefos=null;
  34. try{
  35. fos=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  36. }catch(Exceptione){
  37. e.printStackTrace();
  38. }
  39. Uriu=Uri.fromFile(fos);
  40. Intenti=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
  41. i.putExtra(MediaStore.Images.Media.ORIENTATION,0);
  42. i.putExtra(MediaStore.EXTRA_OUTPUT,u);
  43. this.startActivityForResult(i,9);
  44. }
  45. protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  46. if(resultCode==RESULT_OK)
  47. {
  48. if(requestCode==9)
  49. {
  50. Filebb=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  51. Intenti=newIntent("com.android.camera.action.CROP");
  52. i.setType("image/*");
  53. //i.putExtra("data",bb);
  54. i.setDataAndType(Uri.fromFile(bb),"image/jpeg");
  55. i.putExtra("crop","true");
  56. i.putExtra("aspectX",1);
  57. i.putExtra("aspectY",1);
  58. i.putExtra("outputX",500);
  59. i.putExtra("outputY",500);
  60. i.putExtra("return-data",true);
  61. this.startActivityForResult(i,7);
  62. }
  63. if(requestCode==7)
  64. {
  65. Bitmapbb=data.getParcelableExtra("data");
  66. i.setImageBitmap(bb);
  67. }
  68. }
  69. }
  70. @Override
  71. protectedvoidonDestroy(){
  72. super.onDestroy();
  73. Filef=newFile(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");
  74. if(f.exists())
  75. {
  76. f.delete();
  77. }
  78. }
  79. }
package com.zhycheng.takephoto;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;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.ImageView;public class MainActivity extends Activity implements OnClickListener {String localTempImgFileName;String localTempImgDir="TestCamera";Button b;ImageView i;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        b=(Button) findViewById(R.id.button1);        b.setOnClickListener(this);        i=(ImageView) findViewById(R.id.imageView1);    }    @Overridepublic void onClick(View v) {//doTakePhoto();File fos=null;try {fos=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");} catch (Exception e) {e.printStackTrace();}Uri u=Uri.fromFile(fos);Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);i.putExtra(MediaStore.Images.Media.ORIENTATION, 0);i.putExtra(MediaStore.EXTRA_OUTPUT, u);this.startActivityForResult(i, 9);} protected void onActivityResult(int requestCode, int resultCode, Intent data) {                        if(resultCode==RESULT_OK)        {        if(requestCode==9)        {                File  bb=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");                Intent i=new Intent("com.android.camera.action.CROP");        i.setType("image/*");                        //i.putExtra("data", bb);        i.setDataAndType(Uri.fromFile(bb), "image/jpeg");                i.putExtra("crop", "true");                i.putExtra("aspectX", 1);                i.putExtra("aspectY", 1);                i.putExtra("outputX", 500);                i.putExtra("outputY", 500);                i.putExtra("return-data", true);                                this.startActivityForResult(i, 7);        }                if(requestCode==7)        {        Bitmap bb=data.getParcelableExtra("data");        i.setImageBitmap(bb);                }        }                                }@Overrideprotected void onDestroy() {super.onDestroy(); File f=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"zhycheng.jpg");if(f.exists()){f.delete();}} }

工程代码下载: TakePhoto.zip

更多相关文章

  1. android之selector使用
  2. android背景选择器selector用法
  3. Android(安卓)获取汉字拼音
  4. Android(安卓)获取汉字拼音
  5. Android多线程同步转异步方法总结
  6. android背景选择器selector用法汇总
  7. Android(安卓)MimeType和MimeTypeMap的介绍
  8. Android(安卓)虚拟摇杆,多种模式回调,返回距离级别,方向,角度。
  9. 使用navigator.userAgent.toLowerCase()判断移动端类型

随机推荐

  1. Github 上Top1的Android(安卓)异步网络请
  2. Android的onCreateOptionsMenu()创建菜单
  3. Android的按键处理
  4. Android(安卓)MapView 申请apiKey
  5. Android深入浅出系列课程---Lesson8 Andr
  6. android的互联网开发
  7. Android中pm命令用法详解
  8. Android一键锁屏源码
  9. android shape的使用
  10. Android自带Music播放器更新播放时间和进