我尝试保存位图,但该行outStream = new FileOutputStream(file);
总是抛出错误java.io.FileNotFoundException: /storage/emulated/0/inpaint/card.png: open failed: ENOENT (No such file or directory)
。
//Save bitmap
InputStream inputStream = null;
try {
inputStream = getContentResolver().openInputStream(uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Bitmap bmp = BitmapFactory.decodeStream(inputStream);
File f3=new File(Environment.getExternalStorageDirectory()+"/inpaint/");
if(!f3.exists())
f3.mkdirs();
OutputStream outStream = null;
File file = new File(Environment.getExternalStorageDirectory() + "/inpaint/"+"card"+".png");
try {
outStream = new FileOutputStream(file);
bmp.compress(Bitmap.CompressFormat.PNG, 90, outStream);
outStream.close();
Toast.makeText(getApplicationContext(), "Saved", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
}
我还添加了
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
到清单。
如果您的设备包含棉花糖,请授予权限 运行时间 :
private static final int PERMISSION_REQUEST_CODE = 1;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
== PackageManager.PERMISSION_DENIED) {
Log.d("permission", "permission denied to WRITE_EXTERNAL_STORAGE - requesting it");
String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};
requestPermissions(permissions, PERMISSION_REQUEST_CODE);
}
}
在下面的方法中传递位图:
public void CaptureImage(Bitmap bitmap) {
try {
File imageFile;
File dir;
dir = new File(Environment.getExternalStorageDirectory(), "FolderName");
boolean success = true;
if (!dir.exists()) {
success = dir.mkdirs();
}
if (success) {
java.util.Date date = new java.util.Date();
imageFile = new File(dir.getAbsolutePath()
+ File.separator
+ new java.sql.Timestamp(date.getTime()).toString()
+ "Image.jpg");
imageFile.createNewFile();
} else {
return;
}
ByteArrayOutputStream ostream = new ByteArrayOutputStream();
// save image into gallery
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, ostream);
FileOutputStream fout = new FileOutputStream(imageFile);
fout.write(ostream.toByteArray());
fout.close();
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATE_TAKEN,
System.currentTimeMillis());
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.MediaColumns.DATA,
imageFile.getAbsolutePath());
} catch (Exception e) {
e.printStackTrace();
}
}
您可以应用以下代码 -
final int MyVersion = Build.VERSION.SDK_INT;
if (MyVersion > Build.VERSION_CODES.LOLLIPOP_MR1) {
if (!checkIfAlreadyhavePermission()) {
ActivityCompat.requestPermissions(YourActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
} else {
your_method();
}
} else {
your_method();
}
private void your_code(){
//Your entire code will go here
}
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
// If request is cancelled, the result arrays are empty.
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
your_method();
} else {
Toast.makeText(getApplicationContext(), "Please provide access to external storage", Toast.LENGTH_LONG).show();
}
break;
}
}
}
我想你和我有同样的问题。在 android 版本 23 或更高版本中,您需要在代码中向用户请求额外的存储权限。详情请见以下链接。
http://www.androidhowtocode.com/2017/01/javaiofilenotfoundexception.html
以下一行将图像保存在图片文件夹中,并将位图传递到下面:
MediaStore.Images.Media.insertImage(getApplicationContext().getContentResolver(), bitmap, "Detect Image", ");