6

我对Bitmap对象进行了一些处理(质量改进和一些调整大小),然后bitmap.compress()通过提供文件名“myfile.png”使用函数存储它。

newbitmap = processImage(bitmap);
FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE);
newbitmap.compress(CompressFormat.PNG, 100, fos);

现在我想加载这个图像,ImageView但我不能setImageBitmap()这样做。有没有其他选择?

我不能使用的原因setImageBitmap()是我正在使用一个小部件,并且当图像很大时RemoteViews使用位图方法会导致Failed Binder Transaction错误。

我尝试使用下面的代码设置图像 uri,但图像未加载到ImageView

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout);

File internalFile = context.getFileStreamPath("myfile.png");
Uri internal = Uri.fromFile(internalFile);
rv.setImageViewUri(R.id.widgetImageView, internal);
updateAppWidget(awID, rv);

谢谢你的帮助!

4

2 回答 2

2

将图像存储在内部存储器中时,您必须将模式设置为MODE_WORLD_READABLE而不是MODE_PRIVATE. 这是因为小部件由主屏幕进程处理,如果您不正确设置模式,它就无法访问您的文件。

所以替换这一行:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE);

和:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_WORLD_READABLE);

此外,使用Uri.parse()andgetPath()代替fromFile(). fromFile()仅适用于 Android 2.2 及更高版本。

Uri internal = Uri.Parse(internalFile.getPath());

希望这可以帮助!

于 2012-08-14T13:52:24.337 回答
1

使用rv.setUri(R.id.widgetImageView, "setImageURI", "file://myfile.png");而不是rv.setImageViewUri(R.id.widgetImageView, internal);似乎可以正确加载图像。您可能想尝试一下。

如果这不起作用,仍然可以选择缩小图像,以便您可以使用该setImageBitmap方法。例子:

 public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) {

 final float densityMultiplier = context.getResources().getDisplayMetrics().density;        

 int h= (int) (newHeight*densityMultiplier);
 int w= (int) (h * photo.getWidth()/((double) photo.getHeight()));

 photo=Bitmap.createScaledBitmap(photo, w, h, true);

 return photo;
 }
于 2012-08-14T07:06:01.037 回答