要拍摄照片,首先我们需要在中声明所需的权限AndroidManifest.xml。我们需要两个权限:
Camera-打开相机应用。如果属性required设置为true,则如果您没有硬件摄像头,则将无法安装此应用程序。
WRITE_EXTERNAL_STORAGE -创建新文件需要此权限,该文件将保存捕获的照片。
<uses-feature android:name="android.hardware.camera" android:required="true" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
从相机拍摄全尺寸照片的主要想法是,在打开相机应用程序并捕获照片之前,我们需要为照片创建新文件。
private void dispatchTakePictureIntent() { Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 确保有摄影机活动来处理意图 if (takePictureIntent.resolveActivity(getPackageManager()) != null) { // 创建文件应放在照片所在的位置 File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { Log.e("DEBUG_TAG", "createFile", ex); } // 仅在成功创建文件后继续 if (photoFile != null) { takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } } } private File createImageFile() throws IOException { // 创建图像文件名 String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = getAlbumDir(); File image = File.createTempFile( imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // 保存文件:用于ACTION_VIEW意向的路径 mCurrentPhotoPath = image.getAbsolutePath(); return image; } private File getAlbumDir() { File storageDir = null; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { storageDir = new File(Environment.getExternalStorageDirectory() + "/dcim/" + "MyRecipes"); if (!storageDir.mkdirs()) { if (!storageDir.exists()) { Log.d("CameraSample", "failed to create directory"); return null; } } } else { Log.v(getString(R.string.app_name), "External storage is not mounted READ/WRITE."); } return storageDir; } private void setPic() { /* There isn't enough memory to open up more than a couple camera photos */ /* So pre-scale the target bitmap into which the file is decoded */ /* Get the size of the ImageView */ int targetW = recipeImage.getWidth(); int targetH = recipeImage.getHeight(); /* Get the size of the image */ BitmapFactory.OptionsbmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds= true; BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); int photoW = bmOptions.outWidth; int photoH = bmOptions.outHeight; /* Figure out which way needs to be reduced less */ int scaleFactor = 2; if ((targetW > 0) && (targetH > 0)) { scaleFactor = Math.max(photoW / targetW, photoH / targetH); } /* Set bitmap options to scale the image decode target */ bmOptions.inJustDecodeBounds= false; bmOptions.inSampleSize= scaleFactor; bmOptions.inPurgeable= true; Matrix matrix = new Matrix(); matrix.postRotate(getRotation()); /* Decode the JPEG file into a Bitmap */ Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions); bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, false); /* Associate the Bitmap to the ImageView */ recipeImage.setImageBitmap(bitmap); } private float getRotation() { try { ExifInterface ei = new ExifInterface(mCurrentPhotoPath); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: return 90f; case ExifInterface.ORIENTATION_ROTATE_180: return 180f; case ExifInterface.ORIENTATION_ROTATE_270: return 270f; default: return 0f; } } catch (Exception e) { Log.e("Add Recipe", "getRotation", e); return 0f; } } 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); sendBroadcast(mediaScanIntent); } private void handleBigCameraPhoto() { if (mCurrentPhotoPath != null) { setPic(); galleryAddPic(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == Activity.RESULT_OK) { handleBigCameraPhoto(); } }