Путь, который вы получаете от средства выбора, - это Uri, и вы пытаетесь загрузить его как идентификатор ресурса, который является целым числом.Путь, возвращаемый функцией getData (), представляет собой либо путь к файлу непосредственно к файлу на вашей SD-карте, либо URI MediaStore.Если приложение сохраняет файл на диск и не использует методы API MediaStore для вставки его в базу данных MediaStore, вы получаете путь к файлу.В противном случае вы получите MediaStore Uri.По этой причине я использую метод-обертку, который определяет, какой он есть, и возвращает фактический путь:
public static String getRealPathFromURI(Activity activity, Uri contentUri) {
String realPath = null;
// Check for valid file path
File f = new File(contentUri.getPath());
if(f.exists())
realPath = contentUri.getPath();
// Check for valid MediaStore path
else
{
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = activity.managedQuery(contentUri, proj, null, null, null);
if(cursor != null)
{
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
realPath = cursor.getString(column_index);
cursor.close();
}
}
return realPath;
}
Как только он у меня есть, я загружаю его как поток из BitmapFactory:
ПРИМЕЧАНИЕ здесь пропущено много кода, так что вы можете что-то упустить, но это должно дать вам общий подход
FileInputStream in = null;
BufferedInputStream buffer = null;
Bitmap image = null;
try
{
in = new FileInputStream(path);
buffer = new BufferedInputStream(in);
image = BitmapFactory.decodeStream(buffer);
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(in != null)
in.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
if(buffer != null)
buffer.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}