拍照并保存到SD卡

时间:2015-04-14 09:02:59

标签: java android android-fragments

我正在尝试开发一个应用程序,您可以在其中拍照,然后在屏幕上显示它们或从SD卡上传图片并在屏幕上显示。目前我是应用程序上传并在屏幕上显示它但是当我选择拍照时我可以拍照并点击保存,但是,照片不会显示在屏幕上也不会保存到SD卡。请帮忙!

public class UploadActivity extends Fragment {

    private Button bt_browse;
    private ImageView iv_photo;
    private int REQUEST_CAMERA = 0, SELECT_FILE = 1;
    private String uploadImagePath = "";

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.upload,
                container, false);
        bt_browse = (Button) rootView.findViewById(R.id.button1);
        iv_photo = (ImageView) rootView.findViewById(R.id.iv_photo);


        bt_browse.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                selectImage();
            }
        });



        return rootView;

    }



    private void selectImage() {
        final CharSequence[] items = { "Take Photo", "Choose from Library",
                "Cancel" };

        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setTitle("Select Photo!");
        builder.setItems(items, new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int item) {
                if (items[item].equals("Take Photo")) {
                    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                    File f = new File(android.os.Environment
                            .getExternalStorageDirectory(), "temp.jpg");
                    intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
                    startActivityForResult(intent, REQUEST_CAMERA);
                } else if (items[item].equals("Choose from Library")) {
                    Intent intent = new Intent(
                            Intent.ACTION_PICK,
                            android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                    intent.setType("image/*");
                    startActivityForResult(
                            Intent.createChooser(intent, "Select File"), SELECT_FILE);
                } else if (items[item].equals("Cancel")) {
                    dialog.dismiss();
                }
            }
        });
        builder.show();
    }


    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == REQUEST_CAMERA) {
                File f = new File(Environment.getExternalStorageDirectory()
                        .toString());
                for (File temp : f.listFiles()) {
                    if (temp.getName().equals("temp.jpg")) {
                        f = temp;
                        break;
                    }
                }
                try {
                    Bitmap bm;
                    BitmapFactory.Options btmapOptions = new BitmapFactory.Options();

                    bm = BitmapFactory.decodeFile(f.getAbsolutePath(), btmapOptions);

                    bm = Bitmap.createScaledBitmap(bm, 70, 70, true);
                    iv_photo.setImageBitmap(bm);
                    uploadImagePath = f.getAbsolutePath();

                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else if (requestCode == SELECT_FILE) {
                Uri selectedImageUri = data.getData();

                String tempPath = getPath(selectedImageUri, getActivity());
                Bitmap bm;
                BitmapFactory.Options btmapOptions = new BitmapFactory.Options();
                bm = BitmapFactory.decodeFile(tempPath, btmapOptions);
                iv_photo.setImageBitmap(bm);
                uploadImagePath = tempPath;

            }
        }
    }

    @SuppressWarnings("deprecation")
    public String getPath(Uri uri, Activity activity) {
        String[] projection = { MediaColumns.DATA };
        Cursor cursor = activity.managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
        cursor.moveToFirst();
        return cursor.getString(column_index);

    }



    }

我还将以下代码添加到清单文件

<uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />

3 个答案:

答案 0 :(得分:1)

我使用以下方法处理此场景:

private void getImageFromCamera() {
    Log.i("GalaNotes", "From CAMERA Setting Capture TRUE");
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(), "tmp_avatar_"
            + String.valueOf(System.currentTimeMillis()) + ".jpg"));
    intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
    try {
        intent.putExtra("return-data", true);
        startActivityForResult(intent, PICK_FROM_CAMERA);
    } catch (ActivityNotFoundException e) {
        e.printStackTrace();
    }
}

private void getImageFromGallery() {
    Log.i("GalaNotes", "From Gallery Setting Capture TRUE");
    Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, PICK_FROM_FILE);
}

在onActivityResult()方法中,您可以按如下方式打印存储它的Uri或路径:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    switch (requestCode) {

case PICK_FROM_CAMERA:


        try {

        log.i("Stored location of File",getRealPathFromURI(mImageCaptureUri));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        break;



case PICK_FROM_FILE:
        mImageCaptureUri = data.getData();
        Log.d("PHOTO", "" + mImageCaptureUri.toString()); // UPLOAD FEEDS
        // RESPONSE
        // doCrop();
        Intent i = new Intent(activity, CropActivity.class);

        try {

            i.putExtra("imgSdcardPath", getRealPathFromURI(mImageCaptureUri));// mImageCaptureUri.toString());
            startActivityForResult(i, 212);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        break;

}}

如果您有任何查询,请在我的帖子上提供反馈。

答案 1 :(得分:0)

尝试standart wayonActivityResult获取照片:

Bitmap imageBitmap = (Bitmap) data.getExtras().get("data");

答案 2 :(得分:0)

// Global Declaration 
Intent intent;
String imageFileName,videoFileName;
Uri uri;

private void clickPhotoFromCamera() {
    intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    imageFileName = "JPEG_" + timeStamp + ".jpg";
    File imageStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), imageFileName);
    uri = Uri.fromFile(imageStorageDir);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, 1);

}

private void captureVideoFromCamera() {
    intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    videoFileName = "VID_" + timeStamp + ".mp4";
    File videoStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM), videoFileName);
    uri = Uri.fromFile(videoStorageDir);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
    startActivityForResult(intent, 2);
}

private void uploadMediaFromGallery() {
    intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    intent.setType("image/* video/*");
    startActivityForResult(intent, 3);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK) {
        if (requestCode == 1) {
            imagePath = uri.getPath();
            // Do whatever you want with image path...
        } else if (requestCode == 2) {
            videoPath = uri.getPath();
            // Do whatever you want with Video path...
        } else {
            uri = data.getData();
            mediaPath = getPath(getApplicationContext(), uri);

        }
    }
}


//从路径中获取图片或视频......

File mediaFile = new File(mediaPath);
        Bitmap bitmap;
        if (mediaFile.exists()) {

            if (isImage(mediaPath)) {

                Bitmap myBitmap = BitmapFactory.decodeFile(mediaFile.getAbsolutePath());
                int height = (myBitmap.getHeight() * 512 / myBitmap.getWidth());
                Bitmap scale = Bitmap.createScaledBitmap(myBitmap, 512, height, true);
                int rotate = 0;
                try {
                    exif = new ExifInterface(mediaFile.getAbsolutePath());
                } catch (IOException e) {
                    e.printStackTrace();
                }
                int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
                switch (orientation) {
                case ExifInterface.ORIENTATION_NORMAL:
                    rotate = 0;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_270:
                    rotate = 270;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_180:
                    rotate = 180;
                    break;
                case ExifInterface.ORIENTATION_ROTATE_90:
                    rotate = 90;
                    break;
                }

                Matrix matrix = new Matrix();
                matrix.postRotate(rotate);
                Bitmap rotateBitmap = Bitmap.createBitmap(scale, 0, 0, scale.getWidth(), scale.getHeight(), matrix, true);
                displayImage.setImageBitmap(rotateBitmap);

            } else {

                bitmap = ThumbnailUtils.createVideoThumbnail(mediaPath, Thumbnails.MICRO_KIND);
                displayImage.setImageBitmap(bitmap);

            }
        }
public static boolean isImage(String str) {
        boolean temp = false;
        String[] arr = { ".jpeg", ".jpg", ".png", ".bmp", ".gif" };
        for (int i = 0; i < arr.length; i++) {
            temp = str.endsWith(arr[i]);
            if (temp) {
                break;
            }
        }
        return temp;
    }
相关问题