如何在 Android 中拍照、保存和获取照片

Posted

技术标签:

【中文标题】如何在 Android 中拍照、保存和获取照片【英文标题】:How to take a photo, save it and get the photo in Android 【发布时间】:2012-12-18 17:05:38 【问题描述】:

我一直在搜索拍摄照片的简单示例,并使用 URI 保存并检索照片以进行图像处理, 我尝试了很多示例代码,但没有一个能顺利进行。

有人有示例代码吗?

【问题讨论】:

你还做了什么? 关于这个问题有大约 100 种不同的主题......只需搜索它! 【参考方案1】:

像这样定义一个变量

protected static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 0;

使用代码从android调用相机。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"fname_" +        
                        String.valueOf(System.currentTimeMillis()) + ".jpg"));
intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);

并在调用它的类中重写 onActivityResult 函数并输入下面的代码。

protected void onActivityResult(int requestCode, int resultCode, Intent data) 

    if (resultCode == RESULT_OK) 
        if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) 

            //use imageUri here to access the image

            Bundle extras = data.getExtras();

            Log.e("URI",imageUri.toString());

            Bitmap bmp = (Bitmap) extras.get("data");

            // here you will get the image as bitmap


         
          else if (resultCode == RESULT_CANCELED) 
            Toast.makeText(this, "Picture was not taken", Toast.LENGTH_SHORT);
            
         


    

【讨论】:

您是否意识到,使用您提供的代码,您正在将完整尺寸的图像保存到规定的 uri,但是,您正在从附加文件中检索缩小尺寸的图像,并从那个缩小尺寸的图片? 我正在从 uri 中检索完整尺寸的图像。你想要缩小图像吗 @paulkayuk 我如何检索全尺寸图像而不是压缩图像? Bitmap bmp = (Bitmap) extras.get("data") 是获取缩略图的方式 有谁知道如何获取全尺寸图像?我真的很想知道。我已经在 *** 线程中搜索了一段时间,并且只在这些 7 岁的线程中出现了同样的问题而没有任何响应......【参考方案2】:

有几个例子可以捕获图像并将其存储并打开它......

1. Android Camera API - Tutorial

2. Android Developers

3. Camera Example on Github

4. Another Example

【讨论】:

【参考方案3】:

我遇到了同样的问题。

我正在测试互联网上的一些代码,但找不到任何代码。然后,我从 developer.android 学习了一些基础代码。之后,我混合了两种不同的代码,我的一个工作了!来了!

public class MainActivity extends AppCompatActivity 

    static final int PICTURE_RESULT = 1;
    String mCurrentPhotoPath;
    ContentValues values;
    private Uri file;
    ImageView imageView;
    Bitmap help1;

    ThumbnailUtils thumbnail;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.imageView);
        values = new ContentValues();
    

    public void launch_camera(View v) 
        // the intent is my camera
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        //getting uri of the file
        file = Uri.fromFile(getFile());

        //Setting the file Uri to my photo
        intent.putExtra(MediaStore.EXTRA_OUTPUT,file);

        if(intent.resolveActivity(getPackageManager())!=null)
        
            startActivityForResult(intent, PICTURE_RESULT);
        
    

    //this method will create and return the path to the image file
    private File getFile() 
        File folder = Environment.getExternalStoragePublicDirectory("/From_camera/imagens");// the file path

        //if it doesn't exist the folder will be created
        if(!folder.exists())
        folder.mkdir();

        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = "JPEG_"+ timeStamp + "_";
        File image_file = null;

        try 
            image_file = File.createTempFile(imageFileName,".jpg",folder);
         catch (IOException e) 
            e.printStackTrace();
        

        mCurrentPhotoPath = image_file.getAbsolutePath();
        return image_file;
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if(requestCode == PICTURE_RESULT) 
            if(resultCode == Activity.RESULT_OK) 
                try 
                    help1 = MediaStore.Images.Media.getBitmap(getContentResolver(),file);
                    imageView.setImageBitmap( thumbnail.extractThumbnail(help1,help1.getWidth(),help1.getHeight()));
                catch (Exception e)
                    e.printStackTrace(); 
                
            
        
    

XML 文件只有一个 Button 和一个 ImageView 并且不要忘记在你的 android manifest 中声明权限:

<uses-feature android:name="android.hardware.camera"    android:required="true" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"  />

更多信息建议: https://developer.android.com/training/camera/photobasics.html#TaskPhotoView https://www.youtube.com/watch?v=je9bdkdNQqg

【讨论】:

【参考方案4】:

请使用以下代码。

package com.example.***;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.math.BigInteger;
import java.security.SecureRandom;

import android.app.Activity;
import android.content.Intent;
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.view.View;
import android.widget.Button;
import android.widget.GridView;
import android.widget.ImageView;

public class MyCameraActivity extends Activity 
    private static final int CAMERA_REQUEST = 1888; 



    static String str_Camera_Photo_ImagePath = "";
    private static File f;
    private static int Take_Photo = 2;
    private static String str_randomnumber = "";
    static String str_Camera_Photo_ImageName = "";
    public static String str_SaveFolderName;
    private static File wallpaperDirectory;
    Bitmap bitmap;
    int storeposition = 0;
    public static GridView gridview;
    public static ImageView imageView;



    @Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ccccc);
        this.imageView = (ImageView)this.findViewById(R.id.imageView1);
        Button photoButton = (Button) this.findViewById(R.id.button1);
        photoButton.setOnClickListener(new View.OnClickListener() 

            @Override
            public void onClick(View v) 
                str_SaveFolderName = Environment
                        .getExternalStorageDirectory()
                        .getAbsolutePath()
                        + "/rajeshsample";
                str_randomnumber = String.valueOf(nextSessionId());
                wallpaperDirectory = new File(str_SaveFolderName);
                if (!wallpaperDirectory.exists())
                    wallpaperDirectory.mkdirs();
                str_Camera_Photo_ImageName = str_randomnumber
                        + ".jpg";
                str_Camera_Photo_ImagePath = str_SaveFolderName
                        + "/" + str_randomnumber + ".jpg";
                System.err.println(" str_Camera_Photo_ImagePath  "
                        + str_Camera_Photo_ImagePath);
                f = new File(str_Camera_Photo_ImagePath);
                startActivityForResult(new Intent(
                        MediaStore.ACTION_IMAGE_CAPTURE).putExtra(
                        MediaStore.EXTRA_OUTPUT, Uri.fromFile(f)),
                        Take_Photo);
                System.err.println("f  " + f);
            
        );
    


    // used to create randon numbers
    public String nextSessionId() 
        SecureRandom random = new SecureRandom();
        return new BigInteger(130, random).toString(32);
    


    protected void onActivityResult(int requestCode, int resultCode, Intent data)   
        if (requestCode == Take_Photo) 
            String filePath = null;

            filePath = str_Camera_Photo_ImagePath;
            if (filePath != null) 
                Bitmap faceView = ( new_decode(new File(
                                filePath))); // ========================> good
                                                // lines



                imageView.setImageBitmap(faceView);

             else 
                bitmap = null;
            
        
     

    public static Bitmap new_decode(File f) 

        // decode image size

        BitmapFactory.Options o = new BitmapFactory.Options();
        o.inJustDecodeBounds = true;
        o.inDither = false; // Disable Dithering mode

        o.inPurgeable = true; // Tell to gc that whether it needs free memory,
                                // the Bitmap can be cleared

        o.inInputShareable = true; // Which kind of reference will be used to
                                    // recover the Bitmap data after being
                                    // clear, when it will be used in the future
        try 
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);
         catch (FileNotFoundException e1) 
            // TODO Auto-generated catch block
            e1.printStackTrace();
        

        // Find the correct scale value. It should be the power of 2.
        final int REQUIRED_SIZE = 300;
        int width_tmp = o.outWidth, height_tmp = o.outHeight;
        int scale = 1;
        while (true) 
            if (width_tmp / 1.5 < REQUIRED_SIZE && height_tmp / 1.5 < REQUIRED_SIZE)
                break;
            width_tmp /= 1.5;
            height_tmp /= 1.5;
            scale *= 1.5;
        

        // decode with inSampleSize
        BitmapFactory.Options o2 = new BitmapFactory.Options();
        // o2.inSampleSize=scale;
        o.inDither = false; // Disable Dithering mode

        o.inPurgeable = true; // Tell to gc that whether it needs free memory,
                                // the Bitmap can be cleared

        o.inInputShareable = true; // Which kind of reference will be used to
                                    // recover the Bitmap data after being
                                    // clear, when it will be used in the future
        // return BitmapFactory.decodeStream(new FileInputStream(f), null, o2);
        try 

//          return BitmapFactory.decodeStream(new FileInputStream(f), null,
//                  null);
            Bitmap bitmap= BitmapFactory.decodeStream(new FileInputStream(f), null, null);
            System.out.println(" IW " + width_tmp);
            System.out.println("IHH " + height_tmp);           
               int iW = width_tmp;
                int iH = height_tmp;

               return Bitmap.createScaledBitmap(bitmap, iW, iH, true);

         catch (OutOfMemoryError e) 
            // TODO: handle exception
            e.printStackTrace();
            // clearCache();

            // System.out.println("bitmap creating success");
            System.gc();
            return null;
            // System.runFinalization();
            // Runtime.getRuntime().gc();
            // System.gc();
            // decodeFile(f);
         catch (FileNotFoundException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
            return null;
        

    


XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical" >

    <Button
        android:id="@+id/button1"
        android:layout_
        android:layout_
        android:text="photo" >
    </Button>

    <ImageView
        android:id="@+id/imageView1"
        android:layout_
        android:layout_
        android:src="@drawable/ic_action_search" >
    </ImageView>

</LinearLayout>

【讨论】:

以上是关于如何在 Android 中拍照、保存和获取照片的主要内容,如果未能解决你的问题,请参考以下文章

Android笔记67Android之使用系统中的相机功能(拍照保存照片显示拍摄的照片照片保存到图库等操作)

Android:如何调用相机[重复]

如何在不保存/显示图像的情况下拍照

Android开发之获取相册照片和获取拍照照片

如何使用 Cordova 相机插件拍摄多张照片

如何拍照并同时保存(swift3)