我正在尝试从内部存储中保存和检索位图,但每次尝试加载位图时,BitMapFactory都会抛出异常:
BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: android.graphics.Bitmap@b35e414: open failed: ENOENT (No such file or directory)
我已经尝试过本网站上类似线程提供的几乎所有解决方案,但没有一个对我有用。 这个例外被抛出了4次,虽然我只读了一张图片。怎么样?
这是我用来保存和从存储中检索图像的代码。
public static void saveFile(Context context, Bitmap b, String picName) {
FileOutputStream fos;
try {
fos = context.openFileOutput(picName, Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
} catch (IOException e) {
Log.e("store DRV image", e.getMessage());
e.printStackTrace();
}
}
public static Bitmap loadBitmap(Context context, String picName) {
Bitmap b = null;
FileInputStream fis;
try {
fis = context.openFileInput(picName);
b = BitmapFactory.decodeStream(fis);
fis.close();
} catch (IOException e) {
Log.e("get stored DRV image", e.getMessage());
e.printStackTrace();
}
return b;
}
我从这个网站上的一个帖子中得到了这个代码,所有评论都很好。但它不适合我。我在Manifest中添加了权限。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
最后,我使用随机生成的UID作为文件名。 UID是使用Firebase SDK生成的。所以UID可能包含数字或其他字符
XXgKbRiS5ogQz1euqiyRsC1ggBS2
。这是一个命名文件的错误方法吗?因此会抛出异常?
答案 0 :(得分:1)
您需要添加6.0以上的用户权限:
Add library:
compile 'pub.devrel:easypermissions:0.2.1'
private String[] galleryPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};
if (EasyPermissions.hasPermissions(this, galleryPermissions)) {
pickImageFromGallery();
} else {
EasyPermissions.requestPermissions(this, "Access for storage",
101, galleryPermissions);
}
答案 1 :(得分:1)
在您的活动的onCreate()中添加此代码:
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
使用以下方法在同一活动中捕获结果:
@Override
public void onRequestPermissionsResult(int requestCode,
String permissions[], int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(getContext(), "Permission granted", Toast.LENGTH_SHORT).show();
//call your method
} else {
Toast.makeText(getContext(), "Permission denied", Toast.LENGTH_SHORT).show();
}
return;
}
// other 'case' lines to check for other
// permissions this app might request
}
}
从HERE
了解有关运行时权限的详情答案 2 :(得分:0)
//确保授予权限 //用于保存
File file=saveFile(contex,bitmap,picName);
//For fetching
File dir = new File(Environment.getExternalStorageDirectory(), picName);
BitmapFactory.decodeFile(file.getPath())
/**
* @param context
* @param b
* @param picName
*/
public static File saveFile(Context context, Bitmap b, String picName) {
FileOutputStream fos;
File dir = new File(Environment.getExternalStorageDirectory(), "My Images");
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, picName);
try {
fos = context.openFileOutput(file.getPath(), Context.MODE_PRIVATE);
b.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
} catch (IOException e) {
Log.e("store DRV image", e.getMessage());
e.printStackTrace();
}
return file;
}