如何在 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 中拍照、保存和获取照片的主要内容,如果未能解决你的问题,请参考以下文章