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

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

有人有示例代码吗?

【问题讨论】:

  • 你还做了什么?
  • 关于这个问题有大约 100 种不同的主题......只需搜索它!

标签: android android-intent bitmap uri android-camera


【解决方案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") 是获取缩略图的方式
  • 有谁知道如何获取全尺寸图像?我真的很想知道。我已经在 stackoverflow 线程中搜索了一段时间,并且只在这些 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.stackoverflow;
      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_width="fill_parent"
          android:layout_height="fill_parent"
          android:orientation="vertical" >
      
          <Button
              android:id="@+id/button1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:text="photo" >
          </Button>
      
          <ImageView
              android:id="@+id/imageView1"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:src="@drawable/ic_action_search" >
          </ImageView>
      
      </LinearLayout>
      

      【讨论】:

        猜你喜欢
        • 2013-01-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        相关资源
        最近更新 更多