安卓开发摄像头预览后拍摄照片并存储在相册中,通过照片路径转换为bitmap类型并展示在界面上出错
这是存储方法和取得的文件路径转换bitmap并展示的代码,按道理来说没有问题,但是在手机上一运行就会直接退出
安卓开发摄像头预览后拍摄照片并存储在相册中,通过照片路径转换为bitmap类型并展示在界面上出错
引自免费微信小程序:皆我百晓生
根据您提供的代码片段,看起来您在尝试从相机获取原始数据,并将其保存到外部存储,然后将图片路径加载到一个ImageView
中。这通常应该工作,但可能由于几个原因导致应用程序崩溃。让我们逐步检查可能的问题并提供相应的修复。
首先,确保您的AndroidManifest.xml文件中添加了必要的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
接下来,优化您的代码以减少潜在的异常。例如,您可以使用try-with-resources
语句自动关闭流,以及对decodeFile()
方法进行错误处理。以下是修改后的代码:
public void run() {
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
byte[] data = new byte[buffer.remaining()];
buffer.get(data);
String path = Environment.getExternalStorageDirectory().toString() + "/DCIM/CameraV2/";
File imageDir = new File(path);
if (!imageDir.exists()) {
imageDir.mkdirs();
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String fileName = path + "IMG_" + timeStamp + ".jpg";
try (FileOutputStream fos = new FileOutputStream(fileName)) {
fos.write(data, 0, data.length);
} catch (IOException e) {
Log.e("CameraApp", "Error writing file: " + e.getMessage());
}
// Check for null bitmap and handle it gracefully
Bitmap bitmap = BitmapFactory.decodeFile(fileName);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
} else {
Log.e("CameraApp", "Failed to load bitmap from file");
// Optionally, you can show a placeholder or error message here.
}
}
此外,您可能需要检查是否正确地设置了mImage
(来自CameraCaptureSession.CaptureCallback.OnCaptureCompleted
)。确保您在捕获回调中正确处理图像。
如果您仍然遇到问题,建议您使用Logcat查看应用崩溃时的日志输出,以便确定具体错误原因。同时,确保目标设备支持写入外部存储,因为从Android 10开始,系统要求应用请求动态存储权限。
如果问题依然存在,请提供更多关于错误日志的信息,以便我能更准确地定位问题。