Android Developers:简单的拍照

翻译 2013年12月06日 09:51:14

这个课程说明如何使用一个已存在的相机程序来捕捉照片 

 

假设你实现了一个众包的天气服务,它让一个全球的天气地图和由设备运行你的客户端程序拍摄的天空照片结合。结合照片仅仅是你的应用程序的一小部分。你想拍照用最小的烦恼,不重新开发照相机。幸运的是,大多数Android设备已经按照了至少一个照相机应用程序。在这个课程,你将会学习如何使用它给你拍照片。 

 

请求照相机权限 

———————————————————————————————————————————————————————————————— 

如果你的应用程序的基本功能是拍照,然后再Google Play对于有照相机的设备限制它的可见性。为了告知你的应用程序基于一个相机,在你的清单文件中放置一个<uses-feature>标识 

<manifest ... > 
   <uses-feature android:name="android.hardware.camera" /> 
   ... 
</manifest ... > 
如果你的应用程序使用,但是为了运行不要求一个相机,在标签中添加android:required=”false”。在这种情况下,Google Play将允许没有照相机的设备下载你的应用程序。这是你的职责,通过调用hasSystemFeature(PackageManager.FEATURE_CAMERA)方法在运行时检查相机功能。如果一个相机是不可用的,然后你应该禁止你的相机功能 

 

使用相机应用拍照 

———————————————————————————————————————————————————————————————— 

Android委派动作给其它应用程序的方式是调用一个Intent,它描述你想要做什么。这个过程包含三部分:这个Intent自己,一个调用启动外部Activity,和要求返回你的Activity的时候一些处理图片数据的代码。 

 

这里是一个功能,调用一个Intent在捕捉相片 

private void dispatchTakePictureIntent(int actionCode) { 
   Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
   startActivityForResult(takePictureIntent, actionCode); 
} 
恭喜:使用这个代码,你的应用程序获取了是其它相机应用程序为你服务的能力!当然,如果没有合适的应用程序准备捕获这个Intent,那么你的 应用程序将会崩溃。下面是一个功能,检查是否有一个应用程处理你的Intent 

public static boolean isIntentAvailable(Context context, String action) { 
   final PackageManager packageManager = context.getPackageManager(); 
   final Intent intent = new Intent(action); 
   List<ResolveInfo> list = 
           packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
   return list.size() > 0; 
} 
 

查看照片 

———————————————————————————————————————————————————————————————— 

如果简单的拍摄照片的能力不是你的应用程序的最终目的,那么你获取想从这个相机应用程序获取照片,并做些什么 

 

Android相机应用个程序在返回的Intent中编码这个相片,作为一个小的位图附件分发给onActivityResult()方法。在“data”关键字之下。下面的代码获取这个照片,并在 一个ImageView中显示 

private void handleSmallCameraPhoto(Intent intent) { 
   Bundle extras = intent.getExtras(); 
   mImageBitmap = (Bitmap) extras.get("data"); 
   mImageView.setImageBitmap(mImageBitmap); 
} 
注意:从”data“获取的极小的图片可能适合用作一个图标,但是不是很多,处理一个全尺寸的图片需要更多的工作 

 

保存图片 
————————————————————————————————————————————————————————————————

Android相机应用程序保存一个完整大小的图片,如果你给它一个文件来保存。你必须提供一个路径,它包含存储空间,文件夹,和文件名。 

 

这里是一个简单的方式来为相片获取路径,但是它仅仅工作在Android2.2(API level 8)和更晚的平台 

storageDir = new File( 
   Environment.getExternalStoragePublicDirectory( 
       Environment.DIRECTORY_PICTURES 
   ),  
   getAlbumName() 
);  
对于更早的API级别,你必须自己提供相片目录的名字 

storageDir = new File ( 
   Environment.getExternalStorageDirectory() 
       + PICTURES_DIR 
       + getAlbumName() 
); 
注意:路径的组件PICTURES_DIR仅仅是Pictures/,在外部/共享存储标准的共享照片路径 

 

设置文件名 

———————————————————————————————————————————————————————————————— 

如前面的章节显示的,图片文件的位置应该有具体的设备环境决定。你自己需要做的是选择一个抗突发性的文件命名策略。你可能也希望在一个成员保量中保存路径给以后使用。这里是一个解决案例: 

private File createImageFile() throws IOException { 
   // Create an image file name 
   String timeStamp =  
       new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
   String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
   File image = File.createTempFile( 
       imageFileName,  
       JPEG_FILE_SUFFIX,  
       getAlbumDir() 
   ); 
   mCurrentPhotoPath = image.getAbsolutePath(); 
   return image; 
}  

在Intent中追加文件名 

———————————————————————————————————————————————————————————————— 

一旦你有一个地方在保存你的图片,通过Intent传递给照相机应用程序这个位置 

File f = createImageFile(); 
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)); 

 

在一个画廊中添加照片 

————————————————————————————————————————————— 

当你通过一个Intent创建一个照片的时候,你应该知道你的照片被放在什么位置,因为你说了在哪里首先保存它。对于其它人,可能更早使你的照片可访问的方式是,使它系统的Media Provider可访问 

 

下面例子方法演示了如何调用系统的媒体扫描器来将你的照片添加到Media Provider的数据库中,使它在Android的画廊应用程序和其它应用程序中有效 

private void galleryAddPic() { 
   Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); 
   File f = new File(mCurrentPhotoPath); 
   Uri contentUri = Uri.fromFile(f); 
   mediaScanIntent.setData(contentUri); 
   this.sendBroadcast(mediaScanIntent); 
} 

 

编码一个缩放的图片 

—————————————————————————————————————————————— 

管理多个完整大小的图片会是先限制的内存大小变得棘手。如果你发现你的应用程序在仅仅显示一些图片的时候就耗尽内存,你能通过将已经缩放匹配目标视图大小的JPEG图片到一个内存数组中,来显著减少动态栈使用。下面的例子方法演示了这个技术: 

private void setPic() { 
   // Get the dimensions of the View 
   int targetW = mImageView.getWidth(); 
   int targetH = mImageView.getHeight(); 
  
   // Get the dimensions of the bitmap 
   BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
   bmOptions.inJustDecodeBounds = true; 
   BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
   int photoW = bmOptions.outWidth; 
   int photoH = bmOptions.outHeight; 
  
   // Determine how much to scale down the image 
   int scaleFactor = Math.min(photoW/targetW, photoH/targetH); 
  
   // Decode the image file into a Bitmap sized to fill the View 
   bmOptions.inJustDecodeBounds = false; 
   bmOptions.inSampleSize = scaleFactor; 
   bmOptions.inPurgeable = true; 
  
   Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); 
   mImageView.setImageBitmap(bitmap); 
} 

新技术,新未来!欢迎大家关注“1024工场”微信服务号,时刻关注我们的最新的技术讯息!(甭客气!尽情的扫描或者长按!)

简单的android 拍照程序

  • 2011年09月15日 14:02
  • 358KB
  • 下载

Android调用系统相机拍照,并且模仿实现水印相机简单功能

话说最近比较流行水印相机,动不动空间就会用水印相机拍水印照片,本人也比较喜欢,正好今天下午有点时间,就稍微模拟的实现了一下简单功能,不喜勿喷哦~作为学习交流的。      我这边的实现的步骤是通过代码...

Android 简单的实现拍照和录像

对于Android实现简单拍照和录像其实也是挺简单的代码不复杂主要的是添加在嵌套文件添加权限,这是个小细节但也是很关键的 权限弄好了写完后代码后那就可以简单的实现这些功能了预览效果图就不上了先上拍照的...

android 拍照及录视频简单的实例

拍照实现步骤: 界面使用SurfaceView控件,显示照相机的画面 SurfaceView接受摄像头界面变化的信息 surfaceView.getHolder(...

Android之简单的拍照功能

canarapackage zking.com.g150825_android_playvideo; import android.app.Activity; import android.grap...

Android调用系统相机拍照,并且模仿实现水印相机简单功能

      摘要:Android调用系统相机拍照,并且模仿实现水印相机简单功能 话说最近比较流行水印相机,动不动空间就会用水印相机拍水印照片,本人也比较喜欢,正好今天下午有点时间,...

Android学习之简单的拍照功能

本博客源码:Android学习之简单的拍照功能 http://download.csdn.net/detail/bq1073100909/7721211 本代码里面有详细注释,就不再进行讲...

android获取相册照片和获取拍照照片并做简单剪裁

在Android的开发过程中,我们可能会读取手机里面的照片或者通过相机拍摄获取照片,这是两种常用的获取图片的方式,在做项目过程中也会经常遇到,下面来介绍一下这两种获取方式.. 1.从本地相册获取...
  • fngy123
  • fngy123
  • 2014年12月31日 21:14
  • 1495

Android自动化基础—简单例子(启动相机拍照-重复执行1000次)

一个简单的测试需求如下:     测试相机的过程中发现一极低概率性问题,在进入相机拍照后退出的过程中相机可能会crash,概率大概为千分之一。 相机的使用场景相当的平凡,所以千分之一(0.001)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Developers:简单的拍照
举报原因:
原因补充:

(最多只允许输入30个字)