你好,我试图保存在我的应用程序上拍摄的照片,但当我尝试访问内存以放置数据时,会出现错误
无法解码流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
}
};
答案 0 :(得分: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
的更多信息答案 1 :(得分:4)
首先,您将图像写入的位置与您从中读取的位置不同。而不是重建path
,而是使用您已有的tmpFile
值。
其次,不要使用getRootDirectory()
来获取DCIM
目录。使用getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)
。
第三,使用Log
方法记录异常,而不是仅显示Toast
,因为您可能会错过Toast
,并且您没有获得与您的异常相关联的堆栈跟踪。
答案 2 :(得分:4)
我遇到了同样的错误,唯一的问题是android manifest中的权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
答案 3 :(得分: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);
}
}
答案 4 :(得分:0)
在Android Manifest中添加此权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
如果失败并且此权限已经存在,那么您需要检查应用的目标SDK级别。如果是targetSdkVersion =&gt; 23,然后您需要在运行时请求权限。 Here