BitmapFactory:无法解码流:java.io.FileNotFoundException,即使文件实际存在
我正在创建一个简单的应用程序来拍照。这是我的密码BitmapFactory:无法解码流:java.io.FileNotFoundException,即使文件实际存在,java,android,Java,Android,我正在创建一个简单的应用程序来拍照。这是我的密码 Button b1; ImageView iv; String TAG = "MAIN ACTIVITY"; File photo; private Uri mImageUri; private File createTemporaryFile(String part, String ext) throws Exception { File externalStorageDirectory = Environment.getEx
Button b1;
ImageView iv;
String TAG = "MAIN ACTIVITY";
File photo;
private Uri mImageUri;
private File createTemporaryFile(String part, String ext) throws Exception {
File externalStorageDirectory = Environment.getExternalStorageDirectory();
File tempDir = new File(externalStorageDirectory + "/cameratest/");
if (!tempDir.exists()) {
tempDir.mkdir();
}
return File.createTempFile(part, ext, tempDir);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (Button) findViewById(R.id.button);
iv = (ImageView) findViewById(R.id.imageView);
b1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
try {
// place where to store camera taken picture
photo = createTemporaryFile("picture", ".jpg");
photo.delete();
} catch (Exception e) {
Log.v(TAG, "Can't create file to take picture!");
Toast.makeText(getApplicationContext(), "Please check SD card! Image shot is impossible!",
Toast.LENGTH_SHORT).show();
}
mImageUri = Uri.fromFile(photo);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
startActivityForResult(intent, 0);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 0 && resultCode == RESULT_OK) {
Log.d(TAG, mImageUri.toString());
Bitmap bitmap = BitmapFactory.decodeFile(mImageUri.toString());
iv.setImageBitmap(bitmap);
}
}
如您所见,我添加了eLog.d(标记,mimageri.toString())
在结尾和logcat(以及文件NotFoundException
)中,我看到了以下目录:
03-27 00:43:30.498 30526-30526/myapplication.example.falcoleo.cameratest1 D/MAIN ACTIVITY: file:///storage/emulated/0/cameratest/picture459838058.jpg
03-27 00:43:30.499 30526-30526/myapplication.example.falcoleo.cameratest1 E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: file:/storage/emulated/0/cameratest/picture459838058.jpg: open failed: ENOENT (No such file or directory)
猜猜这个目录是否存在?
斯波勒警报。而且图像不是在位图工厂.decodeFile
之后创建的。我真的不明白我做错了什么。一切正常,除非它实际上必须显示照片,然后它就不显示了。一片空白。就像WTF m8一样,我只是想做好我的工作,不必发疯,你知道的
file:///storage/emulated/0/cameratest/picture459838058.jpg
删除文件://
,因为decodeFile()需要文件系统路径
/storage/emulated/0/cameratest/picture459838058.jpg
将
mimageri.toString()
替换为mimageri.getPath()
decodeFile
需要路径,而不是uri字符串。使用BitmapFactory.decodeStream而不是BitmapFactory.decodeFile
try ( InputStream is = new URL( file_url ).openStream() ) {
Bitmap bitmap = BitmapFactory.decodeStream( is );
}
Source对我来说,是文件路径错误,所以我需要获取真实的文件路径 首先
File file = new File(getPath(uri));
public String getPath (Uri uri)
{
String[] projection = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(uri,
projection,
null,
null,
null);
if (cursor == null)
return null;
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
String s = cursor.getString(column_index);
cursor.close();
return s;
}
然后返回Uri
Uri newUri = Uri.fromFile(file);
这种对文件和uri的转换为我带来了好处。我从action.SEND收到了简单的数据。您确定您有权限在外部内存中读/写吗?我有权限确保它正常工作。我使用了
string.replace(“文件://”,“”)
是否有更优雅的解决方案?有许多其他复杂的系统可以获取文件路径,但这是一些人可能需要遵循的方向。。。我只是发布了一个简单的(从其他地方复制和粘贴)以简单的方式展示我的观点