代码之家  ›  专栏  ›  技术社区  ›  metis

捕获的图像可以保存到Images文件夹,但不能保存到app文件夹

  •  0
  • metis  · 技术社区  · 7 年前

    我可以将捕获的图像保存到图片文件夹,但无法将其保存到应用程序文件夹。我为相机授予权限,并动态写入权限。我在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 回复  |  直到 7 年前
        1
  •  1
  •   CommonsWare    7 年前

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

    我猜你的意思是:

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

    第三方应用程序无法写入应用程序的 internal storage ,并且您正在通过 ACTION_IMAGE_CAPTURE .

    你可以用 FileProvider 以及 getUriForFile() 方法提供对应用程序内部存储部分的选择性访问。 This sample app 演示该技术,其中我还将写入 getFilesDir() .

    作为奖励,使用 文件提供程序 会让你摆脱那个丑陋的 StrictMode 你用来试图通过禁令的黑客 file Uri 计划。