BitmapFactory:无法解码流。无此文件或目录

时间:2018-07-20 13:23:23

标签: android microsoft-cognitive

我目前正在使用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 APIMicrosoft Computer Vision

先谢谢大家!

编辑:其他信息

我已设置用户权限以同时使用相机和访问存储。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

此外,我在运行时请求了权限。请参阅here

2 个答案:

答案 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