在多媒体应用中,Image是最基础的功能模块,接下来我们将看看在Android中是如何获取和存储Image的。Android内嵌的Image获取和存储功能,可以让我们对于整个媒体框架有个比较全面的了解,同时为audio和video的学习打下基础。

一、Image的获取可以通过调Android自带的Camera应用来完成。该应用含有一个Intent-Filter。通过使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent)就可以启动Camera应用了。

二、Image存储,Android系统中含有一个多媒体库,其中包括所有Image、Video、Audio的数据。通过MediaStore对象可以访问相关数据。

java代码:

view plain
  1. packageeoe.demo;
  2. importjava.io.File;
  3. importandroid.app.Activity;
  4. importandroid.content.ContentValues;
  5. importandroid.content.Intent;
  6. importandroid.graphics.Bitmap;
  7. importandroid.graphics.BitmapFactory;
  8. importandroid.net.Uri;
  9. importandroid.os.Bundle;
  10. importandroid.os.Environment;
  11. importandroid.provider.MediaStore;
  12. importandroid.util.Log;
  13. importandroid.view.Display;
  14. importandroid.view.View;
  15. importandroid.widget.Button;
  16. importandroid.widget.ImageView;
  17. /**
  18. *这里多媒体第一个示例,主要介绍Image的获取和存储
  19. *Image的获取可以通过Android自带的Camera应用来获得,
  20. *图片的存储需要用到MediaStore对象。Android中的多媒体库。
  21. *
  22. *@authorAdministrator
  23. *
  24. */
  25. publicclassMainActivityextendsActivity{
  26. privatestaticfinalintRESULT_CODE=1;
  27. privateButtonbtnCamera;
  28. privateImageViewimageView;
  29. privateUriimageFilePath;
  30. @Override
  31. publicvoidonCreate(BundlesavedInstanceState){
  32. super.onCreate(savedInstanceState);
  33. setContentView(R.layout.main);
  34. imageView=(ImageView)this.findViewById(R.id.imageView);
  35. btnCamera=(Button)this.findViewById(R.id.camera);
  36. btnCamera.setOnClickListener(newView.OnClickListener(){
  37. @Override
  38. publicvoidonClick(Viewv){
  39. /**
  40. *由于Camara返回的是缩略图,我们可以传递给他一个参数EXTRA_OUTPUT,
  41. *来将用Camera获取到的图片存储在一个指定的URI位置处。
  42. *下面就指定image存储在SDCard上,并且文件名为123.jpg
  43. *imageFilePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"123.jpg";
  44. *Filefile=newFile(imageFilePath);//创建一个文件
  45. *UriimageUri=Uri.fromFile(file);
  46. *然而Android已经提供了一个多媒体库,那里统一存放了设备上所有的多媒体数据。所以,
  47. *我们可以将获取到的图片存放在那个多媒体库中。
  48. *Android提供了MediaStore类,该类是一个ContentProvider,管理着设备上自带的和外部的多媒体文件,
  49. *同时包含着每一个多媒体文件的数据信息。
  50. *为了将数据存储在多媒体库,使用ContentResolver对象来操纵MediaStore对象
  51. *在MediaStore.Images.Media中有两个URI常量,一个是EXTERNAL_CONTENT_URI,另一个是INTERNAL_CONTENT_URI
  52. *第一个URI对应着外部设备(SDCard),第二个URI对应着系统设备内部存储位置。
  53. *对于多媒体文件,一般比较大,我们选择外部存储方式
  54. *通过使用ContentResolver对象的insert方法我们可以向MediaStore中插入一条数据
  55. *这样在检索那张图片的时候,不再使用文件的路径,而是根据insert数据时返回的URI,获取一个InputStream
  56. *并传给BitmapFactory
  57. */
  58. //在这里启动Camera。
  59. //Camera中定义了一个Intent-Filter,其中Action是android.media.action.IMAGE_CAPTURE
  60. //我们使用的时候,最好不要直接使用这个,而是用MediaStore中的常量ACTION_IMAGE_CAPTURE.
  61. //这个常量就是对应的上面的action
  62. Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);
  63. //这里我们插入一条数据,ContentValues是我们希望这条记录被创建时包含的数据信息
  64. //这些数据的名称已经作为常量在MediaStore.Images.Media中,有的存储在MediaStore.MediaColumn中了
  65. //ContentValuesvalues=newContentValues();
  66. ContentValuesvalues=newContentValues(3);
  67. values.put(MediaStore.Images.Media.DISPLAY_NAME,"testing");
  68. values.put(MediaStore.Images.Media.DESCRIPTION,"thisisdescription");
  69. values.put(MediaStore.Images.Media.MIME_TYPE,"image/jpeg");
  70. imageFilePath=MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,values);
  71. intent.putExtra(MediaStore.EXTRA_OUTPUT,imageFilePath);
  72. //这样就将文件的存储方式和uri指定到了Camera应用中
  73. //由于我们需要调用完Camera后,可以返回Camera获取到的图片,
  74. //所以,我们使用startActivityForResult来启动Camera
  75. startActivityForResult(intent,RESULT_CODE);
  76. }
  77. });
  78. }
  79. /**
  80. *为了获取Camera返回的图片信息,重写该方法。
  81. */
  82. @Override
  83. publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){
  84. super.onActivityResult(requestCode,resultCode,data);
  85. if(resultCode==RESULT_CODE){
  86. //说明是由Camera返回的数据
  87. //由Camera应用返回的图片数据是一个Camera对象,存储在一个名为data的extra域
  88. //然后将获取到的图片存储显示在ImageView中
  89. try{
  90. Bundleextra=data.getExtras();
  91. /**
  92. *然而为了节约内存的消耗,这里返回的图片是一个121*162的缩略图。
  93. *那么如何返回我们需要的大图呢?看上面
  94. *然而存储了图片。有了图片的存储位置,能不能直接将图片显示出来呢》
  95. *这个问题就设计到对于图片的处理和显示,是非常消耗内存的,对于PC来说可能不算什么,但是对于手机来说
  96. *很可能使你的应用因为内存耗尽而死亡。不过还好,Android为我们考虑到了这一点
  97. *Android中可以使用BitmapFactory类和他的一个内部类BitmapFactory.Options来实现图片的处理和显示
  98. *BitmapFactory是一个工具类,里面包含了很多种获取Bitmap的方法。BitmapFactory.Options类中有一个inSampleSize,比如设定他的值为8,则加载到内存中的图片的大小将
  99. *是原图片的1/8大小。这样就远远降低了内存的消耗。
  100. *BitmapFactory.Optionsop=newBitmapFactory.Options();
  101. *op.inSampleSize=8;
  102. *Bitmappic=BitmapFactory.decodeFile(imageFilePath,op);
  103. *这是一种快捷的方式来加载一张大图,因为他不用考虑整个显示屏幕的大小和图片的原始大小
  104. *然而有时候,我需要根据我们的屏幕来做相应的缩放,如何操作呢?
  105. *
  106. */
  107. //首先取得屏幕对象
  108. Displaydisplay=this.getWindowManager().getDefaultDisplay();
  109. //获取屏幕的宽和高
  110. intdw=display.getWidth();
  111. intdh=display.getHeight();
  112. /**
  113. *为了计算缩放的比例,我们需要获取整个图片的尺寸,而不是图片
  114. *BitmapFactory.Options类中有一个布尔型变量inJustDecodeBounds,将其设置为true
  115. *这样,我们获取到的就是图片的尺寸,而不用加载图片了。
  116. *当我们设置这个值的时候,我们接着就可以从BitmapFactory.Options的outWidth和outHeight中获取到值
  117. */
  118. BitmapFactory.Optionsop=newBitmapFactory.Options();
  119. //op.inSampleSize=8;
  120. op.inJustDecodeBounds=true;
  121. //Bitmappic=BitmapFactory.decodeFile(imageFilePath,op);//调用这个方法以后,op中的outWidth和outHeight就有值了
  122. //由于使用了MediaStore存储,这里根据URI获取输入流的形式
  123. Bitmappic=BitmapFactory.decodeStream(this.getContentResolver().openInputStream(imageFilePath),null,op);
  124. intwRatio=(int)Math.ceil(op.outWidth/(float)dw);//计算宽度比例
  125. inthRatio=(int)Math.ceil(op.outHeight/(float)dh);//计算高度比例
  126. Log.v("WidthRatio:",wRatio+"");
  127. Log.v("HeightRatio:",hRatio+"");
  128. /**
  129. *接下来,我们就需要判断是否需要缩放以及到底对宽还是高进行缩放。
  130. *如果高和宽不是全都超出了屏幕,那么无需缩放。
  131. *如果高和宽都超出了屏幕大小,则如何选择缩放呢》
  132. *这需要判断wRatio和hRatio的大小
  133. *大的一个将被缩放,因为缩放大的时,小的应该自动进行同比率缩放。
  134. *缩放使用的还是inSampleSize变量
  135. */
  136. if(wRatio>1&&hRatio>1){
  137. if(wRatio>hRatio){
  138. op.inSampleSize=wRatio;
  139. }else{
  140. op.inSampleSize=hRatio;
  141. }
  142. }
  143. op.inJustDecodeBounds=false;
  144. //注意这里,一定要设置为false,因为上面我们将其设置为true来获取图片尺寸了
  145. pic=BitmapFactory.decodeStream(this.getContentResolver().openInputStream(imageFilePath),null,op);
  146. imageView.setImageBitmap(pic);
  147. }catch(Exceptione){
  148. e.printStackTrace();
  149. }
  150. }
  151. }
  152. }

更多相关文章

  1. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  2. android 笔记 --- 自定义Android主题风格theme.xml方法
  3. Android(安卓)利用Matrix实现图片随手指平移、旋转、缩放
  4. Android原生方式获取经纬度和城市信息
  5. Android中的Selector
  6. android之调用webservice 实现图片上传
  7. android系统信息(内存、cpu、sd卡、电量、版本)获取
  8. android获取设备唯一标识完美解决方案
  9. 两种特殊TabHost实现

随机推荐

  1. android 获取不同res下的资源id
  2. 关于下拉框的一些应用
  3. android之CheckBox和Radio
  4. Android(安卓)Camera 明细
  5. android 探索首选项框架 ListPreference
  6. Retrolambda 配置
  7. android如何获取经纬度
  8. android 申请map api
  9. android 6.0及以上危险权限的获取
  10. android事件分发机制一