位图解码文件返回null

时间:2016-06-22 04:21:26

标签: android bitmap

我使用action android.provider.MediaStore.ACTION_IMAGE_CAPTURE来捕获图像并获取图像的路径。得到路径后,我将其解码为位图。

Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath);

所有在 Device1 上运行良好,图片路径的日志如下所示:

/storage/emulated/0/Pictures/QPOS/IMG_20160622_110127_1473532607.jpg

然后我将应用运行到新设备电话 Device2 。 我在捕获图像后得到的图像路径:

/storage/emulated/0/Pictures/QPOS/IMG_20160622_105436_2068195440.jpg

看起来很正常。但是,decode方法在此行返回一个空位图

Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath);

我不知道为什么两个设备之间有不同,我建立在相同的源代码上。 你能解释为什么我得到方法解码文件的空位图吗?以及如何解决这个问题?感谢。

更新: 我通过以下方法添加API 23的请求权限:

private void requestPermissions() {
        Log.d("binh", "request Permision");
        if (Build.VERSION.SDK_INT >= 23) {
            List<String> permissionRequestList = new ArrayList<>();

            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionRequestList.add(android.Manifest.permission.CAMERA);
            }

            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionRequestList.add(android.Manifest.permission.ACCESS_FINE_LOCATION);
            }

            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionRequestList.add(android.Manifest.permission.READ_EXTERNAL_STORAGE);
            }

            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionRequestList.add(android.Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }

            if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE)
                    != PackageManager.PERMISSION_GRANTED) {
                permissionRequestList.add(android.Manifest.permission.READ_PHONE_STATE);
            }

            if (permissionRequestList.size() > 0) {
                ActivityCompat.requestPermissions(this, permissionRequestList.toArray(new String[permissionRequestList.size()]), Constants.REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            }
        }
    }

这是为图像创建路径的代码:

private File setUpPhotoFile() throws IOException {
        File f = createImageFile();
        currentPhotoPath = f.getAbsolutePath();
        return f;
    }

    private File createImageFile() throws IOException {
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
        String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
        File albumF = getAlbumDir();
        File imageF = File.createTempFile(imageFileName, JPEG_FILE_SUFFIX, albumF);
        return imageF;
    }

    private File getAlbumDir() {
        File storageDir = null;
        if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) {
            //storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), getString(R.string.app_name));
            storageDir = new File(
                    getExternalFilesDir(Environment.DIRECTORY_PICTURES), getString(R.string.app_name));
            if (storageDir != null) {
                if (!storageDir.mkdirs()) {
                    if (!storageDir.exists()) {
                        Log.d("CameraSample", "failed to create directory");
                        return null;
                    }
                }
            }
        } else {
            Log.d(getString(R.string.app_name), "External storage is not mounted READ/WRITE.");
        }


        return storageDir;
    }

在构建并授予对话权限后,我遇到了同样的问题。

2 个答案:

答案 0 :(得分:0)

这似乎是alpha通道的问题,所以你应该使用保留alpha的位图格式:

检查以下代码:

  BitmapFactory.Options options = new BitmapFactory.Options();
  options.inPreferredConfig = Bitmap.Config.ARGB_8888;
  Bitmap photoBitmap = BitmapFactory.decodeFile(currentPhotoPath, options);

答案 1 :(得分:0)

可能是您的 Device1 的Android sdk&lt; 23 和 Device2 的Android sdk == 23 请检查是否根据Android Sdk 23(在运行时需要)管理READ_EXTERNAL_STORAGE权限。

相关问题