Android开发之系统相机相册使用

获取图片后进行处理,对分辨率较大的进行缩放,较小的原图显示

1、调用系统相机

[java] view
plain
copyprint?

  1. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 调用系统相机
  2. new DateFormat();
  3. name = DateFormat.format("yyyyMMdd_hhmmss",
  4. Calendar.getInstance(Locale.CHINA))
  5. + ".jpg";
  6. Uri imageUri = Uri.fromFile(new File(PATH, name));
  7. intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//把照片保存在sd卡中指定位置。
  8. startActivityForResult(intent, CAMERA_TAKE);
2、调用系统相册

[java] view
plain
copyprint?

  1. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  2. intent.setType("image/*");
  3. startActivityForResult(intent, CAMERA_SELECT);
3、在onActivityResult方法处理得到的图片

看源码吧。。。

首先简单的布局文件

[java] view
plain
copyprint?

  1. <LinearLayout 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. android:orientation="vertical" >
  6. <Button
  7. android:id="@+id/btn_take"
  8. android:layout_width="match_parent"
  9. android:layout_height="wrap_content"
  10. android:text="@string/take" />
  11. <Button
  12. android:id="@+id/btn_select"
  13. android:layout_width="match_parent"
  14. android:layout_height="wrap_content"
  15. android:text="@string/selectFrom" />
  16. <ScrollView
  17. android:id="@+id/sv_show"
  18. android:layout_width="match_parent"
  19. android:layout_height="match_parent" >
  20. <LinearLayout
  21. android:id="@+id/ll_show"
  22. android:layout_width="match_parent"
  23. android:layout_height="match_parent"
  24. android:orientation="vertical" >
  25. </LinearLayout>
  26. </ScrollView>
  27. </LinearLayout>

源码

[java] view
plain
copyprint?

  1. public class MainActivity extends Activity {
  2. private Button btn_take, btn_select;
  3. private LinearLayout ll_show;
  4. // 请求
  5. private static final int CAMERA_TAKE = 1;
  6. private static final int CAMERA_SELECT = 2;
  7. // 图片名
  8. public String name;
  9. // 存储路径
  10. private static final String PATH = Environment
  11. .getExternalStorageDirectory() + "/DCIM";
  12. private boolean isBig = false;
  13. @Override
  14. protected void onCreate(Bundle savedInstanceState) {
  15. super.onCreate(savedInstanceState);
  16. setContentView(R.layout.activity_main);
  17. btn_take = (Button) findViewById(R.id.btn_take);
  18. btn_select = (Button) findViewById(R.id.btn_select);
  19. ll_show = (LinearLayout) findViewById(R.id.ll_show);
  20. btn_take.setOnClickListener(new OnClickListener() {
  21. @Override
  22. public void onClick(View v) {
  23. takePhoto();
  24. }
  25. });
  26. btn_select.setOnClickListener(new OnClickListener() {
  27. @Override
  28. public void onClick(View v) {
  29. Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
  30. intent.setType("image/*");
  31. startActivityForResult(intent, CAMERA_SELECT);
  32. }
  33. });
  34. }
  35. public void takePhoto() {
  36. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);// 调用系统相机
  37. new DateFormat();
  38. name = DateFormat.format("yyyyMMdd_hhmmss",
  39. Calendar.getInstance(Locale.CHINA))
  40. + ".jpg";
  41. Uri imageUri = Uri.fromFile(new File(PATH, name));
  42. intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
  43. startActivityForResult(intent, CAMERA_TAKE);
  44. }
  45. @Override
  46. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  47. super.onActivityResult(requestCode, resultCode, data);
  48. if (resultCode == RESULT_OK) {
  49. switch (requestCode) {
  50. case CAMERA_TAKE:
  51. Bitmap bitmap = BitmapFactory.decodeFile(PATH + "/" + name);
  52. Toast.makeText(this, name, Toast.LENGTH_LONG).show();
  53. System.out.println(bitmap.getHeight() + "======"
  54. + bitmap.getWidth());
  55. // 获取屏幕分辨率
  56. DisplayMetrics dm = new DisplayMetrics();
  57. getWindowManager().getDefaultDisplay().getMetrics(dm);
  58. // 图片分辨率与屏幕分辨率
  59. float scale = bitmap.getWidth() / (float) dm.widthPixels;
  60. Bitmap newBitMap = null;
  61. if (scale > 1) {
  62. newBitMap = zoomBitmap(bitmap, bitmap.getWidth() / scale,
  63. bitmap.getHeight() / scale);
  64. bitmap.recycle();
  65. isBig = true;
  66. }
  67. //添加relative布局放置img,btn
  68. final RelativeLayout rl_show_2 = new RelativeLayout(this);
  69. rl_show_2.setLayoutParams(new LayoutParams(
  70. RelativeLayout.LayoutParams.WRAP_CONTENT,
  71. RelativeLayout.LayoutParams.WRAP_CONTENT));
  72. ImageButton imgBtn_del_2 = new ImageButton(this);
  73. imgBtn_del_2.setBackgroundResource(android.R.drawable.ic_delete);
  74. //设置按钮的布局规则
  75. RelativeLayout.LayoutParams rl_2 = new RelativeLayout.LayoutParams(
  76. new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
  77. RelativeLayout.LayoutParams.WRAP_CONTENT));
  78. rl_2.addRule(RelativeLayout.ALIGN_PARENT_TOP);
  79. rl_2.addRule(RelativeLayout.ALIGN_RIGHT, 2);
  80. // 将图片显示到界面
  81. ImageView img = new ImageView(this);
  82. img.setId(2);
  83. img.setLayoutParams(new LayoutParams(
  84. LinearLayout.LayoutParams.WRAP_CONTENT,
  85. LinearLayout.LayoutParams.WRAP_CONTENT));
  86. img.setScaleType(ImageView.ScaleType.CENTER_CROP);
  87. img.setPadding(2, 0, 0, 5);
  88. if (isBig) {
  89. img.setImageBitmap(newBitMap);
  90. isBig = false;
  91. } else
  92. img.setImageBitmap(bitmap);
  93. rl_show_2.addView(img);
  94. rl_show_2.addView(imgBtn_del_2,rl_2);
  95. ll_show.addView(rl_show_2);
  96. imgBtn_del_2.setOnClickListener(new OnClickListener() {
  97. @Override
  98. public void onClick(View v) {
  99. ll_show.removeView(rl_show_2);
  100. }
  101. });
  102. break;
  103. case CAMERA_SELECT:
  104. ContentResolver resolver = getContentResolver();
  105. // 照片的原始资源地址
  106. Uri imgUri = data.getData();
  107. try {
  108. // 使用ContentProvider通过Uri获取原始图片
  109. Bitmap photo = MediaStore.Images.Media.getBitmap(resolver,
  110. imgUri);
  111. // 获取屏幕分辨率
  112. DisplayMetrics dm_2 = new DisplayMetrics();
  113. getWindowManager().getDefaultDisplay().getMetrics(dm_2);
  114. // 图片分辨率与屏幕分辨率
  115. float scale_2 = photo.getWidth() / (float) dm_2.widthPixels;
  116. Bitmap newBitMap_2 = null;
  117. if (scale_2 > 1) {
  118. newBitMap_2 = zoomBitmap(photo, photo.getWidth()
  119. / scale_2, photo.getHeight() / scale_2);
  120. photo.recycle();
  121. isBig = true;
  122. }
  123. final RelativeLayout rl_show = new RelativeLayout(this);
  124. rl_show.setLayoutParams(new LayoutParams(
  125. RelativeLayout.LayoutParams.WRAP_CONTENT,
  126. RelativeLayout.LayoutParams.WRAP_CONTENT));
  127. ImageButton imgBtn_del = new ImageButton(this);
  128. imgBtn_del.setBackgroundResource(android.R.drawable.ic_delete);
  129. //设置按钮的布局规则
  130. RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(
  131. new LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
  132. RelativeLayout.LayoutParams.WRAP_CONTENT));
  133. rl.addRule(RelativeLayout.ALIGN_PARENT_TOP);
  134. rl.addRule(RelativeLayout.ALIGN_RIGHT, 1);
  135. // 将图片显示到界面
  136. ImageView img_2 = new ImageView(this);
  137. img_2.setId(1);
  138. img_2.setLayoutParams(new LayoutParams(
  139. LinearLayout.LayoutParams.WRAP_CONTENT,
  140. LinearLayout.LayoutParams.WRAP_CONTENT));
  141. img_2.setScaleType(ImageView.ScaleType.CENTER_CROP);
  142. img_2.setPadding(2, 0, 0, 5);
  143. if (scale_2 > 1) {
  144. img_2.setImageBitmap(newBitMap_2);
  145. isBig = false;
  146. } else
  147. img_2.setImageBitmap(photo);
  148. //将img,btn添加
  149. rl_show.addView(img_2);
  150. rl_show.addView(imgBtn_del,rl);
  151. ll_show.addView(rl_show);
  152. imgBtn_del.setOnClickListener(new OnClickListener() {
  153. @Override
  154. public void onClick(View v) {
  155. ll_show.removeView(rl_show);
  156. }
  157. });
  158. } catch (Exception e) {
  159. // TODO: handle exception
  160. }
  161. break;
  162. }
  163. }
  164. }
  165. // 对分辨率较大的图片进行缩放
  166. public Bitmap zoomBitmap(Bitmap bitmap, float width, float height) {
  167. int w = bitmap.getWidth();
  168. int h = bitmap.getHeight();
  169. Matrix matrix = new Matrix();
  170. float scaleWidth = ((float) width / w);
  171. float scaleHeight = ((float) height / h);
  172. matrix.postScale(scaleWidth, scaleHeight);// 利用矩阵进行缩放不会造成内存溢出
  173. Bitmap newbmp = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
  174. return newbmp;
  175. }
  176. }

ok,结束。。

时间: 2024-10-13 19:43:25

Android开发之系统相机相册使用的相关文章

IOS开发调用系统相机和打开闪光灯

IOS开发调用系统相机和打开闪光灯      今天给大家分享一下如何调用iphone的拍照功能和打开闪光灯,有些代码我也不太理解,很多是在网上借鉴其他人的.IOS有两种的拍照和视频的方 式:1.直接使用UIImagePickerController,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能.2.另一种是通过 AVFoundation.framework框架完全自定义拍照的界面和选择图片库界面.我只做了第一种,就先给大家介绍第一种做法: 一.首先调用接口前,我们需要先判断当前设备是否

android开发中系统自带语音模块的使用

android开发中系统自带语音模块的使用需求:项目中需要添加语音搜索模块,增加用户体验解决过程:在网上搜到语音搜索例子,参考网上代码,加入到了自己的项目,完成产品要求.这个问题很好解决,网上能找到很多的资料,但是没有直接导入工程就能用的例子,我这里写了一个完整的Demo,代码可以直接粘贴到自己项目中去,实现了语音搜索,并将搜索结果展示.语音搜索大致流程:启动系统自带的Intent,Intent参数设置为RecognizerIntent.ACTION_RECOGNIZE_SPEECH,再加上一些

iOS开发 调用系统相机和相册

调用系统相机和相册 (iPad,iPhone)打开相机:(iPad,iPhone)//先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库      UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;  //    if (![UIImagePickerController isSourceTypeAvailab

调用系统相机,相册功能

一开始的思路是这一块的功能单独出去;这样处理又会碰见很多问题. 还是集成在Activity中可能效果更好些, 而且三星的手机调用系统相机会导致调用的Activity会重启生命周期,如果是在fragment中调用的,会碰见更多的问题,做外包的伤不起,想深入下这个问题都没时间,暂时记录下在Activity中解决问题的方法,方便后面使用时直接拿来用. 比如在Activity中点击某个按钮,弹出一个对话框,选择拍照还是选择图片 mButton.setOnClickListener(new OnClick

调用系统相机相册

/** * 跳转至系统相册 * * @param activity * 活动实例 * @param requestCode * 请求码 */ public static void startSystemAlbumForResult(Activity activity, int requestCode) { Intent intent = new Intent(Intent.ACTION_PICK, Media.EXTERNAL_CONTENT_URI); activity.startActivi

Android 调起系统相机拍照

概述 最近在看 nanChen 写的图片选择器 ImagePicker,感觉写得很不错,也打算把从中学到的东西写下来.很多时候,遇到一个好的框架能够降低开发成本这是好事.但是也要去了解其内部具体实现逻辑,说不定哪天你需要完成一个类似的小功能,你知道原理就能快速写出来,而不是引入整个框架. 本文讲其中的第一个功能:如何调起手机的相机拍照? 系统现有相机应用 对于如何调用系统现有应用,这里简单再说一下.在开发的应用中调用系统现有应用,需要使用 Intent 指定开启的应用的 Action 和 Cat

[Android Pro] 调用系统相机和图库,裁剪图片

private static final int PHOTO_REQUEST_TAKEPHOTO = 1;// 拍照 private static final int PHOTO_REQUEST_GALLERY = 2;// 从相册中选择 private static final int PHOTO_REQUEST_CUT = 3;// 结果 private File tempFile = new File(Environment.getExternalStorageDirectory(), g

Android开发 - 获取系统输入法高度的正确姿势

问题与解决 在Android应用的开发中,有一些需求需要我们获取到输入法的高度,但是官方的API并没有提供类似的方法,所以我们需要自己来实现. 查阅了网上很多资料,试过以后都不理想. 比如有的方法通过监听布局的变化来计算输入法的高度,这种方式在Activity的配置中配置为"android:windowSoftInputMode="adjustResize""时没有问题,可以正确获取输入法的高度,因为布局此时确实会动态的调整. 但是当Activity配置为"

android 开发之 - 调用系统闪光灯

Android开发调用系统闪光灯. 添加权限: <!-- 调用闪光灯权限 --> <uses-permission android:name="android.permission.FLASHLIGHT" /> <uses-permission android:name="android.permission.CAMERA"/> <uses-feature android:name="android.hardwar