这节课会介绍如何利用现有的camera程序来拍一张照片。
假设你想通过你的客户端程序实现一个聚合全球天气的地图,上面会有各地的当前天气图片。那么集合图片只是你程序的一部分。你想要最简单的动作来获取图片,而不是重新发明(reinvent)一个camera。幸运的是,大多数Android设备都已经至少安装了一款相机程序。在这节课中,你会学习,如何拍照。[晕,说了这么多的话做引子,下次遇到这样的“废话”真的不想翻译了]
<manifest ... > <uses-feature android:name="android.hardware.camera" /> ... </manifest ... >如果你的程序并不需要一定有Camera,可以添加
android:required="false"
的tag属性。这样的话,Google Play 也会允许没有camera的设备下载这个程序。当然你有必要在使用Camera之前通过
hasSystemFeature(PackageManager.FEATURE_CAMERA)
方法来检查设备上是否有Camera。如果没有,你应该关闭你的Camera相关的功能!
[这个几乎没有人去做检查,因为目前所有的智能手机都会有相机]
Android中的方法是:启动一个Intent来完成你想要的动作。这个步骤包含三部分: Intent
本身,启动的外部 Activity
, 与一些处理返回照片的代码。如:
private void dispatchTakePictureIntent(int actionCode) { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(takePictureIntent, actionCode); }当然在发出Intent之前,你需要检查是否有app会来handle这个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; }
Intent
当中, 对应的key为data。
private void handleSmallCameraPhoto(Intent intent) { Bundle extras = intent.getExtras(); mImageBitmap = (Bitmap) extras.get("data"); mImageView.setImageBitmap(mImageBitmap); }Note: 这仅仅是处理一张很少的缩略图而已,如果是大的全图,需要做更多的事情来避免ANR。
storageDir = new File( Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_PICTURES ), getAlbumName() );
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
.
File f = createImageFile(); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
对于大多数人来说,最简单查看你的照片的方式是通过系统的Media Provider。下面会演示如何触发系统的Media Scanner来添加你的照片到Media Provider的DB中,这样使得相册程序与其他程序能够读取到那些图片。
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); }
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); }
学习自:http://developer.android.com/training/camera/photobasics.html,欢迎一起交流!
转载请注明出自:http://blog.csdn.net/kesenhoo,谢谢!