无法在android外部文件目录中创建临时文件

时间:2014-08-13 17:08:05

标签: java android android-intent java-io

我正在关注Google's Taking Photos Simply教程,但是使用java.io.IOException: open failed: EACCES (Permission denied)创建临时文件失败了。

这是我的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  package="pricez.fastshop_android" >
    <uses-permission android:name="android.permission.RECORD_AUDIO"/>
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18"/>
    <uses-feature android:required="true" android:name="android.hardware.camera"/>
    <!-- Rest of file... -->
</manifest>

所以,我猜至少这是正确的。

以下是我的活动的相关代码:

private String mCurrentPhotoPath;
private static final int REQUEST_TAKE_PHOTO = 1;

private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "/JPEG_" + timeStamp + "_"; // I forgot from where I got this, but it was from some SO question that tried to deal with a similar problem
    File absoluteFileDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES).getAbsoluteFile(); // Same as above
    Log.i("createImageFile", "absoluteFileDir.getAbsolutePath(): " + absoluteFileDir.getAbsolutePath()); // I/createImageFile﹕ absoluteFileDir.getAbsolutePath(): /storage/sdcard/Android/data/-redacted-/files/Pictures
    File image = File.createTempFile(imageFileName, ".jpg", absoluteFileDir);
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
}

public void takePhoto(View view) {
    if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
        Toast.makeText(this, "External SD card not mounted", Toast.LENGTH_LONG).show();
        return;
    }
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        File photoFile;
        try {
            photoFile = createImageFile();
        } catch (IOException e) {
            Log.e("takePhoto", "IOException", e);
            return;
        }
        takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
        startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {
        // Get the dimensions of the View
        ImageView imgv = (ImageView)findViewById(R.id.imgPreview);
        int targetW = imgv.getWidth();
        int targetH = imgv.getHeight();
        // Get the dimensions of the bitmap
        BitmapFactory.Options bmOptions = new BitmapFactory.Options();
        bmOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        int photoW = bmOptions.outWidth;
        int photoH = bmOptions.outHeight;
        // Determine how much to scale down the image
        int scaleFactor = Math.min(photoW/targetW, photoH/targetH);
        // Decode the image file into a Bitmap sized to fill the View
        bmOptions.inJustDecodeBounds = false;
        bmOptions.inSampleSize = scaleFactor;
        bmOptions.inPurgeable = true;
        //
        Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
        imgv.setImageBitmap(bitmap);
    }
}

编辑1: 我在模拟器上运行它,SDK级别为19。

编辑2:

如果我手动删除文件夹,getExternalStorageDirectory开始正常工作。我将这个问题保持开放,因为它不是真正的修复。如果一切都在我的代码中继续工作,我将在几天后关闭。

1 个答案:

答案 0 :(得分:1)

我不知道为什么(我的猜测是文件锁中的某些东西已经默默地出错了),但是当我删除并重新创建文件夹时它开始工作(Kudos到@greenapps,会如果可以的话,请进行投票。在这一点上我能做的就是思考如何以某种方式恢复。

我不认为删除文件夹是实际的解决方案,但我必须继续前进。

另外,情况可能不会出现在实际设备中。