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()します。Android 2.2 以降でのみ動作します。getPath()fromFile()fromFile()

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 に答える