我目前正在用Camera 2 API和微软认知计算机视觉开发/试验“Analzye图像应用程序”。
我没有使用普通的相机,而是使用API来捕捉图像,并让计算机视觉来分析位图。我在这里做的是获取捕获图像的文件路径,并使用BitmapFactory将其直接转换为位图。但是我总是犯这样的错误:
E/BitmapFactory:无法解码流:Java . io . file not found exception:/storage/emulated/0/IMG _ 20 jul 2018 _ 8112 . jpg:打开失败:ENOENT(没有这样的文件或目录)
我可以看到手机存储中的图像,但位图返回 null。
这是我的代码:
在onCreate
中,touch Listener(Doubletap捕获图像)
textureView.setOnTouchListener(new View.OnTouchListener() {
private GestureDetector gestureDetector = new GestureDetector(Camera.this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
Snackbar.make(findViewById(R.id.textureView), "Capturing...", Snackbar.LENGTH_SHORT).show();
takePicture();
//if(mBitmap == null) {
// mBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//}
// START OF COMPUTER VISION
onActivityResult();
// END OF COMPUTER VISION
return super.onDoubleTap(e);
}
// implement here other callback methods like onFling, onScroll as necessary
});
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
return true;
}
});
在takePicture()
函数内部(插入在//根据设备检查方向之后):
Date c = Calendar.getInstance().getTime();
System.out.println("Current time => " + c);
SimpleDateFormat df = new SimpleDateFormat("ddMMMyyyy");
// Generate random number
Random r = new Random();
final int currentNumber = r.nextInt((9999 - 1) + 1) + 1;
String fileName = "IMG_" + df.format(c) + "_" + currentNumber + ".jpg";
file = new File(Environment.getExternalStorageDirectory()+"/"+fileName);
//Convert Bitmap to stream
try {
Bitmap bitmap = null;
File f= new File(pathUpload);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null, options);
// Put path into bitmap
mBitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//image.setImageBitmap(bitmap);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG,100,outputStream);
ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
} catch (Exception e) {
e.printStackTrace();
}
基于错误,它处理的东西mBitmap= BitmapFactory.decodeFile(file.getAbsoltePath());
可能是什么错误?
请将代码放在这里:相机2 API和微软计算机视觉
提前谢谢你们!
编辑:附加信息
我已经设置了使用摄像头和访问存储器的用户权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
此外,我在运行时请求了权限。请参阅此处。
在调用BitmapFactory.decodeFile之前,检查文件是否存在。
还要确保您有读/写权限。在清单文件中写入以下内容。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
出于编写目的,您还应在运行时授予api权限
检查您的路径,因为decodeFile()需要一个文件系统路径。这样的东西不管用。
file:///storage/emulated/0/camera1/pictureblablabla.jpg
你需要这样的东西
/storage/emulated/0/camera1/pictureblablabla.jpg