android 设备相机拍照保存手动android自定义照相机片名

Android&调用系统相机拍照保存以及调用系统相册的方法
android手机有自带的照相机和图库,我们做的项目中有时用到上传图片到服务器,今天做了一个项目用到这个功能,所以把我的代码记录下来和大家分享,有需求的朋友可以参考下。
(1)调用android相机拍照:
Intent intent = new
Intent(MediaStore.ACTION_IMAGE_CAPTURE);//调用android自带的照相机
photoUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
startActivityForResult(intent, RESULT_LOAD_IMAGE);
(2)调用Android图库获取图片:
Intent i = new Intent(Intent.ACTION_PICK,
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//调用android的图库
startActivityForResult(i, RESULT_LOAD_IMAGE+1);
注意:这里要传一个整形的常量RESULT_LOAD_IMAGE到startActivityForResult()方法。
(3) 重写onActivityResult方法,处理不同的返回结果:
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
//完成照相后回调用此方法
super.onActivityResult(requestCode, resultCode, data);
if(data == null){}
switch(requestCode ){
case RESULT_LOAD_IMAGE :
switch (resultCode) {
case Activity.RESULT_OK://照相完成点击确定
String sdStatus = Environment.getExternalStorageState();
if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { //
检测sd是否可用
Log.v("TestFile", "SD card is not avaiable/writeable right
Bundle bundle = data.getExtras();
Bitmap bitmap = (Bitmap) bundle.get("data");//
获取相机返回的数据,并转换为Bitmap图片格式
FileOutputStream b =
File file = new File("/sdcard/pk4fun/");
file.mkdirs();// 创建文件夹,名称为pk4fun //
照片的命名,目标文件夹下,以当前时间数字串为名称,即可确保每张照片名称不相同。网上流传的其他Demo这里的照片名称都写死了,则会发生无论拍照多少张,后一张总会把前一张照片覆盖。细心的同学还可以设置这个字符串,比如加上“IMG”字样等;然后就会发现sd卡中myimage这个文件夹下,会保存刚刚调用相机拍出来的照片,照片名称不会重复。
String str =
Date date =
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");//
获取当前时间,进一步转化为字符串
date = new Date(resultCode);
str = format.format(date);
String fileName = "/sdcard/myImage/" + str + ".jpg";
sendBroadcast(fileName);
b = new FileOutputStream(fileName);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);//
把数据写入文件
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
b.flush();
b.close();
} catch (IOException e) {
e.printStackTrace();
case Activity.RESULT_CANCELED:// 取消
case RESULT_LOAD_IMAGE+1:
switch (resultCode) {
case Activity.RESULT_OK: {
Uri uri = data.getData();
Cursor cursor = mActivity.getContentResolver().query(uri,
null, null, null);
cursor.moveToFirst();
String imgNo = cursor.getString(0); // 图片编号
String imgPath = cursor.getString(1); // 图片文件路径
String imgSize = cursor.getString(2); // 图片大小
String imgName = cursor.getString(3); // 图片文件名
cursor.close();
// Options options = new BitmapFactory.Options();
// options.inJustDecodeBounds =
// options.inSampleSize = 10;
// Bitmap bitmap = BitmapFactory.decodeFile(imgPath,
case Activity.RESULT_CANCELED:// 取消
最后记得加权限
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。博客分类:
在开发项目中用到这个功能,之前就按照学过的拍照和选择照片的功能,所以也没在意就写了上去,可是最后发现在有些机子里面获取到的数据时空的,所以会导致程序崩溃的情况出现,网上找了很多例子大多都是一样的,还是有问题,后来就查看跟踪了拍照后返回的数据写了下面的代码相对大多数机子是可行的,经测试还是比较靠谱的,包括拍照后图片翻转了90度问题都没问题。直接看代码:
第一:拍照选择界面:
import android.app.A
import android.content.ActivityNotFoundE
import android.content.I
import android.os.B
import android.provider.MediaS
import android.view.MotionE
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.LinearL
import android.widget.T
public class SelectPicPopupWindow extends Activity implements OnClickListener {
private Button btn_take_photo, btn_pick_photo, btn_
private LinearL
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.alert_dialog);
intent = getIntent();
btn_take_photo = (Button) this.findViewById(R.id.btn_take_photo);
btn_pick_photo = (Button) this.findViewById(R.id.btn_pick_photo);
btn_cancel = (Button) this.findViewById(R.id.btn_cancel);
layout = (LinearLayout) findViewById(R.id.pop_layout);
// 添加选择窗口范围监听可以优先获取触点,即不再执行onTouchEvent()函数,点击其他地方时执行onTouchEvent()函数销毁Activity
layout.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "提示:点击窗口外部关闭窗口!",
Toast.LENGTH_SHORT).show();
// 添加按钮监听
btn_cancel.setOnClickListener(this);
btn_pick_photo.setOnClickListener(this);
btn_take_photo.setOnClickListener(this);
// 实现onTouchEvent触屏函数但点击屏幕时销毁本Activity
public boolean onTouchEvent(MotionEvent event) {
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode != RESULT_OK) {
//选择完或者拍完照后会在这里处理,然后我们继续使用setResult返回Intent以便可以传递数据和调用
if (data.getExtras() != null)
intent.putExtras(data.getExtras());
if (data.getData()!= null)
intent.setData(data.getData());
setResult(1, intent);
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_take_photo:
//拍照我们用Action为MediaStore.ACTION_IMAGE_CAPTURE,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
} catch (Exception e) {
e.printStackTrace();
case R.id.btn_pick_photo:
//选择照片的时候也一样,我们用Action为Intent.ACTION_GET_CONTENT,
//有些人使用其他的Action但我发现在有些机子中会出问题,所以优先选择这个
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 2);
} catch (ActivityNotFoundException e) {
case R.id.btn_cancel:
第二:显示照片界面:
import android.app.A
import android.content.I
import android.graphics.B
import android.net.U
import android.os.B
import android.provider.MediaS
import android.view.V
import android.view.View.OnClickL
import android.widget.ImageV
public class MainActivity extends Activity {
private ImageV
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
photo = (ImageView) this.findViewById(R.id.text);
// 把文字控件添加监听,点击弹出自定义窗口
photo.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//使用startActivityForResult启动SelectPicPopupWindow当返回到此Activity的时候就会调用onActivityResult函数
startActivityForResult(new Intent(MainActivity.this,
SelectPicPopupWindow.class), 1);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (resultCode) {
if (data != null) {
//取得返回的Uri,基本上选择照片的时候返回的是以Uri形式,但是在拍照中有得机子呢Uri是空的,所以要特别注意
Uri mImageCaptureUri = data.getData();
//返回的Uri不为空时,那么图片信息数据都会在Uri中获得。如果为空,那么我们就进行下面的方式获取
if (mImageCaptureUri != null) {
//这个方法是根据Uri获取Bitmap图片的静态方法
image = MediaStore.Images.Media.getBitmap(this.getContentResolver(), mImageCaptureUri);
if (image != null) {
photo.setImageBitmap(image);
} catch (Exception e) {
e.printStackTrace();
Bundle extras = data.getExtras();
if (extras != null) {
//这里是有些拍照后的图片是直接存放到Bundle中的所以我们可以从这里面获取Bitmap图片
Bitmap image = extras.getParcelable("data");
if (image != null) {
photo.setImageBitmap(image);
第三:如果需要保存图片到卡或者上传图片可以用下面代码:
public static String savePicToSdcard(Bitmap bitmap, String path,
String fileName) {
String filePath = "";
if (bitmap == null) {
return fileP
filePath=path+ fileN
File destFile = new File(filePath);
OutputStream os =
os = new FileOutputStream(destFile);
bitmap.compress(CompressFormat.JPEG, 100, os);
os.flush();
os.close();
} catch (IOException e) {
filePath = "";
return fileP
上传图片的话我们可以获取bitmap的流然后上传,如上面方式获取,如要上传,上传代码自己实现,这个比较简单。
运行效果图:
(674.5 KB)
描述: 源码
下载次数: 3549
浏览 64677
图片翻转90度的问题还是有滴!OK,在这篇博文中有解答,谢谢指出。
浏览: 1350523 次
来自: 深圳
google api key v2
新的不能使用
下载下来可以直接运行,也是我想要的
辛苦楼主了
等了一天.终于下载到了
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Android调用系统相机拍照保存照片很小解决方案
时间: 22:56:52
&&&& 阅读:1614
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&保存图片小的一般操作步骤:
1. 调用系统相机
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, 1);
2. 保存照片
@Override&protected void onActivityResult(int requestCode, int resultCode, Intent data) {&&// TODO Auto-generated method stub&&super.onActivityResult(requestCode, resultCode, data);&&System.out.println("onActivityResult start");&&&&if (resultCode == Activity.RESULT_OK) {&&&System.out.println("enter");&&&&&&& String sdStatus = Environment.getExternalStorageState();& &&&&&&& if (!sdStatus.equals(Environment.MEDIA_MOUNTED)) { // 检测sd是否可用& &&&&&&&&&&& Log.i("TestFile",& &&&&&&&&&&&&&&&&&&& "SD card is not avaiable/writeable right now."); &&&&&&&&&&& System.out.println("SD card is not avaiable/writeable right now.");&&&&&&&&&&&& &&&&&&& }& &&&&&&& String name = System.currentTimeMillis() + ".jpg";;&&&& &&&&&&& //Toast.makeText(this, name, Toast.LENGTH_LONG).show();& &&&&&&& Bundle bundle = data.getExtras();& &&&&&&& Bitmap bitmap = (Bitmap) bundle.get("data");// 获取相机返回的数据,并转换为Bitmap图片格式& &&&&& &&&&&&& FileOutputStream b =& &&&&&&&&File file = new File("/mnt/sdcard/DCIM/Camera/");& &&&&&&& file.mkdirs();// 创建文件夹& &&&&&&& System.out.println("mkdirs");&&&&&&& String fileName = "/mnt/sdcard/DCIM/Camera/"+& & &&&&&&&&&&& try {& &&&&&&&&&&&&&&& b = new FileOutputStream(fileName);& &&&&&&&&&&&&&&& bitmap.compress(Bitmap.CompressFormat.JPEG, 100, b);// 把数据写入文件& &&&&&&& } catch (FileNotFoundException e) {& &&&&&&&&&&& e.printStackTrace();&&&&&&& } finally {& &&&&&&&&&&& try {& &&&&&&&&&&&&&&& b.flush();& &&&&&&&&&&&&&&& b.close();& &&&&&&&&&&& } catch (IOException e) {& &&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&& }& &&&&&&& }& &
小图片的造成的原因,从返回值中取照片的数据是已经被压缩了,要想不被压缩我们可以在调用系统相机时指定照片的保存位置
&private String camera_path = Environment.getExternalStorageDirectory().toString() + "/Photo_LJ/";//照片保存位置
&private String camera_photo_// 保存的名称
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File path1 = new File(camera_path);
if (!path1.exists()) {
path1.mkdirs();
camera_photo_name = System.currentTimeMillis() + ".jpg";
File file = new File(path1, camera_photo_name);
// mOutPutFileUri = Uri.fromFile(file);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, 1);
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case TAKE_PICTURE:
if (resultCode == RESULT_OK)
String filename = camera_path + "/" + camera_photo_
Bitmap bm = compressImageFromFile(filename);
ImageItem takePhoto = new ImageItem();
takePhoto.setBitmap(bm);
Bimp.tempSelectBitmap.add(takePhoto);
照片很大,要显示出来我们最好对它进行一下压缩
private Bitmap compressImageFromFile(String srcPath) {
BitmapFactory.Options newOpts = new BitmapFactory.Options();
newOpts.inJustDecodeBounds = false;// 只读边,不读内容
Bitmap bitmap = BitmapFactory.decodeFile(srcPath, null);
newOpts.inJustDecodeBounds = false;
int w = newOpts.outW
int h = newOpts.outH
float hh = 800f;//
float ww = 480f;//
int be = 1;
if (w & h && w & ww) {
be = (int) (newOpts.outWidth / ww);
} else if (w & h && h & hh) {
be = (int) (newOpts.outHeight / hh);
if (be &= 0)
newOpts.inSampleSize =// 设置采样率
// newOpts.inPreferredConfig = Config.ARGB_8888;//该模式是默认的,可不设
newOpts.inPurgeable = true;// 同时设置才会有效
newOpts.inInputShareable = true;// 。当系统内存不够时候图片自动被回收
bitmap = BitmapFactory.decodeFile(srcPath, newOpts);
// return compressBmpFromBmp(bitmap);//原来的方法调用了这个方法企图进行二次压缩
// 其实是无效的,大家尽管尝试
好了,可以到照片保存的位置检查一下了,已经是2M左右大小的照片了。
&标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:http://www.cnblogs.com/wicrecend/p/4865154.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!博客分类:
调用手机相机实现拍照、剪裁图片、并保存图片到手机
先看效果图:
直接上代码:
package com.liucanwen.
import java.io.F
import java.io.FileOutputS
import java.io.IOE
import android.app.A
import android.app.AlertD
import android.content.DialogI
import android.content.I
import android.graphics.B
import android.net.U
import android.os.B
import android.os.E
import android.provider.MediaS
import android.view.V
import android.view.View.OnClickL
import android.widget.ImageV
* 拍照demo
* 功能:拍照、剪裁、保存到手机上
* @author ck
* @since 日 16:04:57
public class MainActivity extends Activity implements OnClickListener
private ImageView headIv;
// 设置头像
private static final int IMAGE_REQUEST_CODE = 0; // 请求码 本地图片
private static final int CAMERA_REQUEST_CODE = 1; // 拍照
private static final int RESULT_REQUEST_CODE = 2; // 裁剪
private static final String SAVE_AVATORNAME = "head.png";// 保存的图片名
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
headIv = (ImageView) findViewById(R.id.image_layout);
headIv.setOnClickListener(this);
public void onClick(View v)
switch (v.getId())
case R.id.image_layout:
showOptionsDialog();
// 选择图片来源
private void showOptionsDialog()
String[] items = new String[] { "拍照", "选择本地图片" };
DialogInterface.OnClickListener click = new DialogInterface.OnClickListener()
public void onClick(DialogInterface dialog, int which)
switch (which)
case 0://拍照
Intent intentFromCapture = new Intent(
MediaStore.ACTION_IMAGE_CAPTURE);
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT, Uri
.fromFile(new File(Environment
.getExternalStorageDirectory(),
SAVE_AVATORNAME)));
startActivityForResult(intentFromCapture,
CAMERA_REQUEST_CODE);
case 1://选择本地图片
Intent intentFromGallery = new Intent();
intentFromGallery.setType("image/*"); // 设置文件类型
intentFromGallery.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intentFromGallery,
IMAGE_REQUEST_CODE);
new AlertDialog.Builder(this).setItems(items,
click).show();
* 回调结果处理
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode != RESULT_CANCELED)
switch (requestCode)
case IMAGE_REQUEST_CODE:
startPhotoZoom(data.getData());
case CAMERA_REQUEST_CODE:
startPhotoZoom(Uri.fromFile(new File(Environment
.getExternalStorageDirectory(), SAVE_AVATORNAME)));
case RESULT_REQUEST_CODE:
if (data != null)
getImageToView(data);
super.onActivityResult(requestCode, resultCode, data);
* 裁剪图片方法实现
public void startPhotoZoom(Uri uri)
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// 设置裁剪
intent.putExtra("crop", "true");
// aspectX aspectY 是宽高的比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
// outputX outputY 是裁剪图片宽高
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", true);
startActivityForResult(intent, RESULT_REQUEST_CODE);
* 保存裁剪之后的图片数据
private void getImageToView(Intent data)
Bundle extras = data.getExtras();
if (extras != null)
Bitmap photo = extras.getParcelable("data");
saveMyBitmap(photo); // 保存裁剪后的图片到SD
headIv.setImageBitmap(photo);
* 将头像保存在SDcard
public void saveMyBitmap(Bitmap bitmap)
File f = new File(Environment.getExternalStorageDirectory(),
SAVE_AVATORNAME);
f.createNewFile();
FileOutputStream fOut = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
fOut.flush();
fOut.close();
} catch (IOException e)
e.printStackTrace();
github源码地址:
浏览: 102554 次
来自: 广州
qindongliang1922 写道你用的啥IDE工具楼主
你用的啥IDE工具楼主
hksfho 写道你好,怎樣顯不坐標?你说的是在地图上显示坐标 ...
你好,怎樣顯不坐標?
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'&nbsp>&nbsp
&nbsp>&nbsp
android教程 &nbsp>&nbsp
Android调用系统相机拍照并存入相册
摘要:调用系统相机的方法如下:privatevoidonTakeCamera(){Stringpath=fileHandler.getCameraPath()+&SM_&+System.currentTimeMillis()+&.jpg&;tempFile=newFile(path);if(tempFile!=null){Intentintent=newIntent(MediaStore.ACTION_IMAGE_CAPTURE);inten
调用系统相机的方法如下:
private void onTakeCamera(){ String path = fileHandler.getCameraPath()+&SM_&+System.currentTimeMillis()+&.jpg&; tempFile= new File(path); if(tempFile != null){ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile)); startActivityForResult(intent, RESULT_CAMERA); }else{ showToast(&照相机初始化失败&); } }
如此,然后在onActivityResult方法中直接操作tempFile。
private void insertToMediaStore(File sourceFile){ ContentValues newValues = new ContentValues(6); String title = sourceFile.getName(); newValues.put(MediaStore.Images.Media.TITLE,title); newValues.put(MediaStore.Images.Media.DISPLAY_NAME, sourceFile.getName()); newValues.put(MediaStore.Images.Media.DATA, sourceFile.getPath()); newValues.put(MediaStore.Images.Media.DATE_MODIFIED, System.currentTimeMillis() / 1000); newValues.put(MediaStore.Images.Media.SIZE, sourceFile.length()); newValues.put(MediaStore.Images.Media.MIME_TYPE, &image/jpeg&); this.getContentResolver().insert( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, newValues); }
这里用到了ContentResolver,MediaStore,ContentValues 。
这是关于四大组件之一的内容,慢慢再来解释。
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Android调用系统相机拍照并存入相册相关信息,包括
的信息,所有Android调用系统相机拍照并存入相册相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
服务与支持
账号与支持
关注阿里云
International

我要回帖

更多关于 android 自定义相机 的文章

 

随机推荐