我目前正在使用Camera 2 API和Microsoft Cognitive-Computer Vision开发/试验“ Analzye图像应用程序”。
我没有使用普通的相机,而是使用API捕获图像,然后由Computer Vision分析位图。我在这里所做的是,我获取了捕获图像的文件路径,并使用BitmapFactory将其直接转换为Bitmap。但是我总是会遇到以下错误:
E / BitmapFactory:无法解码流:java.io.FileNotFoundException:/storage/emulated/0/IMG_20Jul2018_8112.jpg:打开失败:ENOENT(无此类文件或目录)
我可以在手机存储中看到图像,但是位图返回null。
这是我的代码:
在onCreate
内,触摸监听器(点按两次即可捕获图像)
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.getAbsolutePath());
可能是什么错误?
请在此处输入代码: Camera 2 API和 Microsoft Computer Vision
先谢谢大家!
编辑:其他信息
我已设置用户权限以同时使用相机和访问存储。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
此外,我在运行时请求了权限。请参阅here。
答案 0 :(得分:1)
在调用BitmapFactory.decodeFile之前检查文件是否存在。
还请确保您具有读/写权限。将以下内容写入清单文件。
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
出于写目的,您还应该在运行时授予api> = 23的权限。
答案 1 :(得分:0)
选择您的路径,因为解码文件()需要文件系统路径。像这样的东西行不通。
file:///storage/emulated/0/camera1/pictureblablabla.jpg
您需要类似
/storage/emulated/0/camera1/pictureblablabla.jpg