捕获的图像可以保存到图像文件夹,但不能保存到应用程序文件夹

时间:2018-08-04 14:46:19

标签: android file android-bitmap

我可以将捕获的图像保存到“图片”文件夹,但是无法将其保存到应用程序文件夹。我授予摄像机权限并动态写入权限。我在manifests.xml中写入了读写摄像头权限。我在调试模式下检查了权限。权限没有问题。

相机活动开始,我拍照,然后单击“确定”。然后在onActivityResult()中我检查了图像文件的大小。它是零字节。图片文件存在,但长度为零。

这是我检索图像路径的方式:

public static File getImageFile(Context context, int food_id) {
    try {
        //File storageDir = new File(context.getFilesDir().getAbsolutePath() + File.separator + IMAGES_DIRECTORY);    // not works !!!!!!!!!
        File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString() + File.separator + IMAGES_DIRECTORY); // works
        if (!storageDir.exists()) {
            storageDir.mkdirs();
        }

        File photoFile = new File(storageDir.getAbsolutePath() + File.separator + food_id + ".jpg");

       /* if(!photoFile.exists())
            photoFile.createNewFile();*/

        return photoFile;
    } catch (Exception ex) {
        ex.printStackTrace();
        return null;
    }
}

if (Build.VERSION.SDK_INT >= 23) {
    hasPermissionCamera = ContextCompat.checkSelfPermission(FoodDetailsActivity.this, Manifest.permission.CAMERA);

    if (hasPermissionCamera != PackageManager.PERMISSION_GRANTED) {
        if (shouldShowRequestPermissionRationale(Manifest.permission.CAMERA)) { 
            getErrorDialog(getString(R.string.permission_error_dialog_camera), FoodDetailsActivity.this, true).show();
        } else { 
            requestPermissions(new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_ASK_PERMISSIONS_CAMERA);
        }
    } else { // open camera
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (cameraIntent.resolveActivity(getPackageManager()) != null)  // intent düzgün mü diye kontrol eder.
        {

            File photoFile = AppUtil.getImageFile(FoodDetailsActivity.this,food_id);  

            if (photoFile != null) {
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
                StrictMode.setVmPolicy(builder.build());
                startActivityForResult(cameraIntent, REQUEST_IMAGE_CAPTURE);
            }
        } else {

        }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentx) {
    super.onActivityResult(requestCode, resultCode, intentx);
   if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
        File imageFile = AppUtil.getImageFile(this,food_id);
        try {
            mImageBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath());  // mImageBitmap is null here. imageFile exists.
            Log.d("eeffs","size : " + imageFile.length() + " - exists() : " + imageFile.exists()); exists return true. length is zero

            int widthBitmap = mImageBitmap.getWidth();  // exception here because bitmap is null
            ...
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

  

我无法将其保存到应用文件夹

我猜你是说:

File storageDir = new File(context.getFilesDir().getAbsolutePath() + File.separator + IMAGES_DIRECTORY);    // not works !!!!!!!!!

第三方应用无法写入您的应用internal storage中的部分,而您正在通过ACTION_IMAGE_CAPTURE调用第三方相机应用。

您可以使用FileProvider及其getUriForFile()方法来提供对应用程序内部存储部分的选择性访问。 This sample app演示了该技术,我还写了getFilesDir()内的某个位置。

作为奖励,使用FileProvider可以使您摆脱试图摆脱StrictMode file禁令的丑陋Uri方案。