Java tutorial
/* * Copyright (c) 2014 Rex St. John on behalf of AirPair.com * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package camera; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.os.Environment; import android.provider.MediaStore; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; import com.example.pronote.R; /** * This is an example of a fragment which can use the external Android camera to take * a picture. It is important to remember to save the file URI where we want to save * our picture into the bundle because this data will be cleared when the camera is loaded. * The appropriate place to do this is in the Fragment's parent activity because there isn't a * good "entry" point when the fragment returns to the foreground to retrieve the bundle info. * * Reference: http://developer.android.com/training/camera/photobasics.html * * Created by Rex St. John (on behalf of AirPair.com) on 3/4/14. */ public class AnotherCamera extends Fragment implements Button.OnClickListener { // Activity result key for camera static final int REQUEST_TAKE_PHOTO = 11111; // Image view for showing our image. private ImageView mImageView; private ImageView mThumbnailImageView; /** * Default empty constructor. */ public AnotherCamera() { super(); } /** * Static factory method * @param sectionNumber * @return */ public static AnotherCamera newInstance(int sectionNumber) { AnotherCamera fragment = new AnotherCamera(); Bundle args = new Bundle(); args.putInt(ARG_SECTION_NUMBER, sectionNumber); fragment.setArguments(args); return fragment; } /** * OnCreateView fragment override * @param inflater * @param container * @param savedInstanceState * @return */ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = null; view = inflater.inflate(R.layout.fragment_simple_camera_intent, container, false); // Set the image view mImageView = (ImageView) view.findViewById(R.id.imageViewFullSized); mThumbnailImageView = (ImageView) view.findViewById(R.id.imageViewThumbnail); Button takePictureButton = (Button) view.findViewById(R.id.button); // Set OnItemClickListener so we can be notified on button clicks takePictureButton.setOnClickListener(this); return view; } /** * Start the camera by dispatching a camera intent. */ protected void dispatchTakePictureIntent() { // Check if there is a camera. Context context = getActivity(); PackageManager packageManager = context.getPackageManager(); if (packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) == false) { Toast.makeText(getActivity(), "This device does not have a camera.", Toast.LENGTH_SHORT).show(); return; } // Camera exists? Then proceed... Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // Ensure that there's a camera activity to handle the intent CameraActivity activity = (CameraActivity) getActivity(); if (takePictureIntent.resolveActivity(activity.getPackageManager()) != null) { // Create the File where the photo should go. // If you don't do this, you may get a crash in some devices. File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) { // Error occurred while creating the File Toast toast = Toast.makeText(activity, "There was a problem saving the photo...", Toast.LENGTH_SHORT); toast.show(); } // Continue only if the File was successfully created if (photoFile != null) { Uri fileUri = Uri.fromFile(photoFile); activity.setCapturedImageURI(fileUri); activity.setCurrentPhotoPath(fileUri.getPath()); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, activity.getCapturedImageURI()); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); } } } /** * The activity returns with the photo. * @param requestCode * @param resultCode * @param data */ @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == REQUEST_TAKE_PHOTO && resultCode == Activity.RESULT_OK) { addPhotoToGallery(); CameraActivity activity = (CameraActivity) getActivity(); // Show the full sized image. setFullImageFromFilePath(activity.getCurrentPhotoPath(), mImageView); setFullImageFromFilePath(activity.getCurrentPhotoPath(), mThumbnailImageView); } else { Toast.makeText(getActivity(), "Image Capture Failed", Toast.LENGTH_SHORT).show(); } } /** * Creates the image file to which the image must be saved. * @return * @throws IOException */ protected File createImageFile() throws IOException { // Create an image file name String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); File image = File.createTempFile(imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); // Save a file: path for use with ACTION_VIEW intents CameraActivity activity = (CameraActivity) getActivity(); activity.setCurrentPhotoPath("file:" + image.getAbsolutePath()); return image; } /** * Add the picture to the photo gallery. * Must be called on all camera images or they will * disappear once taken. */ protected void addPhotoToGallery() { Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); CameraActivity activity = (CameraActivity) getActivity(); File f = new File(activity.getCurrentPhotoPath()); Uri contentUri = Uri.fromFile(f); mediaScanIntent.setData(contentUri); this.getActivity().sendBroadcast(mediaScanIntent); } /** * Deal with button clicks. * @param v */ @Override public void onClick(View v) { dispatchTakePictureIntent(); } /** * Scale the photo down and fit it to our image views. * * "Drastically increases performance" to set images using this technique. * Read more:http://developer.android.com/training/camera/photobasics.html */ private void setFullImageFromFilePath(String imagePath, ImageView imageView) { // Get the dimensions of the View int targetW = imageView.getWidth(); int targetH = imageView.getHeight(); // Get the dimensions of the bitmap BitmapFactory.Options bmOptions = new BitmapFactory.Options(); bmOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(imagePath, 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(imagePath, bmOptions); imageView.setImageBitmap(bitmap); } }