`
xindrace
  • 浏览: 98409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android照相与相片

 
阅读更多
public class ShootMainActivity extends Activity implements OnClickListener {

	// 用来标识请求照相功能的activity
	private static final int CAMERA_WITH_DATA = 3020;

	// 用来标识请求gallery的activity
	private static final int PHOTO_PICKED_WITH_DATA = 3021;

	private File mCurrentPhotoFile;// 照相机拍照得到的图片

	private int DECIDE;

	private Button mPhotoButton; // 拍照
	private Button mAlbumButton; // 相册
	private ImageView mImage;

	private Uri mImageUri;
	private Uri uri;
	private byte[] mBuffer; // 保存拍照的字节信息
	private boolean hasPic = false;

	private static final File PHOTO_DIR = new File(
			Environment.getExternalStorageDirectory() + "/DCIM/Camera");

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		initUI();

	}

	private void initUI() {
		mPhotoButton = (Button) this.findViewById(R.id.photobutton);
		mPhotoButton.setOnClickListener(this);
		mAlbumButton = (Button) this.findViewById(R.id.albumbutton);
		mAlbumButton.setOnClickListener(this);
		mImage = (ImageView) this.findViewById(R.id.image);
	}

	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.photobutton:
			doTakePhoto();
			break;

		case R.id.albumbutton:
			doPickPhotoFromGallery();
			break;
		}
	}

	// 拍照的照片存储位置
	public String getPhotoDir() {
		return Environment.getExternalStorageDirectory() + "/DCIM/Camera/1.jpg";
	}

	// 拍照获取图片
	protected void doTakePhoto() {
		PHOTO_DIR.mkdirs();
		mCurrentPhotoFile = new File(getPhotoDir());// 给新照的照片文件命名

		final Intent mIntent = getPhotoIntent(mCurrentPhotoFile);
		startActivityForResult(mIntent, CAMERA_WITH_DATA);
	}

	// 请求Gallery程序
	protected void doPickPhotoFromGallery() {
		final Intent mIntent = getPhotoAlbumIntent();
		startActivityForResult(mIntent, PHOTO_PICKED_WITH_DATA);
	}

	// 封装请求拍照的intent
	public static Intent getPhotoIntent(File f) {
		// Intent intent = new Intent("android.media.action.IMAGE_CAPTURE",
		// null);
		Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE, null);
		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
		Bundle bundle = new Bundle();
		bundle.putString("cascde", "19921231010");
		intent.putExtras(bundle);
		return intent;
	}

	// 封装请求Gallery的intent
	public static Intent getPhotoAlbumIntent() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
		intent.setType("image/*");
		// intent.putExtra("crop", "true");
		// intent.putExtra("aspectX", 1);
		// intent.putExtra("aspectY", 1);
		// intent.putExtra("outputX", 80);
		// intent.putExtra("outputY", 80);
		intent.putExtra("return-data", true);
		return intent;
	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		case CAMERA_WITH_DATA:
			imageByteData(data);
			break;
		case PHOTO_PICKED_WITH_DATA:
			imageUri(data);
			break;
		}
		imageData();
	}

	private void imageData() {
		if (!hasPic)
			return;
		else {
			switch (DECIDE) {
			case CAMERA_WITH_DATA:
				Bitmap mbBitmap = getUri2Bitmap(uri);
				// mImage.setImageURI(uri);
				mImage.setImageBitmap(mbBitmap);
				break;
			case PHOTO_PICKED_WITH_DATA:
				mImage.setImageURI(mImageUri);
				break;
			}
		}
	}

	// 将uri转成bitmap
	private Bitmap getUri2Bitmap(Uri uriTo) {
		ContentResolver resolver = getContentResolver();

		try {
			// 将图片内容解析成字节数组
			mBuffer = readStream(resolver.openInputStream(uriTo));
		} catch (Exception e) {
			e.printStackTrace();
		}
		// 将字节数组转换为ImageView可调用的Bitmap对象
		Bitmap mBitmap = getPicFromBytes(mBuffer, null);
		return mBitmap;
	}

	// 将字节数组转换为ImageView可调用的Bitmap对象
	public static Bitmap getPicFromBytes(byte[] bytes,
			BitmapFactory.Options opts) {
		if (bytes != null)
			if (opts != null)
				return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,
						opts);
			else
				return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
		return null;
	}

	// 将图片内容解析成字节数组
	public static byte[] readStream(InputStream inStream) throws Exception {
		byte[] buffer = new byte[1024];
		int len = -1;
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		while ((len = inStream.read(buffer)) != -1) {
			outStream.write(buffer, 0, len);
		}
		byte[] data = outStream.toByteArray();
		outStream.close();
		inStream.close();
		return data;
	}

	private void imageUri(Intent data) {
		mImageUri = data.getData();
		this.hasPic = true;
		this.DECIDE = PHOTO_PICKED_WITH_DATA;
	}

	public void imageByteData(Intent data) {
		if (mCurrentPhotoFile == null)
			mCurrentPhotoFile = new File(getPhotoDir());
		uri = Uri.fromFile(mCurrentPhotoFile);
		this.hasPic = true;
		this.DECIDE = CAMERA_WITH_DATA;
	}
}

 

0
0
分享到:
评论

相关推荐

    android调用照相机拍照与选择本地照片功能

    在Android应用开发中,提供用户调用照相机拍照...以上就是关于“android调用照相机拍照与选择本地照片功能”的核心知识点,开发者在实现这些功能时,需要注意优化用户体验,合理管理文件,以及遵循Android的最佳实践。

    android studio 调用相机拍照,选择相册照片

    在Android开发中,调用相机拍照和选择相册照片是常见的功能,这涉及到Android系统级别的交互和权限管理。本文将详细讲解如何在Android Studio中实现这两个功能,并将获取的图片进行存储。 首先,我们需要在...

    delphi xe6 android 调用照相机摄像头拍照片

    在使用Delphi XE6开发Android应用程序时,调用照相机功能是常见的需求,这使得用户可以直接通过应用拍摄照片。本教程将详细讲解如何在Delphi XE6中实现这一功能,无需额外的组件,只需利用系统自带的功能,确保代码...

    Android拍照与相册图片裁剪

    在Android应用开发中,"Android拍照与相册图片裁剪"是一个常见的功能需求,涉及到用户交互和权限管理等多个方面。以下将详细阐述实现这一功能的关键知识点: 1. **请求相机权限**:在Android 6.0(API级别23)及...

    Android:实现手机拍照并保存照片

    在Android平台上,实现手机拍照并保存照片涉及到一系列的步骤和技术,包括权限管理、启动相机服务、处理相机回调、保存图片到SD卡等。下面将详细解释这些知识点。 首先,我们需要在`AndroidManifest.xml`文件中添加...

    delphi xe5 android 调用照相机摄像头拍照片camera

    在使用Delphi XE5开发Android应用程序时,调用照相机功能是常见的需求,以便让用户拍摄照片并集成到应用中。本示例着重讲解如何在Delphi XE5环境下,利用Android API来实现这一功能,无需额外的组件,只通过原生代码...

    Android与js交互拍照上传资料

    本篇将深入探讨如何实现Android调用JavaScript接口启动照相机拍照,并将拍摄的照片上传至服务器。 一、Android与JavaScript交互基础 1. WebView组件:Android中的WebView是一个可以加载和显示网页内容的控件,它是...

    Android实现后台连续静默拍照

    总结,实现Android后台连续静默拍照涉及了权限管理、相机API的使用、服务的创建与管理、静音设置、图片存储以及性能优化等多个方面。开发者需要深入理解Android系统的工作原理,才能成功实现这一功能。

    android 不预览拍照 后台拍照

    在Android开发中,有时我们需要实现一些特殊的相机功能,比如不预览的拍照或者后台拍照。这些需求可能出现在一些需要高效能、低资源消耗或者隐私保护的场景。本篇将详细探讨如何实现这样的功能。 首先,要理解“不...

    Android调用Camera实现拍照--github地址

    这是github的项目源码地址。Android Studio2.3.3调用系统的Camera实现拍照功能,并将照片保存到本地内存卡中

    Android部分手机拍照后获取的图片被旋转问题的解决方法

    调用Android系统拍照功能后,三星手机拍摄后的照片被旋转了90度,横着拍给你变成竖的,竖的拍给你变成横的。其它品牌的手机都是正常的,就三星出现这个怪事。 在Android适配上,我原来一直以为国内的小米手机够奇葩...

    Android 自定义拍照实例(解决竖拍照片横向问题)

    在Android平台上,自定义拍照功能是一项常见的需求,尤其是在开发与图像处理相关的应用时。本教程将深入探讨如何解决Android拍照时出现的竖拍照片横向显示的问题。这个问题通常出现在使用SurfaceView来显示相机预览...

    android 拍照特定框内的照片,并载剪保存在本地

    在Android平台上,开发一款应用程序,实现“拍照特定框内的照片,并裁剪保存在本地”的功能,可以极大地提升用户体验,尤其适用于二维码扫描、文档拍摄等场景。这个功能涉及到多个技术点,包括相机权限管理、相机API...

    android拍照后将照片上传服务器的例子

    5. **文件存储与访问**: 在Android中,照片可能需要保存到本地,以便于上传或用户查看。通常,我们会在外部存储(如SD卡)的特定目录下创建文件,使用`Environment.getExternalStorageDirectory()`获取根目录,然后...

    android 拍照并上传图片

    通过以上步骤,我们可以实现一个完整的Android应用,它可以调用相机拍照,将图片保存到本地,然后通过HTTPServlet上传到PC端服务器。在实际项目中,还可能需要考虑错误处理、进度显示、多图上传等复杂情况。理解并...

    Android对焦拍照功能实现

    在Android应用开发中,实现对焦和拍照功能是常见的需求,尤其在开发摄影类或社交类应用时。本文将详细讲解如何在Android中实现在点击屏幕后进行对焦并拍照的功能。 首先,我们需要理解Android的相机API。Android...

    Android 照相并获得照片的URI的基本示例代码

    新鲜出炉的android照相示例,绝对好使啊! 亲测通过: android5.0 ,sony xperia ultra z. 下载的3个文件,不用做任何改动(说import和packageName的你走开),直接可以用。 resultCode,EXTRA_OUTPUT,ACTION_IMAGE_...

    androidstudio拍照与人脸识别

    在Android开发中,"androidstudio拍照与人脸识别"是一个常见的应用场景,尤其在开发涉及用户交互和安全性的应用时。本文将详细讲解如何在Android Studio中实现这个功能,主要使用Android自带的类库,不依赖任何第三...

    delphi xe5 android 调用照相机获取拍的照片

    Delphi XE5 Android 调用照相机获取拍的照片 Delphi XE5 是一款功能强大且流行的开发环境,它提供了许多优秀的功能,包括对 Android 平台的支持。在 Android 平台上,Delphi XE5 提供了许多有用的组件和 API,允许...

    android 拍照 照相机

    本文将详细解析如何实现Android拍照功能,包括切换前后置摄像头、照片预览、拍照、控制闪光灯以及调整焦距等核心知识点。 1. **切换前后置摄像头**: 在Android中,通过`Camera`类可以访问设备上的摄像头。`Camera...

Global site tag (gtag.js) - Google Analytics