我正在从画廊搜索图像并显示。现在我想在onDraw(Canvas canvas)
中显示图像。我该怎么做。请帮助我。
提前致谢
selectedImageUri = data.getData();
selectedImagePath = getPath(selectedImageUri);
Toast.makeText(getBaseContext(),"selected"+selectedImagePath,Toast.LENGTH_LONG).show();
System.out.println("Image Path : " + selectedImagePath);
img.setImageURI(selectedImageUri);
这里uri selectedImageUri;
我的OnDraw(canvas Canvas)
代码:
Bitmap myBitmap1 = BitmapFactory.decodeResource(getResources(),selectedImageUri);
我的错误消息
BitmapFactory类型中的方法decodeResource(Resources,int)不适用于参数(Resources,Uri)
答案 0 :(得分:1)
您从选择器返回的路径是Uri,并且您尝试将其作为资源ID加载,这是一个int。从getData()返回的路径是直接指向SD卡上文件的文件路径或MediaStore Uri。如果应用程序将文件保存到磁盘并且未使用任何MediaStore api方法将其插入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();
}
}
}