转自http://blog.csdn.net/zimo2013
1.调用系统照相机
[java] view plain copy 在CODE上查看代码片派生到我的代码片
//实例化一个intent,并指定action
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//指定一个图片路径对应的file对象
uri = Uri.fromFile(ImageUtil.getImageFile());
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//启动activity
startActivityForResult(intent, REQUEST_CODE_CAMERA);
但是在onActivityResult(int requestCode, int resultCode, Intent data)代码中得到的data总为null?
2.原因分析
于是我查看了Android系统框架Camera应用程序,找到了关于系统照相机如何处理返回值data问题!
默认情况下,即不需要指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);照相机有自己默认的存储路径,拍摄的照片将返回一个缩略图。如果想访问原始图片,可以通过dat extra能够得到原始图片位置。即,如果指定了目标uri,data就没有数据,如果没有指定uri,则data就返回有数据!现在想想,这种设计还是很合理的!
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_CODE_CAMERA:
if (resultCode == RESULT_OK) {
if(data !=null){ //可能尚未指定intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
//返回有缩略图
if(data.hasExtra("data")){
Bitmap thumbnail = data.getParcelableExtra("data");
//得到bitmap后的操作
}
}else{
//由于指定了目标uri,存储在目标uri,intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
// 通过目标uri,找到图片
// 对图片的缩放处理
// 操作
}
}
}
}
3.Android系统照相机部分关键源码
[java] view plain copy 在CODE上查看代码片派生到我的代码片
// First handle the no crop case -- just return the value. If the
// caller specifies a "save uri" then write the data to it's
// stream. Otherwise, pass back a scaled down version of the bitmap
// directly in the extras.
if (mSaveUri != null) { //存在mSaveUri,即指定了目标uri
OutputStream outputStream = null;
try {
outputStream = mContentResolver.openOutputStream(mSaveUri);
outputStream.write(data);
outputStream.close();
setResult(RESULT_OK); //直接返回RESULT_OK,并没有指定intent
finish();
} catch (IOException ex) {
// ignore exception
} finally {
Util.closeSilently(outputStream);
}
} else {
Bitmap bitmap = createCaptureBitmap(data);
// 返回RESULT_OK,并包含一个Intent对象,其中Extra中科key为data,value为一个bitmap
setResult(RESULT_OK, new Intent("inline-data").putExtra("data", bitmap));
finish();
}
4.常见问题及解决办法
如果我们设置了照片的存储路径,那么很可能会遇到一下三种问题:
问题一:onActivityResult 方法中的data 返回为空(数据表明,93%的机型的data 将会是Null,所以如果我们指定了路径,就不要使用data 来获取照片,起码在使用前要做空判断)
问题二:照片无法存储,如果自定义存储路径是/mnt/sdcard/lowry/,而手机SD 卡下在拍照前没有名为lowry 的文件夹,那么部分手机拍照后图片不会保存,导致我们无法获得照片,大多数手机的相机遇到文件夹不存在的情况都会自己创建出不存在的文件夹,而个别手机却不会创建,其代表机型为:三星I8258、华为H30-T00、红米等。解决的方法就是在指定存储路径前先判断路径中的文件夹是否都存在,不存在先创建再调用相机。
问题三:照片可以存储,但是名字不对
file:///mnt/sdcard/123 1.jpg,由于Uri 的fromFile 方法会将路径中的空格用“%20”取代。其实对于大多数的手机这都不算事,手机在解析存储路径的时候都会将“%20”替换为空格,这样实际上最终的照片名字还是我们当初指定的名字:123 1.jpg,遗憾的是个别手机(如酷派7260)系统自带的相机没有将“%20”读成空格,拍照后的照片的名字是123%201.jpg,我们用路径“file:///mnt/sdcard/123 1.jpg”能找到照片才怪!!
解决办法:
(1)使用 onActivityResult 中的 intent(data)前要做空判断。
(2)指定拍照路径时,先检查路径中的文件夹是否都存在,不存在时先创建文件夹再调用相机拍照。
(3)指定拍照存储路径时,照片的命名中不要包含空格等特殊符号。
分享到:
相关推荐
在Android平台上,调用照相机拍照是常见的功能之一,它涉及到多媒体处理、用户交互以及硬件接口的使用。本文将深入探讨如何在Android应用中实现这一功能,并特别关注对焦优化。 首先,调用照相机拍照的基本流程是...
在使用Delphi XE5开发Android应用程序时,调用照相机功能是常见的需求,以便让用户拍摄照片并集成到应用中。本示例着重讲解如何在Delphi XE5环境下,利用Android API来实现这一功能,无需额外的组件,只通过原生代码...
在Android应用开发中,调用系统照相机功能是常见的需求,允许用户拍摄照片或录制视频。下面我们将深入探讨如何实现这一功能。 首先,我们需要在AndroidManifest.xml文件中添加权限,以便应用可以访问摄像头: ```...
在使用Delphi XE6开发Android应用程序时,调用照相机功能是常见的需求,这使得用户可以直接通过应用拍摄照片。本教程将详细讲解如何在Delphi XE6中实现这一功能,无需额外的组件,只需利用系统自带的功能,确保代码...
在Android开发中,调用系统自带的照相机功能是一项常见的任务,这允许用户直接通过应用程序启动设备的相机应用,拍摄照片并保存到指定位置。本文将深入探讨如何实现这一功能,包括所需的关键知识点、步骤以及可能...
在Android开发中,调用系统照相机并保存照片是一个常见的功能需求。这涉及到Android权限管理、意图(Intent)使用、照片存储以及回调处理等多个知识点。下面将详细解释这些内容。 首先,为了能够调用系统照相机,...
在Android应用开发中,提供用户调用照相机拍照和选择本地照片是常见的功能。这两个功能的实现涉及到Android系统的相机API、文件系统管理以及权限控制等多个方面。以下将详细阐述这些知识点。 1. 调用照相机拍照: ...
在Android平台上,调用系统现有的照相机功能是开发者经常遇到的需求。这主要涉及到启动相机应用以拍摄照片或录制视频,并将结果回调到自己的应用程序。在本文中,我们将深入探讨如何实现这一功能,以及可能遇到的...
在Android Studio中调用摄像头拍摄并获取条形码返回结果是一项常见的功能,它涉及到Android的相机权限、Intent机制以及第三方库的使用。本篇将详细讲解如何实现这一过程。 首先,确保你的AndroidManifest.xml文件中...
在Android开发中,调用系统照相机功能并与应用进行交互是一项常见的需求。用户拍摄照片后,我们通常需要将照片保存到本地,并可能将其转化为字符串形式以便在网络上传输或存储。以下将详细介绍如何实现这一功能。 ...
在Android开发中,调用系统照相机、相册以及上传图片是常见的功能需求,尤其在社交应用、生活服务类应用中十分常见。本教程将详细讲解如何实现这些功能。 一、调用系统照相机 1. 添加权限:首先在AndroidManifest....
在Android开发中,调用系统相册和照相机功能是常见的需求,这使得用户能够方便地选择或拍摄图片,进一步增强应用的交互性。本文将详细介绍如何实现这些功能,并提供相应的源码实例。 首先,调用系统相册的步骤如下...
在调用照相机功能时,我们将创建一个Java层的接口,然后在Qt的C++或QML部分通过JNI调用这个接口。 1. **创建Java层接口**: 在Android项目的`src/main/java`目录下,创建一个新的Java类,比如`...
在安卓(Android)开发中,调用系统相册和照相机功能是常见的需求,这能够增强应用程序的用户体验,让用户能够方便地选择或拍摄图片。这个压缩包提供的源码实例将帮助开发者了解如何实现这两个功能。 首先,让我们...
在Android平台上,开发一款应用程序能够调用照相机并实现自动对焦拍照是一项常见的需求。本文将深入探讨如何实现这一功能。 首先,我们需要了解Android中的Camera API。Camera API是Android系统提供的用于控制和...
在Android开发中,直接调用系统照相机功能是一项常见的任务,尤其在开发摄影类或社交类应用时。这个“照相机例子”展示了如何在不依赖任何第三方库的情况下,利用原生API来启动并控制设备的照相机。让我们深入探讨...
在Android开发中,调用系统相册和相机是常见的用户交互功能,这使得用户能够方便地选择或拍摄图片,进一步丰富应用的体验。本实例源码提供了如何在Android应用程序中实现这两个功能的具体方法。 首先,调用系统相册...
在Android项目的`src/main/java`目录下创建一个Java类,例如命名为`CameraService`,并定义一个用于启动照相机的接口方法。这个方法可能如下所示: ```java public class CameraService { static { System....
### Android调用照相机并解决图片过小的问题 在Android应用开发过程中,有时我们需要集成摄像头功能,以便用户能够拍摄照片并上传至应用中。然而,在实际操作中可能会遇到一个问题:通过调用系统相机所获取的照片...
Android调用系统照相机拍照与摄像的方法 Android 调用系统照相机拍照与摄像的方法是 Android 开发中一个非常重要的知识点。通过调用系统现有的照相机应用,可以拍摄照片或视频,然后对其进行处理。下面将详细介绍 ...