Android6.0机型上调用系统相机拍照返回的resultCode值始终等于0的问题

本文详细解析了在Android 6.0及以上版本中,调用系统相机拍照后返回resultCode值始终为0的问题。主要原因是未处理运行时权限及未创建存储目录。提供了两种解决方案:调整targetSdkVersion或实现运行时权限处理,并在拍照前创建存储目录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、正常情况下调用系统相机拍照:

如果拍照后点击的是“确定”图标,返回的resultCode = -1(Activity.RESULT_OK);
如果点击的是底部的“返回”键,返回的resultCode = 0(Activity.RESULT_CANCELED)。

2、出现问题的情况:

那么,今天碰到的在Android6.0机型上出现的调用系统相机拍照返回的resultCode的值始终等于0的问题,主要是由于以下两方面原因导致到:

2.1、没有实现运行时权限的处理

当AndroidManifest.xml文件中的Android:targetSdkVersion值大于等于23的时候,此时必须要实现运行时权限的处理,因为向SD卡读写文件的权限——android.permission.WRITE_SETTINGS属于运行时权限。

解决方案:
方案一:将AndroidManifest.xml文件中的android:targetSdkVersion值修改为小于23 ;
方案二:添加运行时权限的处理;

2.2、当指定拍照图片保存路径的时候,存储目录(文件夹)未创建

解决方案:

调用系统相机拍照之前先创建存储目录

参考:https://www.cnblogs.com/whycxb/p/6818222.html

### Android 开发调用摄像头API实现拍照功能 #### 权限声明 为了能够正常使用设备的摄像头,在应用的`AndroidManifest.xml`文件中必须声明访问相机硬件所需的权限。具体来说,需要加入以下代码片段来授予应用程序使用摄像头的权利[^2]。 ```xml <uses-permission android:name="android.permission.CAMERA"/> ``` 此外,针对Android 6.0及以上版本的操作系统,除了静态声明外还需动态向用户请求此权限。 #### 打开摄像头并拍摄照片 在Java代码层面,可以通过创建一个意图(Intent)对象并通过它启动系统相机应用来进行拍照操作。下面是一个简单的例子展示了如何做到这一点: ```java // 创建一个新的Intent实例,ACTION_IMAGE_CAPTURE表示我们要执行图像捕获动作 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE); } ``` 这段代码会触发默认的相机应用程序,并允许用户捕捉一张新图片。当用户完成拍照后,结果会被返回给原生的应用程序以便进一步处理。 #### 获取拍下的照片数据 通常情况下,我们希望保存所摄取的照片到本地存储空间内。为此可以在发起拍照前先定义好目标文件的位置以及对应的URI路径。之后再将这个URI传递给intent作为额外的数据项之一。这样做的好处是可以确保即使是在不同的制造商之间也能兼容地获得正确的文件位置。 ```java File photoFile = null; try { photoFile = createImageFile(); } catch (IOException ex) {} if (photoFile != null) { Uri photoURI = FileProvider.getUriForFile(this, "com.example.android.fileprovider", photoFile); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); } ``` 这里需要注意的是,如果要支持7.0以上版本,则应该采用`FileProvider`类提供的机制去构建安全的内容提供者URL而不是直接暴露真实的文件地址。 #### 处理拍照后的回调 最后一步就是重写`onActivityResult()`方法以接收来自外部活动的结果信息。在这个函数内部可以根据之前设定好的请求码判断是否是从我们的拍照流程返回来的响应,并据此做出相应反应,例如加载刚刚拍摄的新图显示出来等。 ```java @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){ Bundle extras = data.getExtras(); Bitmap imageBitmap = (Bitmap) extras.get("data"); // 将获取到的bitmap展示在一个ImageView组件上 imageView.setImageBitmap(imageBitmap); } } ``` 上述过程涵盖了基本的调用摄像头进行拍照功能实现要点。当然实际项目里可能还会涉及到更多细节上的优化工作,比如适配不同品牌机型间的差异、增强用户体验等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值