无法解码流java.io.FileNotFoundException /storage/emulated/0 打开失败: ENOENT(没有此文件或目录)

4

你好,我正在尝试保存应用程序上拍摄的照片,但当我尝试访问内存来存储数据时,就会出现错误。

无法解码流,java.io.FileNotFoundException /storage/emulated/0 open failed:ENOENT(没有此文件或目录)

以下是我的代码。

            Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {

        public void onPictureTaken(byte[] data, Camera camera) {
            // TODO Auto-generated method stub
            if (data != null){
                //Intent mIntent = new Intent();
                //mIntent.putExtra("image",imageData);

                mCamera.stopPreview();
                mPreviewRunning = false;
                mCamera.release();

                 try{
                     BitmapFactory.Options opts = new BitmapFactory.Options();
                     Bitmap bitmap= BitmapFactory.decodeByteArray(data, 0, data.length,opts);
                     bitmap = Bitmap.createScaledBitmap(bitmap, 300, 300, false);
                     int width = bitmap.getWidth();
                     int height = bitmap.getHeight();
                     int newWidth = 300;
                     int newHeight = 300;

                     // calculate the scale - in this case = 0.4f
                     float scaleWidth = ((float) newWidth) / width;
                     float scaleHeight = ((float) newHeight) / height;

                     // createa matrix for the manipulation
                     Matrix matrix = new Matrix();
                     // resize the bit map
                     matrix.postScale(scaleWidth, scaleHeight);
                     // rotate the Bitmap
                     matrix.postRotate(-90);
                     Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                             width, height, matrix, true);
                     Camera_local_db.image.setImageBitmap(resizedBitmap);

                 }catch(Exception e){
                     e.printStackTrace();
                 }
               // StoreByteImage(mContext, imageData, 50,"ImageName");
                //setResult(FOTO_MODE, mIntent);
                setResult(585);
                finish();
            }       
        }
    };


    Camera.PictureCallback jpegCallback = new Camera. PictureCallback() {
    @Override
    public void onPictureTaken(byte[] data, Camera camera) {


        File dir_image2 = new  File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM),"dddd.jpg");
        dir_image2.mkdirs();  //AGAIN CHOOSING FOLDER FOR THE PICTURE(WHICH IS LIKE A SURFACEVIEW 
                                //SCREENSHOT)
        if (!dir_image2.mkdirs()) {
            Log.e(TAG, "Directory not created");
        }


        File tmpFile = new File(dir_image2,"TempGhost.jpg"); //MAKING A FILE IN THE PATH                 
                        //dir_image2(SEE RIGHT ABOVE) AND NAMING IT "TempGhost.jpg" OR ANYTHING ELSE
        try {//SAVING
            FileOutputStream fos = new FileOutputStream(tmpFile);
            fos.write(data);
            fos.close();
            //grabImage();
        } catch (FileNotFoundException e) {
            Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
        } catch (IOException e) {
            Toast.makeText(getApplicationContext(),"Error",Toast.LENGTH_LONG).show();
        }
        //String path = Environment.getExternalStoragePublicDirectory(    Environment.DIRECTORY_MOVIES); File file = new File(path, "/" + dir_image2);
        //String path = (Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)+  
          //      File.separator+"TempGhost.jpg");//<---

        BitmapFactory.Options options = new BitmapFactory.Options();//<---
        options.inPreferredConfig = Bitmap.Config.ARGB_8888;//<---
        bmp1 = BitmapFactory.decodeFile(tmpFile.toString(), options);//<---
        //THE LINES ABOVE READ THE FILE WE SAVED BEFORE AND CONVERT IT INTO A BitMap
        Camera_local_db.image.setImageBitmap(bmp1);
        //camera_image.setImageBitmap(bmp1); //SETTING THE BitMap AS IMAGE IN AN IMAGEVIEW(SOMETHING
                                    //LIKE A BACKGROUNG FOR THE LAYOUT)
       // TakeScreenshot();//CALLING THIS METHOD TO TAKE A SCREENSHOT

    }
    };
5个回答

8

你需要向外部存储器写入数据,确保已添加了相应的权限:

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

检查是否可用外部存储器以进行读写操作:
public boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(state)) {
        return true;
    }
    return false;
}

使用公共目录的根目录,而不是使用Android的根目录。

如果您想将公共文件保存在外部存储上,请使用getExternalStoragePublicDirectory()。

public File getAlbumStorageDir(String albumName) {
    // Get the directory for the user's public pictures directory. 
    File file = new File(Environment.getExternalStoragePublicDirectory(
            Environment.DIRECTORY_DCIM), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

如果您想保存只属于您的应用程序的文件,请使用getExternalFilesDir()函数。
public File getAlbumStorageDir(Context context, String albumName) {
    // Get the directory for the app's private pictures directory. 
    File file = new File(context.getExternalFilesDir(
            Environment.DIRECTORY_DCIM), albumName);
    if (!file.mkdirs()) {
        Log.e(LOG_TAG, "Directory not created");
    }
    return file;
}

更多关于链接的信息,请访问http://developer.android.com/training/basics/data-storage/files.html


4

我也遇到了同样的错误,唯一的问题是在Android Manifest中缺少权限。

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


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

4

首先,你正在将图像写入与读取位置不同的地方。而不是重建 path,可以使用已经存在的 tmpFile 值。

其次,不要使用 getRootDirectory() 来获取 DCIM 目录。应该使用 getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)

第三,使用 Log 方法记录异常,而不仅仅显示一个 Toast,因为你可能会错过 Toast 并且无法获取与异常相关的堆栈跟踪信息。


请查看我在以下链接的回答:https://dev59.com/FFoV5IYBdhLWcg3wc-cm#59877434 - DragonFire

3
我使用以下方法解决了这个问题:
private static final int WRITE_PERMISSION = 0x01;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    requestWritePermission();
}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    if(requestCode == WRITE_PERMISSION){
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Log.d(LOG_TAG, "Write Permission Failed");
            Toast.makeText(this, "You must allow permission write external storage to your mobile device.", Toast.LENGTH_SHORT).show();
            finish();
        }
    }
}

private void requestWritePermission(){
    if(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!=PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},WRITE_PERMISSION);
    }
}

0
将此权限添加到Android清单中。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

如果出现“权限已存在”的错误,则需要检查应用程序的目标SDK级别。如果targetSdkVersion => 23,则需要在运行时请求权限。 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接